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

本文介绍如何使用JavaMail和Apache Commons-Mail库发送带有本地和网络图片的HTML格式邮件,并提供了一个完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题背景

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值