クラス MimeUtility
- java.lang.ObjectSE
-
- jakarta.mail.internet.MimeUtility
public class MimeUtility extends ObjectSE
これは、さまざまな MIME 関連機能を提供するユーティリティクラスです。RFC 2047 に従って MIME ヘッダーをエンコードおよびデコードする一連のメソッドがあります。一般に、
setSubject
やsetRecipients
などのメソッドを使用する場合、これらのメソッドは必要ないことに注意してください。Jakarta Mail は、これらの「より高いレベル」の方法を使用すると、データを自動的にエンコードおよびデコードします。以下のメソッドは、setHeader
およびgetHeader
メソッドを使用して未加工の MIME ヘッダーを操作する場合にのみ必要です。このようなヘッダーの処理に関する簡単な説明を以下に示します。RFC 822 メールヘッダーに は、US-ASCII 文字のみを含める必要があります。US-ASCII 以外の文字を含むヘッダーは、US-ASCII 文字のみを含むようにエンコードする必要があります。基本的に、このプロセスでは、BASE64 または QP を使用して特定の文字をエンコードします。RFC 2047 はこれについて詳しく説明しています。
Java では、文字列には(16 ビット)Unicode 文字が含まれます。ASCII は Unicode のサブセットです(0 - 127 の範囲を占めます)。ASCII 文字のみを含む文字列は、すでにメールセーフです。文字列に US-ASCII 以外の文字が含まれている場合は、エンコードする必要があります。このステップでさらに複雑になるのは、Unicode がまだ広く使用されている文字セットではないため、最初に文字列を別の文字セットに文字セットエンコードし、次に転送エンコードを実行する場合です。
メールセーフ文字列の実際のバイトを取得するには(たとえば、SMTP 経由で送信するため)、次のことを行う必要があることに注意してください。
byte[] bytes = string.getBytes("iso-8859-1");
MimeMessage および MimeBodyPart の
setHeader
およびaddHeader
メソッドは、指定されたヘッダー値が US-ASCII 文字のみを含む Unicode 文字列であると想定しています。これらのメソッドの呼び出し元は、渡される値に US-ASCII 以外の文字が含まれていないことを確認する必要があります。このクラスのメソッドは、これを行うのに役立ちます。MimeMessage および MimeBodyPart の
getHeader
ファミリーのメソッドは、未加工のヘッダー値を返します。これらは RFC 2047 に従ってエンコードされる場合があり、エンコードされる場合は、Unicode 文字列にデコードする必要があります。このクラスのメソッドは、これを行うのに役立ちます。いくつかのシステムプロパティは、MIME 仕様への厳密な準拠を制御します。これらはセッションプロパティではないが、システムプロパティとしてグローバルに設定する必要があることに注意してください。
mail.mime.decodetext.strict
プロパティは、MIME エンコードされた単語のデコードを制御します。MIME 仕様では、エンコードされた単語は空白で区切られた単語の先頭から始まる必要があります。一部のメーラーでは、エンコードされた単語が単語の途中に誤って含まれています。mail.mime.decodetext.strict
システムプロパティが"false"
に設定されている場合、これらの不正なエンコードされた単語をデコードしようとします。デフォルトは true です。mail.mime.encodeeol.strict
プロパティは、型が「テキスト」ではない MIME パーツの Content-Transfer-Encoding の選択を制御します。多くの場合、このような部分にはテキストデータが含まれ、通常の行末規則を可能にするエンコーディングが適切です。まれに、そのような部分に完全にテキストデータが含まれているように見えますが、CR および LF 文字を変更せずに保持するエンコードが必要になります。mail.mime.encodeeol.strict
システムプロパティが"true"
に設定されている場合、そのようなエンコーディングが必要なときに使用されます。デフォルトは false です。さらに、
mail.mime.charset
システムプロパティを使用して、エンコードされた単語およびテキストパーツに使用するデフォルトの MIME 文字セットを指定できます。通常、デフォルトの MIME 文字セットは、file.encoding
システムプロパティで指定されているデフォルトの Java 文字セットから派生します。ほとんどのアプリケーションでは、デフォルトの MIME 文字セットを明示的に設定する必要はありません。メールメッセージに使用されるデフォルトの MIME 文字セットが、システムに保存されているファイルに使用される文字セットと異なる場合は、このプロパティを設定する必要があります。現在の実装では、次の System プロパティもサポートされています。
mail.mime.ignoreunknownencoding
プロパティは、decode
メソッドに渡されたContent-Transfer-Encoding
ヘッダーの不明な値が例外を引き起こすかどうかを制御します。"true"
に設定すると、不明な値は無視され、8 ビットエンコーディングが想定されます。それ以外の場合、不明な値により MessagingException がスローされます。- 作成者:
- John Mani, Bill Shannon
フィールドサマリー
フィールド 修飾子と型 フィールド 説明 static int
ALL
メソッドのサマリー
すべてのメソッド 静的メソッド 具象メソッド 修飾子と型 メソッド 説明 static InputStreamSE
decode(InputStreamSE is, StringSE encoding)
指定された入力ストリームをデコードします。static StringSE
decodeText(StringSE etext)
「非構造化」ヘッダー、つまり RFC 822 に従って "* text" として定義されているヘッダーをデコードします。static StringSE
decodeWord(StringSE eword)
文字列は、「エンコードされた単語」を解析するための RFC 2047 および RFC 2231 のルールを使用して解析されます。static OutputStreamSE
encode(OutputStreamSE os, StringSE encoding)
指定された出力ストリームをエンコーダーでラップします。static OutputStreamSE
encode(OutputStreamSE os, StringSE encoding, StringSE filename)
指定された出力ストリームをエンコーダーでラップします。static StringSE
encodeText(StringSE text)
RFC 2047 に従って、RFC 822「テキスト」トークンをメールセーフ形式にエンコードします。static StringSE
encodeText(StringSE text, StringSE charset, StringSE encoding)
RFC 2047 に従って、RFC 822「テキスト」トークンをメールセーフ形式にエンコードします。static StringSE
encodeWord(StringSE word)
RFC 2047 に従って、RFC 822「ワード」トークンをメールセーフ形式にエンコードします。static StringSE
encodeWord(StringSE word, StringSE charset, StringSE encoding)
RFC 2047 に従って、RFC 822「ワード」トークンをメールセーフ形式にエンコードします。static StringSE
fold(int used, StringSE s)
可能であれば、各行が 76 文字を超えないように、文字列を空白文字で折り返します。static byte[]
getBytes(InputStreamSE is)
static byte[]
getBytes(StringSE s)
static StringSE
getDefaultJavaCharset()
システムの現在のデフォルトロケールに対応するデフォルトの文字セットを取得します。static StringSE
getEncoding(DataHandler dh)
InputStream
からデータを読み取る代わりにwriteTo
メソッドを使用してデータを検査することを除いて、getEncoding(DataSource)
と同じです。static StringSE
getEncoding(DataSource ds)
メールを安全にするために、この DataSource の入力ストリームに適用する必要がある Content-Transfer-Encoding を取得します。static StringSE
javaCharset(StringSE charset)
MIME 文字セット名を有効な Java 文字セット名に変換します。static StringSE
mimeCharset(StringSE charset)
java 文字セットを MIME 文字セット名に変換します。static StringSE
quote(StringSE word, StringSE specials)
単語に指定された「スペシャル」リストの文字が含まれている場合に、単語を引用するユーティリティメソッド。static StringSE
unfold(StringSE s)
折りたたまれたヘッダーを展開します。
フィールドの詳細
ALL
public static final int ALL
- 関連事項:
- 定数フィールド値
メソッドの詳細
getEncoding
public static StringSE getEncoding(DataSource ds)
メールを安全にするために、この DataSource の入力ストリームに適用する必要がある Content-Transfer-Encoding を取得します。ここで使用されるアルゴリズムは次のとおりです。
- DataSource が
EncodingAware
を実装している場合は、使用するエンコーディングを確認してください。null 以外を返す場合は、その値を返します。 - このデータソースのプライマリ型が「テキスト」で、入力ストリームのすべてのバイトが US-ASCII の場合、エンコーディングは StreamProvider.BIT7_ENCODER です。バイトの半分以上が非 US-ASCII である場合、エンコーディングは StreamProvider.BASE_64_ENCODER です。バイトの半分未満が非 US-ASCII である場合、エンコーディングは StreamProvider.QUOTED_PRINTABLE_ENCODER です。
- このデータソースのプライマリ型が「テキスト」でない場合、その入力ストリームのすべてのバイトが US-ASCII の場合、エンコーディングは StreamProvider.BIT7_ENCODER です。非 US-ASCII 文字が 1 つでもある場合、エンコーディングは StreamProvider.BASE_64_ENCODER です。
- パラメーター:
ds
- DataSource- 戻り値:
- エンコーディング。これは、StreamProvider.BIT7_ENCODER、StreamProvider.QUOTED_PRINTABLE_ENCODER、または StreamProvider.BASE_64_ENCODER のいずれかです。
- DataSource が
getEncoding
public static StringSE getEncoding(DataHandler dh)
getEncoding(DataSource)
と同じですが、InputStream
からデータを読み取る代わりに、writeTo
メソッドを使用してデータを検査する点が異なります。これは、すべての I/O がこのスレッドで行われるため、オブジェクトと MIME 型(たとえば、"text/plain" 文字列)で作成されたDataHandler
の一般的なケースでより効率的です。InputStream
が必要な場合、DataHandler
はスレッド、パイプストリームのペア、writeTo
メソッドを使用してデータを生成します。- パラメーター:
dh
- DataHandler- 戻り値:
- Content-Transfer-Encoding
- 導入:
- JavaMail 1.2
decode
public static InputStreamSE decode(InputStreamSE is, StringSE encoding) throws MessagingException
指定された入力ストリームをデコードします。返される入力ストリームは、デコードされた入力ストリームです。ここでは、RFC 2045 で定義されているすべてのエンコーディングがサポートされています。それらには、StreamProvider.BASE_64_ENCODER、StreamProvider.QUOTED_PRINTABLE_ENCODER、StreamProvider.BIT7_ENCODER、StreamProvider.BIT8_ENCODER、および StreamProvider.BINARY_ENCODER が含まれます。さらに、StreamProvider.UU_ENCODER もサポートされています。現在の実装では、
mail.mime.ignoreunknownencoding
システムプロパティが"true"
に設定されている場合、不明なエンコード値は無視され、元の InputStream が返されます。- パラメーター:
is
- 入力ストリームencoding
- ストリームのエンコーディング。- 戻り値:
- デコードされた入力ストリーム。
- 例外:
MessagingException
- エンコーディングが不明な場合
encode
public static OutputStreamSE encode(OutputStreamSE os, StringSE encoding) throws MessagingException
指定された出力ストリームにエンコーダをラップします。ここでは、RFC 2045 で定義されているすべてのエンコーディングがサポートされています。それらには、StreamProvider.BASE_64_ENCODER、StreamProvider.QUOTED_PRINTABLE_ENCODER、StreamProvider.BIT7_ENCODER、StreamProvider.BIT8_ENCODER、および StreamProvider.BINARY_ENCODER が含まれます。さらに、StreamProvider.UU_ENCODER もサポートされています。- パラメーター:
os
- 出力ストリームencoding
- ストリームのエンコーディング。- 戻り値:
- 指定されたエンコーディングを適用する出力ストリーム。
- 例外:
MessagingException
- エンコーディングが不明な場合
encode
public static OutputStreamSE encode(OutputStreamSE os, StringSE encoding, StringSE filename) throws MessagingException
指定された出力ストリームにエンコーダをラップします。ここでは、RFC 2045 で定義されているすべてのエンコーディングがサポートされています。それらには、StreamProvider.BASE_64_ENCODER、StreamProvider.QUOTED_PRINTABLE_ENCODER、StreamProvider.BIT7_ENCODER、StreamProvider.BIT8_ENCODER、および StreamProvider.BINARY_ENCODER が含まれます。さらに、StreamProvider.UU_ENCODER もサポートされています。filename
パラメーターは StreamProvider.UU_ENCODER エンコーディングで使用され、エンコードされた出力に含まれます。- パラメーター:
os
- 出力ストリームencoding
- ストリームのエンコーディング。filename
- エンコードされるファイルの名前 (uuencode でのみ使用されます)- 戻り値:
- 指定されたエンコーディングを適用する出力ストリーム。
- 例外:
MessagingException
- 不明なエンコーディングの場合- 導入:
- JavaMail 1.2
encodeText
public static StringSE encodeText(StringSE text) throws UnsupportedEncodingExceptionSE
RFC 2047 に従って、RFC 822「テキスト」トークンをメールセーフ形式にエンコードします。指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初にプラットフォームのデフォルトの文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
このメソッドは、「非構造化」RFC 822 ヘッダーのみをエンコードするために使用する必要があることに注意してください。
使用例:
MimePart part = ... String rawvalue = "FooBar Mailer, Japanese version 1.1" try { // If we know for sure that rawvalue contains only US-ASCII // characters, we can skip the encoding part part.setHeader("X-mailer", MimeUtility.encodeText(rawvalue)); } catch (UnsupportedEncodingException e) { // encoding failure } catch (MessagingException me) { // setHeader() failure }
- パラメーター:
text
- Unicode 文字列- 戻り値:
- US-ASCII 文字のみを含む Unicode 文字列
- 例外:
UnsupportedEncodingExceptionSE
- エンコードが失敗した場合
encodeText
public static StringSE encodeText(StringSE text, StringSE charset, StringSE encoding) throws UnsupportedEncodingExceptionSE
RFC 2047 に従って、RFC 822「テキスト」トークンをメールセーフ形式にエンコードします。指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初に指定された文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
このメソッドは、「非構造化」RFC 822 ヘッダーのみをエンコードするために使用する必要があることに注意してください。
- パラメーター:
text
- ヘッダー値charset
- 文字セット。このパラメーターが null の場合、プラットフォームのデフォルトのチャットセットが使用されます。encoding
- 使用するエンコーディング。現在サポートされている値は "B" と "Q" です。このパラメーターが null の場合、エンコードされる文字のほとんどが ASCII 文字セットにある場合は "Q" エンコーディングが使用され、それ以外の場合は "B" エンコーディングが使用されます。- 戻り値:
- US-ASCII 文字のみを含む Unicode 文字列
- 例外:
UnsupportedEncodingExceptionSE
- 文字セット変換が失敗した場合。
decodeText
public static StringSE decodeText(StringSE etext) throws UnsupportedEncodingExceptionSE
「非構造化」ヘッダー、つまり RFC 822 に従って "* text" として定義されているヘッダーをデコードします。文字列は、RFC 2047、セクション 6.1 で指定されたアルゴリズムを使用してデコードされます。シーケンスの文字セット変換が失敗すると、UnsupportedEncodingException がスローされます。文字列が RFC 2047 スタイルでエンコードされたヘッダーでない場合は、そのまま返されます
使用例:
MimePart part = ... String rawvalue = null; String value = null; try { if ((rawvalue = part.getHeader("X-mailer")[0]) != null) value = MimeUtility.decodeText(rawvalue); } catch (UnsupportedEncodingException e) { // Don't care value = rawvalue; } catch (MessagingException me) { } return value;
- パラメーター:
etext
- エンコードされている可能性のある値- 戻り値:
- デコードされたテキスト
- 例外:
UnsupportedEncodingExceptionSE
- 文字セット変換が失敗した場合。
encodeWord
public static StringSE encodeWord(StringSE word) throws UnsupportedEncodingExceptionSE
RFC 2047 に従って、RFC 822「ワード」トークンをメールセーフ形式にエンコードします。指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初にプラットフォームのデフォルトの文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
このメソッドは、RFC 822「フレーズ」を作成するときに使用することを目的としています。たとえば、InternetAddress クラスは、これを使用して「フレーズ」コンポーネントをエンコードします。
- パラメーター:
word
- Unicode 文字列- 戻り値:
- US-ASCII 文字のみを含む Unicode 文字列の配列。
- 例外:
UnsupportedEncodingExceptionSE
- エンコードが失敗した場合
encodeWord
public static StringSE encodeWord(StringSE word, StringSE charset, StringSE encoding) throws UnsupportedEncodingExceptionSE
RFC 2047 に従って、RFC 822「ワード」トークンをメールセーフ形式にエンコードします。指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初に指定された文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
- パラメーター:
word
- Unicode 文字列charset
- MIME 文字セットencoding
- 使用するエンコーディング。現在サポートされている値は "B" と "Q" です。このパラメーターが null の場合、エンコードされる文字のほとんどが ASCII 文字セットにある場合は "Q" エンコーディングが使用され、それ以外の場合は "B" エンコーディングが使用されます。- 戻り値:
- US-ASCII 文字のみを含む Unicode 文字列
- 例外:
UnsupportedEncodingExceptionSE
- エンコードが失敗した場合
decodeWord
public static StringSE decodeWord(StringSE eword) throws ParseException, UnsupportedEncodingExceptionSE
文字列は、「エンコードされた単語」を解析するための RFC 2047 および RFC 2231 のルールを使用して解析されます。解析が失敗すると、ParseException がスローされます。それ以外の場合は、転送デコードされ、Unicode に文字セット変換されます。文字セット変換が失敗すると、UnsupportedEncodingException がスローされます。- パラメーター:
eword
- エンコードされた値- 戻り値:
- デコードされた単語
- 例外:
ParseException
- 文字列が RFC 2047 および RFC 2231 のようにエンコードされた単語でない場合。UnsupportedEncodingExceptionSE
- 文字セット変換が失敗した場合。
quote
public static StringSE quote(StringSE word, StringSE specials)
単語に指定された「スペシャル」リストの文字が含まれている場合に、単語を引用するユーティリティメソッド。HeaderTokenizer
クラスは、MIME と RFC 822 の 2 つの特別な区切り文字セットを定義します。この方法は通常、RFC 822 および MIME ヘッダーフィールドの生成中に使用されます。
- パラメーター:
word
- 引用する単語specials
- 特殊文字のセット- 戻り値:
- 引用されている可能性のある単語
- 関連事項:
HeaderTokenizer.MIME
,HeaderTokenizer.RFC822
fold
public static StringSE fold(int used, StringSE s)
可能であれば、各行が 76 文字を超えないように、文字列を空白文字で折り返します。76 個を超える非空白文字が連続して存在する場合、文字列はそのシーケンスの後の最初の空白で折り返されます。パラメーターused
は、現在の行で使用されている文字数を示します。通常はヘッダー名の長さです。文字列の改行はエスケープされないことに注意してください。彼らはおそらくそうするべきです。
- パラメーター:
used
- これまでにラインで使用された文字s
- 折りたたむ文字列- 戻り値:
- 折られたひも
- 導入:
- JavaMail 1.4
unfold
public static StringSE unfold(StringSE s)
折りたたまれたヘッダーを展開します。エスケープされておらず、その後に空白が続く改行は削除されます。- パラメーター:
s
- 展開する文字列- 戻り値:
- 展開された文字列
- 導入:
- JavaMail 1.4
javaCharset
public static StringSE javaCharset(StringSE charset)
MIME 文字セット名を有効な Java 文字セット名に変換します。- パラメーター:
charset
- MIME 文字セット名- 戻り値:
- 同等の Java 文字セット。適切なマッピングが利用できない場合、渡された文字セット自体が返されます。
mimeCharset
public static StringSE mimeCharset(StringSE charset)
java 文字セットを MIME 文字セット名に変換します。JDK の将来のバージョン(1.2 以降)でこの機能が提供される可能性があることに注意してください。その場合、このメソッドは廃止される可能性があります。
- パラメーター:
charset
- JDK 文字セット- 戻り値:
- MIME/IANA 相当。マッピングが不可能な場合は、渡された文字セット自体が返されます。
- 導入:
- JavaMail 1.1
getDefaultJavaCharset
public static StringSE getDefaultJavaCharset()
システムの現在のデフォルトロケールに対応するデフォルトの文字セットを取得します。システムプロパティmail.mime.charset
が設定されている場合、この MIME 文字セットに対応するシステム文字セットが返されます。- 戻り値:
- システムのデフォルトロケールのデフォルトの文字セット(Java 文字セット)。(MIME 文字セットではありません)
- 導入:
- JavaMail 1.1
getBytes
public static byte[] getBytes(StringSE s)
getBytes
public static byte[] getBytes(InputStreamSE is) throws IOExceptionSE