一、问题背景
最近在做一个发邮件的客户端程序,用JavaMail来写,代码写得较多且杂;
查看资料发现apache有一个commons-mail包对JavaMail进行封装,看了示例代码,非常好用,于是就马上用上了 ;
最后要完成的时候发现一个问题。如何发送内嵌图片的HTML格式的邮件?即有<img src="" >标签的邮件;
二、分析及解决
官方示例里有一个使用 ImageHtmlEmail 的示例,该示例可以发送内嵌网络图片连接的邮件,但是如果是本地图片就会报错;
于是分析了一下主要是 email.setDataSourceResolver(new DataSourceUrlResolver(new URL("http://......."))); 这个在起作用;
于是查看了 DataSourceUrlResolver 并分析其继续结构:
从名字可以猜到,既然有 DataSourceUrlResolver 可以解析 url,那么 DataSourceFileResolver 应该可以解析本地文件了;
于是换成 DataSourceFileResolver 测试,果然可以;
随后问题来了:email.setDataSourceResolver 只能设置一个 DataSourceResolver ,可是如果邮件内容包含本地文件和网络图片,如何解析?
又查看了 DataSourceCompositeResolver 从名字可以看出应该有戏:
于是查看其构造器和 API 发现可以组合多个 DataSourceResolver ,于是根据构造器要求构造并设置好;
DataSourceResolver[] dataSourceResolvers =
new DataSourceResolver[]{new DataSourceFileResolver(),//添加DataSourceFileResolver用于解析本地图片
new DataSourceUrlResolver(new URL("http://"))};//添加DataSourceUrlResolver用于解析网络图片,注意:new URL("http://")
email.setDataSourceResolver(new DataSourceCompositeResolver(dataSourceResolvers));
B
ingo~
发送成功!
二、以下是完整源代码:
public void testSendHtmlEmailWithImg() throws Exception {
String htmlEmailContent = "这是一张用于测试的图片,请查收。 <img src=\"D:/1.png\"> "
+ " <img src=\"http://commons.apache.org/proper/commons-email/images/commons-logo.png\">";
ImageHtmlEmail email = new ImageHtmlEmail();//用ImageHtmlEmail来发送
email.setDebug(true);//可以看到执行过程的debug信息
email.setCharset("UTF-8");//防止乱码
email.setSSLCheckServerIdentity(true);
email.setSslSmtpPort("465"); // 设定SSL端口
//解析本地图片和网络图片都有的html文件重点就是下面这两行;
//ImageHtmlEmail通过setDataSourceResolver来识别并嵌入图片
//查看DataSourceResolver的继承结构发现有几个好用的子类
DataSourceResolver[] dataSourceResolvers =
new DataSourceResolver[]{new DataSourceFileResolver(),//添加DataSourceFileResolver用于解析本地图片
new DataSourceUrlResolver(new URL("http://"))};//添加DataSourceUrlResolver用于解析网络图片,注意:new URL("http://")
//DataSourceCompositeResolver类可以加入多个DataSourceResolver,
//把需要的DataSourceResolver放到一个数组里传进去就可以了;
email.setDataSourceResolver(new DataSourceCompositeResolver(dataSourceResolvers));
email.setHostName("smtp.qq.com");
email.addTo("505335409@qq.com", "Jo");
email.setFrom("493995087@qq.com", "Me");
email.setAuthenticator(new DefaultAuthenticator("493995087@qq.com", "********"));
email.setSubject("发送一张图片,看看是否可以收到。");
email.setHtmlMsg(htmlEmailContent);
//如果客户端不去持HTML格式会显示这句话,不过应该很少有不支持HTML格式的客户端了吧
email.setTextMsg("你的邮箱客户端不支持HTML格式邮件");
email.send();
}
本篇为原创文章,转载请注明出处:
http://blog.youkuaiyun.com/dadiyang/article/details/52352632
参考链接:
http://commons.apache.org/proper/commons-email/userguide.html