18

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

4

8 に答える 8

16

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

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

于 2008-11-27T20:33:39.967 に答える
5

すでに提案されているように呼び出しを削除することに加えてhtml.setHeader("Content-Type", html.getContentType()) 、次の行を置き換えます。

MimeMultipart content = new MimeMultipart();

…と:

MimeMultipart content = new MimeMultiPart("alternative");

…そして次の行を削除します:

message.setHeader("Content-Type" , content.getContentType() );

デフォルトの MimeMultiPart コンストラクターは、「マルチパート/混合」コンテンツ タイプで問題を引き起こす可能性があります。

multipart/alternative を使用する場合、代替はオリジナルにどれだけ忠実であるかによって順序付けられ、最良の表現が最後になります。ただし、クライアントは通常、HTML が存在する場合でも、プレーン テキストを表示するオプションをユーザーに提供します。このオプションが Outlook で有効になっていませんか? Thunderbird や GMail などの他のユーザー エージェントは、メッセージをどのように処理しますか?

また、HTML が整形式であることを確認してください。HTML コンテンツをW3 検証サービスで検証し、場合によってはファイルに保存して、さまざまなバージョンの IE でも表示します。Outlook がプレーン テキストにフォールバックする原因となる欠陥がある可能性があります。

于 2008-11-26T22:42:58.367 に答える
3
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")
于 2008-11-26T22:03:39.693 に答える
3

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

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形式で表示されます。

于 2012-09-20T07:04:00.190 に答える
3

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

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");
于 2010-01-12T15:09:47.233 に答える
1
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");

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

于 2010-09-14T06:08:19.233 に答える
1

受信したメッセージのソースを確認する必要があります。メッセージの Content-Type は multipart/alternative ですか?

于 2008-11-26T22:32:25.470 に答える
0

Outlook 2003 で解決された回避策: このメッセージは、インターネット サービスでサポートされていない文字セットを使用しています。正しく表示されません。

エンコーディングが原因である可能性があります。ほとんどの 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 で何かが破損しない限り、例外はスローされません。

よろしく、ジャビード・ジャビード・ジャビード.mca@gmail.com

于 2009-03-10T15:15:57.473 に答える