パッケージ 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
    • メソッドの詳細

      • 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 のいずれかです。
      • 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)