以下のプログラムは、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
囲んでいるメッセージで 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() );
}
}
_
理由はわかりません(メソッドは文書化されていません)が、ソースコードを見ると、次のようになっているはずです。
mime_body_part.setHeader("Content-Type", "text/html");
これで試してください:
msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
使用についてはどうですか:
mime_body_part.setHeader("Content-Type", "text/html");
getContentTypeのドキュメント では、返される値がgetHeader(name)を使用して検出されたことを示しています。したがって、setHeaderを使用してヘッダーを設定すると、すべてが正常に動作するはずです。
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。の場合
私にとっては、2回設定しました。
(MimeBodyPart)messageBodyPart.setContent(content, text/html)
(Multipart)multipart.addBodyPart(messageBodyPart)
(MimeMessage)msg.setContent(multipart, text/html)
そしてそれはうまく機能しています。
"<h1>STRING<h1>".getBytes();
を使用すると、content-typeでByteArrayDataSource
を作成し、setDataHandler
にMimeBodyPart
を設定できます
試してください:
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);