关闭

Java发送包含网络和本地图片的HTML邮件

标签: apachehtmljavamailmail邮件
2043人阅读 评论(0) 收藏 举报
分类:

一、问题背景

最近在做一个发邮件的客户端程序,用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));

Bingo~ 发送成功!
 


二、以下是完整源代码:

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.csdn.net/dadiyang/article/details/52352632


 参考链接:

http://commons.apache.org/proper/commons-email/userguide.html

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2770次
    • 积分:58
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档