web-dev-qa-db-ja.com

MimeBodyPartコンテンツタイプを「text / html」に設定する方法

以下のプログラムは、HTMLマルチパートMIMEタイプの予期しない戻り値を示しています。このプログラムが「text/html」ではなく「text/plain」を出力するのはなぜですか?

public class Main {
  public static void main(String[] args) throws javax.mail.MessagingException, Java.io.IOException {
    javax.mail.internet.MimeBodyPart mime_body_part = new javax.mail.internet.MimeBodyPart();
    mime_body_part.setContent("<h1>foo</h1>", "text/html");
    System.out.println(mime_body_part.getContentType());
  }
}

DataHandlerにラップされたByteArrayDataSourceを設定するなど、さまざまな代替方法を試しましたが、役に立ちませんでした。 MimeBodyPartではなくMimeMessageでこれを試しても同じことが起こります。

Linuxでコンパイルして実行するには:

javac -classpath .:activation.jar:mail.jar Main.Java
java -classpath .:activation.jar:mail.jar Main
32
necromancer

囲んでいるメッセージで MimeMessage.saveChanges() を呼び出します。これは、MIME構造をカスケードして、身体部分のMimeBodyPart.updateHeaders()への呼び出しにヘッダーを更新します。コンテンツタイプをupdateHeadersからパートのMIME _Content-Type_ヘッダーに転送するのは、このDataHandler呼び出しです。

MimeBodyPartのコンテンツを設定すると、JavaMailは内部で(明らかにではないが)渡したオブジェクトをラップするDataHandlerオブジェクトを作成します。パーツの_Content-Type_ヘッダーはnotはすぐに更新されます。

含むMimeMessageがなく、MimeBodyPart.updateHeaders()publicではないため、テストプログラムでそれを行う簡単な方法はありません。


次に、予想される出力と予期しない出力を照らす実用的な例を示します。

_public class MailTest {

  public static void main( String[] args ) throws Exception {
    Session mailSession = Session.getInstance( new Properties() );
    Transport transport = mailSession.getTransport();

    String text = "Hello, World";
    String html = "<h1>" + text + "</h1>";

    MimeMessage message = new MimeMessage( mailSession );
    Multipart multipart = new MimeMultipart( "alternative" );

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText( text, "utf-8" );

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent( html, "text/html; charset=utf-8" );

    multipart.addBodyPart( textPart );
    multipart.addBodyPart( htmlPart );
    message.setContent( multipart );

    // Unexpected output.
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );

    // Required magic (violates principle of least astonishment).
    message.saveChanges();

    // Output now correct.    
    System.out.println( "TEXT = text/plain: " + textPart.isMimeType( "text/plain" ) );
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );
    System.out.println( "HTML Data Handler: " + htmlPart.getDataHandler().getContentType() );
  }
}
_
50
dkarp

理由はわかりません(メソッドは文書化されていません)が、ソースコードを見ると、次のようになっているはずです。

mime_body_part.setHeader("Content-Type", "text/html");
23
JB Nizet

これで試してください:

msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
6
mesrar

使用についてはどうですか:

mime_body_part.setHeader("Content-Type", "text/html");

getContentTypeのドキュメント では、返される値がgetHeader(name)を使用して検出されたことを示しています。したがって、setHeaderを使用してヘッダーを設定すると、すべてが正常に動作するはずです。

4
foens

3つの引数を取るメソッドsetText()があります:

public void setText(String text, String charset, String subtype)
    throws MessagingException

パラメーター:

text - the text content to set
charset - the charset to use for the text
subtype - the MIME subtype to use (e.g., "html")

注:サブタイプはMIMEタイプの/の後のテキストを取得するため、ex。の場合

  • text/htmlはhtmlになります
  • text/cssはcssです
  • 等々..
3
Ravi Naik

私にとっては、2回設定しました。

(MimeBodyPart)messageBodyPart.setContent(content, text/html)
(Multipart)multipart.addBodyPart(messageBodyPart)
(MimeMessage)msg.setContent(multipart, text/html)

そしてそれはうまく機能しています。

1
lwpro2

"<h1>STRING<h1>".getBytes();を使用すると、content-typeでByteArrayDataSourceを作成し、setDataHandlerMimeBodyPartを設定できます

試してください:

String html "Test JavaMail API example. <br><br> Regards, <br>Ivonei Jr"
byte[] bytes = html.getBytes(); 
DataSource dataSourceHtml= new ByteArrayDataSource(bytes, "text/html");
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDataHandler(new DataHandler(dataSourceHtml));

MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(bodyPart);
1
ivoneijr