public class MimeUtility extends ObjectSE
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 がスローされます。
| 修飾子と型 | フィールドと説明 |
|---|---|
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 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) 折りたたまれたヘッダーを展開します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEpublic static final int ALL
public static StringSE getEncoding(DataSource ds)
ここで使用されるアルゴリズムは次のとおりです。
EncodingAware を実装している場合は、使用するエンコーディングを確認してください。null 以外を返す場合は、その値を返します。ds - DataSourcepublic static StringSE getEncoding(DataHandler dh)
getEncoding(DataSource) と同じですが、InputStream からデータを読み取る代わりに、writeTo メソッドを使用してデータを検査する点が異なります。これは、すべての I/O がこのスレッドで行われるため、オブジェクトと MIME 型(たとえば、"text/plain" 文字列)で作成された DataHandler の一般的なケースでより効率的です。InputStream が必要な場合、DataHandler はスレッド、パイプストリームのペア、writeTo メソッドを使用してデータを生成します。dh - DataHandlerpublic static InputStreamSE decode(InputStreamSE is, StringSE encoding) throws MessagingException
現在の実装では、mail.mime.ignoreunknownencoding システムプロパティが "true" に設定されている場合、不明なエンコード値は無視され、元の InputStream が返されます。
is - 入力ストリーム encoding - ストリームのエンコーディング。MessagingException - エンコーディングが不明な場合 public static OutputStreamSE encode(OutputStreamSE os, StringSE encoding) throws MessagingException
os - 出力ストリーム encoding - ストリームのエンコーディング。MessagingException - エンコーディングが不明な場合 public static OutputStreamSE encode(OutputStreamSE os, StringSE encoding, StringSE filename) throws MessagingException
filename パラメーターは "uuencode" エンコーディングで使用され、エンコードされた出力に含まれます。os - 出力ストリーム encoding - ストリームのエンコーディング。filename - エンコードされるファイルの名前 (uuencode でのみ使用されます)MessagingException - 不明なエンコーディングの場合 public static StringSE encodeText(StringSE text) throws UnsupportedEncodingExceptionSE
指定された 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 文字列 UnsupportedEncodingExceptionSE - エンコードが失敗した場合 public static StringSE encodeText(StringSE text, StringSE charset, StringSE encoding) throws UnsupportedEncodingExceptionSE
指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初に指定された文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
このメソッドは、「非構造化」RFC 822 ヘッダーのみをエンコードするために使用する必要があることに注意してください。
text - ヘッダー値 charset - 文字セット。このパラメーターが null の場合、プラットフォームのデフォルトのチャットセットが使用されます。encoding - 使用するエンコーディング。現在サポートされている値は "B" と "Q" です。このパラメーターが null の場合、エンコードされる文字のほとんどが ASCII 文字セットにある場合は "Q" エンコーディングが使用され、それ以外の場合は "B" エンコーディングが使用されます。UnsupportedEncodingExceptionSE - 文字セット変換が失敗した場合。public static StringSE decodeText(StringSE etext) throws UnsupportedEncodingExceptionSE
文字列は、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 - 文字セット変換が失敗した場合。public static StringSE encodeWord(StringSE word) throws UnsupportedEncodingExceptionSE
指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初にプラットフォームのデフォルトの文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
このメソッドは、RFC 822「フレーズ」を作成するときに使用することを目的としています。たとえば、InternetAddress クラスは、これを使用して「フレーズ」コンポーネントをエンコードします。
word - Unicode 文字列 UnsupportedEncodingExceptionSE - エンコードが失敗した場合 public static StringSE encodeWord(StringSE word, StringSE charset, StringSE encoding) throws UnsupportedEncodingExceptionSE
指定された Unicode 文字列は、US-ASCII 以外の文字について検査されます。文字列に US-ASCII 文字のみが含まれている場合は、そのまま返されます。文字列に US-ASCII 以外の文字が含まれている場合、最初に指定された文字セットを使用して文字エンコードされ、次に B または Q エンコードを使用して転送エンコードされます。結果のバイトは、ASCII 文字のみを含む Unicode 文字列として返されます。
word - Unicode 文字列 charset - MIME 文字セット encoding - 使用するエンコーディング。現在サポートされている値は "B" と "Q" です。このパラメーターが null の場合、エンコードされる文字のほとんどが ASCII 文字セットにある場合は "Q" エンコーディングが使用され、それ以外の場合は "B" エンコーディングが使用されます。UnsupportedEncodingExceptionSE - エンコードが失敗した場合 public static StringSE decodeWord(StringSE eword) throws ParseException, UnsupportedEncodingExceptionSE
eword - エンコードされた値 ParseException - 文字列が RFC 2047 および RFC 2231 のようにエンコードされた単語でない場合。UnsupportedEncodingExceptionSE - 文字セット変換が失敗した場合。public static StringSE quote(StringSE word, StringSE specials)
HeaderTokenizer クラスは、MIME と RFC 822 の 2 つの特別な区切り文字セットを定義します。
この方法は通常、RFC 822 および MIME ヘッダーフィールドの生成中に使用されます。
word - 引用する単語 specials - 特殊文字のセット HeaderTokenizer.MIME, HeaderTokenizer.RFC822public static StringSE fold(int used, StringSE s)
used は、現在の行で使用されている文字数を示します。通常はヘッダー名の長さです。文字列の改行はエスケープされないことに注意してください。彼らはおそらくそうするべきです。
used - これまでにラインで使用された文字 s - 折りたたむ文字列 public static StringSE unfold(StringSE s)
s - 展開する文字列 public static StringSE javaCharset(StringSE charset)
charset - MIME 文字セット名 public static StringSE mimeCharset(StringSE charset)
JDK の将来のバージョン(1.2 以降)でこの機能が提供される可能性があることに注意してください。その場合、このメソッドは廃止される可能性があります。
charset - JDK 文字セット public static StringSE getDefaultJavaCharset()
mail.mime.charset が設定されている場合、この MIME 文字セットに対応するシステム文字セットが返されます。Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.