关闭

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

标签: apachehtmljavamailmail邮件
2340人阅读 评论(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网站的观点或立场

使用 HtmlEmail 发送邮件 简单实例

所需jar包 链接: http://pan.baidu.com/s/1hqf7GFi 密码: h0j8 import org.apache.commons.mail.EmailE...
  • zo_184
  • zo_184
  • 2015-02-09 16:35
  • 2932

关于使用HtmlEmail类发送邮件附件的一个坑

最近做了一个项目,属于二次开发,需要在原有的发送邮件的基础上发送邮件附件,因为之前的项目使用的是HtmlEmail类,因为为了使代码不做大的改动而影响其他功能,因此还是使用HtmlEmail这个类来发...
  • rabbit_three
  • rabbit_three
  • 2016-12-01 00:05
  • 1437

Commons Email 发送 HtmlEmail失败原因分析

今天折腾了一天,有个业务需要写个简单的邮件发送,但是测试了。从Apache Commons Email 上取得的例子,稍作了修改: Java代码   public cl...
  • zljjava
  • zljjava
  • 2015-10-15 10:43
  • 2327

Java HtmlEmail 使用QQ邮箱发送邮件报错 530 Error: A secure connection is requiered(such as ssl)

在Java中使用HtmlEmailQQ邮箱发送邮件时报错: Authentication failed; nested exception is javax.mail.AuthenticationF...
  • BackZero333
  • BackZero333
  • 2017-02-24 14:40
  • 2866

HtmlEmail发送邮件

commons-email是apache提供的一个开源的API,是对javamail的封装,因此在使用时要将javamail.jar加到class path中,主要包括SimpleEmail,Mult...
  • dlx804332206
  • dlx804332206
  • 2013-09-11 17:35
  • 1418

使用apache commons email 中HtmlEmail类的setHtmlMsg(body)与 addPart(body, "text/html;charset=utf-8")方法发送邮件区别

使用apache commons email 中HtmlEmail类的setHtmlMsg(body)与 addPart(body, "text/html;charset=utf-8")方法发送邮件区...
  • peixere
  • peixere
  • 2009-05-13 15:59
  • 2562

java - HtmlEmail发送html邮件

之前没做过用JavaMail来发送邮件,在网上搜索点资料,自己写了2方法测试了下: 在自己的项目中,引入三个包 mail.jar ,commons-email-X.X.jar ,activation...
  • wanghuijiao110
  • wanghuijiao110
  • 2011-09-13 16:23
  • 2463

java带图片的邮件发送方法实现

Java发送带图片的邮件,代码为发生2张图片的邮件关联方式,注释中有发送带附件、带多人发送解析的代码,可以自行调整
  • mm7591383
  • mm7591383
  • 2014-06-03 09:46
  • 5056

JavaMail JavaMail发送和接收邮件API(详解)

摘要: 一、JavaMail概述:     JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。     ...
  • a2241076850
  • a2241076850
  • 2016-10-19 10:07
  • 5861

JavaMail实现邮件发送的简单封装(包括文本、图片、html、附件)

最近学习了一下java mail 的使用 网上有很多资料,比较容易理解,也有一些简单的例子,但是封装的都不太理想,于是自己写了一个JavaMail的简单封装,一共两个类,可以实现自由的添加邮件标题、接...
  • lyisray
  • lyisray
  • 2014-12-18 10:55
  • 3021
    个人资料
    • 访问:3247次
    • 积分:63
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档