31

確認メールなどを送信する必要のあるTomcatアプリケーションがあります。マルチパートテキスト/htmlメールを送信するためにJavamail(mail.jar)を使用してメール送信者をコーディングしました。私はJavaEEの例に基づいてコードを作成しました。ローカルサーバーでSMTPMTAを使用しています。

それは素晴らしい働きをします。Outlookで、HTMLバージョンが表示されます。Outlookのスパムフォルダにドラッグすると、テキストバージョンが表示されます。だから私はそれがうまくいくと言っていると解釈します。

ただし、Gmailでメールを表示すると、テキストバージョンしか表示されません。HTMLがそこにあることは知っています(OutlookがHTMLを取得した場所です)。しかし、Gmailはそれを表示していません...GmailでHTMLとして表示される他のシステムからのメールがたくさんあります。

誰かが私が欠けているものを示す仕様を私に指摘できますか?作成する必要のある特別なヘッダーはありますか?

ありがとう

コードは次のようになります。

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

try {

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

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

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

    if(from != null){
        message.setFrom(new InternetAddress(from));
    }else
        message.setFrom();

    if(replyto != null)
        message.setReplyTo(new InternetAddress[]{new InternetAddress(replyto)});
    else
        message.setReplyTo(new InternetAddress[]{new InternetAddress(from)});

    InternetAddress[] toAddresses = { new InternetAddress(to) };
    message.setRecipients(Message.RecipientType.TO, toAddresses);
    message.setSubject(subject);
    message.setSentDate(new Date());

    Transport.send(message);

} catch (AddressException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} catch (MessagingException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} finally {     
    System.out.println("Email sent!");
}
4

1 に答える 1

59

解決しました!マルチパート MIME 仕様によると、パーツの順序が重要なようです。低忠実度から高忠実度の順に追加する必要があります。したがって、GMail は仕様に従っており、最後の部分を使用しているようです。私の場合、HTML、テキストがありました。順序をテキスト、HTML に入れ替えただけで、Gmail はそれを正しくレンダリングします...

すなわち

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

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

multiPart.addBodyPart(textPart); // <-- first
multiPart.addBodyPart(htmlPart); // <-- second
message.setContent(multiPart);

助けてくれてありがとう!

于 2013-02-17T18:28:45.760 に答える