我有一个Tomcat应用程序,需要发送确认电子邮件等。我已经用Javamail(mail.jar)编码了电子邮件程序,以发送多部分文本/ html电子邮件。我基于Java EE示例创建代码。我在本地服务器上使用SMTP MTA。
效果很好。在Outlook中,我看到了HTML版本。如果将其拖到Outlook垃圾邮件文件夹中,则会看到文本版本。所以我将其解释为有效。
但是,如果我查看Gmail中的电子邮件,则只能看到文本版本。我知道HTML在那里(这就是Outlook的来源)。但是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!"); }
解决了!根据多部分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);
谢谢您的帮助!