web-dev-qa-db-ja.com

Java)からOutlookにHTMLメールを送信する方法

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に表示されない理由はありますか?

18

多くの調査の結果、私はいくつかの重要な進歩を遂げることができました。

まず、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の設定だと思いますが、見つかりません...

16

すでに提案されているように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はプレーンテキストにフォールバックします。

5
erickson
_html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
_

setContentsetHeader("Content-Type", String)は同じことをします-html.getContentType()が_text/html_以外のものを返している可能性はありますか?

コメントと@PhilLhoと@ericksonの回答に基づいて展開します(そうですね、ゆっくり入力する必要があります)。

_MimeMultipart content = new MimeMultipart("alternative")
_
3
Ken Gentle

これを次のように変更します。

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");
3
user225486

次のコードを使用しました。

mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8")));
multiPart.addBodyPart(mimeBodyPart1);
message.setContent(multiPart, "text/html; charset=utf-8");

現在、Outlookhtml形式で表示されます。

3
AVA

受信したメッセージのソースを確認する必要があります。メッセージのContent-Typeはマルチパート/代替ですか?

1
PhiLho
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");

問題を解決する必要があります(削除された\"文字)。

1
Kuldeep

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]

0