Ste*_*ier 18 java email jakarta-mail
我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
有什么想法为什么电子邮件的HTML版本不会在Outlook中显示?
Ste*_*ier 16
经过大量调查,我已经取得了一些重大进展.
首先,我建议使用Jakarta Commons Email库,而不是直接使用JavaMail .这真的简化了这个问题!
代码现在是:
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();
Run Code Online (Sandbox Code Playgroud)
说说简单.
但是,仍有一个问题.电子邮件的html版本在Gmail,Hotmail等中运行良好.但它仍然无法在Outlook中正确显示.它总是想显示文本版本,我不知道为什么.我怀疑它是Outlook中的一个设置,但我找不到它......
除了删除html.setHeader("Content-Type", html.getContentType())
已建议的呼叫,我还要更换线路:
MimeMultipart content = new MimeMultipart();
Run Code Online (Sandbox Code Playgroud)
...有:
MimeMultipart content = new MimeMultiPart("alternative");
Run Code Online (Sandbox Code Playgroud)
...并删除该行:
message.setHeader("Content-Type" , content.getContentType() );
Run Code Online (Sandbox Code Playgroud)
默认的MimeMultiPart构造函数可能导致"multipart/mixed"内容类型出现问题.
当使用多部分/替代品时,替代品的排序方式是他们对原作的忠诚度,最佳的再现性.但是,客户端通常会为用户提供显示纯文本的选项,即使存在HTML也是如此.您确定Outlook中未启用此选项吗?其他用户代理(如Thunderbird或GMail)如何处理您的邮件?
另外,请确保HTML格式正确.我将使用W3验证服务验证HTML内容,并可能将其保存到文件中,并使用不同版本的IE查看它.也许有一个缺陷导致Outlook回归纯文本.
| 归档时间: |
|
| 查看次数: |
43593 次 |
| 最近记录: |