在Java Mail的邮件发送中,所有的邮件客户端都显示正常,但Mac OS邮件客户端无法正常显示图片,仅仅显示一个蓝色的问号图片。
首先按照BS模式与HTML的思维判定问题可能是没有指定图片的类型,于是添加了相应的图片类型说明,如“Content-Type”与“Disposition”,结果问题解决,完全的代码如下:
// 显示图片必须为related,如果还需要添加附件必须为multi
// 邮件内容
MimeMultipart multipart = new MimeMultipart("related");
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = "<img src=\"cid:image\">" +
"<p style=\"font-size:16px;\">" +
"基于以上原因,我们强烈建议您马上修改密码,<a href=\"http://112.124.25.82:8000/index.html?$$$$\">点我</a>进入密码修改页面。" +
"</p>";
// 必须明确指定字体为UTF-8,避免中文乱码
messageBodyPart.setContent(htmlText, "text/html;charset=utf-8;");
multipart.addBodyPart(messageBodyPart);
// 添加图片
MimeBodyPart imagePart = new MimeBodyPart();
DataSource fds = new FileDataSource("/opt/atta.png");
imagePart.setDataHandler(new DataHandler(fds));
// 设置ID
imagePart.setHeader("Content-ID","<image>");
imagePart.setHeader("Content-Type", "image/png");
imagePart.setDisposition(MimeBodyPart.INLINE);
imagePart.setFileName("image.png");
// 添加内容
multipart.addBodyPart(imagePart);
但奇怪的现象又出现了,IPhone的邮件客户端又无法显示图片,效果如下:
自己试着对比了能正常显示的邮件与异常邮件,发现DOM稍有差异,于是修改为如下格式:
<div>
<img src=\"cid:image\">
</div>
<div> </div>
但手机邮件客户端的图片依旧无法显示。
继续排查,唯一的疑点就在与邮件的名称与“Content-ID”,于是将相关的“image”改为其他名称,如“attach”,如下:
// 第一个修改的地方
String htmlText = "<img src=\"cid:attach\">" +
"<p style=\"font-size:16px;\">" +
"基于以上原因,我们强烈建议您马上修改密码,<a href=\"http://112.124.25.82:8000/index.html?$$$$\">点我</a>进入密码修改页面。" +
"</p>";
// 第二个修改的地方
imagePart.setHeader("Content-ID","<attach>");
// 第三个修改的地方
imagePart.setFileName("attach.png");
最后IPhone手机客户端能准确显示邮件图片。
结论
要想正确显示邮件的图片内容,必须做到如下几点:
1. MimeMultipart的类型必须是“related”(new MimeMultipart(“related”));
2. 图片的显示方式必须为“INLINE”(Disposition=MimeBodyPart.INLINE);
3. 必须明确指定“Content-Type”头信息(Content-Type=image/png);
4. 图片名称与“Content-ID”绝不能为“image”(可能为关键字);