JavaMailを使用してhtml形式で電子メールを送信しようとしていますが、Outlookでは常にテキスト電子メールとしてのみ表示されるようです。
これが私のコードです:
try
{
Properties props = System.getProperties();
props.put("mail.smtp.Host", mailserver);
props.put("mail.smtp.from", fromEmail);
props.put("mail.smtp.auth", authentication);
props.put("mail.smtp.port", port);
Session session = Session.getDefaultInstance(props, null);
// -- Create a new message --
MimeMessage message = new MimeMessage(session);
// -- Set the FROM and TO fields --
message.setFrom(new InternetAddress(fromEmail, displayName));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
MimeMultipart content = new MimeMultipart();
MimeBodyPart text = new MimeBodyPart();
MimeBodyPart html = new MimeBodyPart();
text.setText(textBody);
text.setHeader("MIME-Version" , "1.0" );
text.setHeader("Content-Type" , text.getContentType() );
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
content.addBodyPart(text);
content.addBodyPart(html);
message.setContent( content );
message.setHeader("MIME-Version" , "1.0" );
message.setHeader("Content-Type" , content.getContentType() );
message.setHeader("X-Mailer", "My own custom mailer");
// -- Set the subject --
message.setSubject(subject);
// -- Set some other header information --
message.setSentDate(new Date());
// INFO: only SMTP protocol is supported for now...
Transport transport = session.getTransport("smtp");
transport.connect(mailserver, username, password);
message.saveChanges();
// -- Send the message --
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return true;
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
電子メールのhtmlバージョンがOutlookに表示されない理由はありますか?
多くの調査の結果、私はいくつかの重要な進歩を遂げることができました。
まず、JavaMailを直接使用する代わりに、 Jakarta Commons Email ライブラリを使用することをお勧めします。これにより、問題が大幅に簡素化されます。
コードは次のとおりです。
HtmlEmail email = new HtmlEmail();
email.setHostName(mailserver);
email.setAuthentication(username, password);
email.setSmtpPort(port);
email.setFrom(fromEmail);
email.addTo(to);
email.setSubject(subject);
email.setTextMsg(textBody);
email.setHtmlMsg(htmlBody);
email.setDebug(true);
email.send();
シンプルについて話します。
ただし、まだ問題があります。電子メールのhtmlバージョンは、Gmail、Hotmailなどでうまく機能しますが、それでもOutlookでは正しく表示されません。常にテキストバージョンを表示したいのですが、理由はわかりません。 Outlookの設定だと思いますが、見つかりません...
すでに提案されているようにhtml.setHeader("Content-Type", html.getContentType())
呼び出しを削除することに加えて、次の行を置き換えます。
MimeMultipart content = new MimeMultipart();
…with:
MimeMultipart content = new MimeMultiPart("alternative");
…そして行を削除します:
message.setHeader("Content-Type" , content.getContentType() );
デフォルトのMimeMultiPartコンストラクターは、「multipart/mixed」コンテンツタイプで問題を引き起こしている可能性があります。
マルチパート/オルタナティブを使用する場合、オルタナティブはオリジナルにどれだけ忠実であるかによって順序付けられ、最後に最高の表現が使用されます。ただし、クライアントは通常、HTMLが存在する場合でも、プレーンテキストを表示するオプションをユーザーに提供します。このオプションがOutlookで有効になっていないことを確認しますか? ThunderbirdやGMailなどの他のユーザーエージェントはメッセージをどのように扱いますか?
また、HTMLが整形式であることを確認してください。 W3検証サービス を使用してHTMLコンテンツを検証し、ファイルに保存して、異なるバージョンのIE)で表示することもできます。おそらく欠陥があります。そこで、Outlookはプレーンテキストにフォールバックします。
_html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
_
setContent
とsetHeader("Content-Type", String)
は同じことをします-html.getContentType()
が_text/html
_以外のものを返している可能性はありますか?
コメントと@PhilLhoと@ericksonの回答に基づいて展開します(そうですね、ゆっくり入力する必要があります)。
_MimeMultipart content = new MimeMultipart("alternative")
_
これを次のように変更します。
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");
コンテンツ文字セットを設定する必要があります。コンテンツ自体がなぜかわかりません。むしろあるべきです:
message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1");
次のコードを使用しました。
mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8")));
multiPart.addBodyPart(mimeBodyPart1);
message.setContent(multiPart, "text/html; charset=utf-8");
現在、Outlookはhtml形式で表示されます。
受信したメッセージのソースを確認する必要があります。メッセージのContent-Typeはマルチパート/代替ですか?
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");
問題を解決する必要があります(削除された\"
文字)。
workaroungソリューションはOutlook2003を解決しました:このメッセージは、インターネットサービスでサポートされていない文字セットを使用しています。正しく表示されません。
エンコーディングが原因である可能性があります。ほとんどのhtmlページはcp-1252ではなくiso-8859-1を使用しています変更してみてください
たとえば、コードは次のとおりです。
message.setContent(sBuffer.toString(), "text/html");
これを次のように変更します。
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");
これにより、新しいチェック済み例外Java.io.UnsupportedEncodingExceptionがスローされるため、スローまたはキャッチするように宣言する必要があります。 iso-8859-1がサポートされているため、rt.jarで何かが破損しない限り、例外がスローされることはありません。
よろしく、Javeed [email protected]