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

在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>&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.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值