JavaMail发送邮件无法显示图片的解决办法

来源:互联网 发布:java 第三方登录 编辑:程序博客网 时间:2024/05/21 17:37

在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));//  设置IDimagePart.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>&nbsp;</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”(可能为关键字);

参考资料

  1. 《MIME中的Multipart/mixed》
  2. 2.
原创粉丝点击