查了很多资料都是使用本地资源作为附件发送。但是数据和程序分开时,还需要先下载数据,保存到本地再发送邮件。查了很多资料后,发现apach提供了很好的一个commons-mail.jar包,做了很好的封装,简单易用。下载地址是http://commons.apache.org/proper/commons-email/download_email.cgi
public void sendHtmlEmailWithImg() throws Exception {
String htmlEmailContent = "这是一张用于测试的图片,请查收。
"
+ "
";
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("*@qq.com", "Jo");
email.setFrom("*@qq.com", "Me"); // 必须和登陆邮箱名一致,否则会报错
email.setAuthenticator(new DefaultAuthenticator("*@qq.com", "********")); // 邮箱名和登陆密码
email.setSubject("发送一张图片,看看是否可以收到。");
email.setHtmlMsg(htmlEmailContent);
//如果客户端不去持HTML格式会显示这句话,不过应该很少有不支持HTML格式的客户端了吧
email.setTextMsg("你的邮箱客户端不支持HTML格式邮件");
email.send();
}
如果使用QQ邮箱做测试需要注意,QQ邮箱对图片显示不太友好,需要点击显示图片才能显示。
ImageHtmlEmail也可以直接添加网络资源作为附件
/**
* 为邮件添加附件
* @param email 邮件
* @param urls 附件链接
* @param names 附件名称,最好有后缀名才能预览文件
*/
public void addAttachment(ImageHtmlEmailemail, Listurls, Listnames) {
// 保证附件名的长度和链接一一对应
while(urls.size() > names.size()) {
names.add("");
}
for(int i = 0; i < urls.size(); i++) {
EmailAttachment attachment = new EmailAttachment();
try {
attachment.setURL(new URL(urls.get(i)));
attachment.setDisposition(EmailAttachment.ATTACHMENT);
//attachment.setDescription("Apache logo");
attachment.setName(names.get(i));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
email.attach(attachment); // 将附件添加到邮件中
} catch (EmailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}