Commons: 封装Apache Commons Email简化邮件发送
参考资料1 用Apache Commons Email简化邮件发送
http://www.blogjava.net/fastunit/archive/2008/01/25/177799.html
我测试时是用的是:新浪的邮箱:smtp.sina.com也是可以的
如下设置:
Exception: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection
参考文章:http://zhidao.baidu.com/question/227409027.html
解答: 配置JavaMail的Properties时,不要指定mail.smtp.socketFactory.class,因为TLS使用的是普通的Socket。 然后指定属性mail.smtp.starttls.enable为true.
介绍
Commons Email封装了javamail,使用非常简单。
功能:简单文本邮件、带附件的邮件、HTML格式的邮件
官方首页:http://commons.apache.org/email/,目前最新版本是1.2
官方示例:http://commons.apache.org/email/userguide.html
工程环境:XP+Myeclipse6.5+JDK1.6
一 实现功能
1 封装了常用的四种发送Email的方法(文本,html,img,file),用户只要调用一个工厂类传递相应的邮件的属性如from, to,cc, subject,text,或者是消息对象
2 解决了发送邮件附件中的中文筹码问题
3 支持链式风格
4 可以混合发送多种消息(text,html,img,file)
二 工程图片
或者你也可以这样,使用打包好的jar:email.commons.util.jar
,见附件
三 调用说明
1 发送文本消息
//默认空构造为发送文本类型
//默认空构造为发送文本类型
MailMessageFactory mms = new MailMessageFactory();
mms.setSubject("使用Apache Commons Email 组件发送").setText("发送普通文本消息").send();
2 发送含有附件的消息
MailMessageFactory mms = new MailMessageFactory(SendMailType.FILE);
mms.setSubject("使用Apache Commons Email 组件发送文本及附件消息").setText("天涯海角")
.setEmailAttachment("美女.jpg","美女图片","c:\\4.jpg").send();
3 发送Html格式消息
MailMessageFactory mms = new MailMessageFactory(SendMailType.HTML);
String html = "<html><head><meta http-equiv='content-type' content='text/html; charset=GBK'>"
+ "</head><body><h1>使用Apache Commons Email发送的邮件</h1><img src=\"cid:img0\"><br><img src=\"cid:img1\"></body></html>";
mms.setSubject("使用Apache Commons Email 网页格式加入图片")
.setEmailAttachment("美女.jpg","美女图片","c:\\4.jpg")
.setEmailHtmlImgAttachment("美女2.jpg","美女图片2","img0","c:\\5.jpg")
.setEmailHtmlImgUrl("apache.jpg",null, "img1","http://www.apache.org/images/asf_logo_wide.gif")
.setHtmlText(html)
.send();
四 代码如下
1 消息发送类:MailMessageFactory
package net.liuzd.email.commons;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;
import net.liuzd.email.EmailEntity;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.mail.SimpleEmail;
/**
* Title: Description: Copyright: Copyright (c) 2011
* Company:http://liuzidong.iteye.com/ Makedate:2011-7-5 下午02:23:49
* @author liuzidong
* @version 1.0
* @since 1.0
*
*/
public class MailMessageFactory {
private Email email;
private SendMailType sendMailType;
private SendMessage sendMessage;
private static final String ENCODING = EmailEntity.EMAIL_ENCODING;
/**
* 默认为发送文本类型
*/
public MailMessageFactory() {
this(SendMailType.TEXT);
}
public MailMessageFactory(SendMailType sendMailType) {
this.sendMailType = sendMailType;
sendMessage = new SendMessage();
switch (this.sendMailType) {
case TEXT:
email = new SimpleEmail();
break;
case HTML:
email = new HtmlEmail();
break;
case FILE:
email = new MultiPartEmail();
}
//配置相关邮件设置
email.setHostName(EmailEntity.EMAIL_HOST);
email.setAuthentication(EmailEntity.EMAIL_USERNAME,EmailEntity.EMAIL_PASSWORD);
email.setCharset(ENCODING); // 编码
}
/**
* @param to 接收者人地址
* @return
*/
public MailMessageFactory setTo(String to) {
sendMessage.setTo(to);
return this;
}
/** 发送标题 */
public MailMessageFactory setSubject(String subject) {
sendMessage.setSubject(subject);
return this;
}
/** 发送内容 */
public MailMessageFactory setText(String text) {
sendMessage.addText(text);
return this;
}
public MailMessageFactory setHtmlText(String htmlText) {
sendMessage.addHtmlText(htmlText);
return this;
}
/**
* 添加本地文件
* @param attachMentName 发送到Email的附件名称
* @param description 附件描述
* @param file 实际图片数据源
* @return
*/
public MailMessageFactory setEmailAttachment(String attachMentName,String description,String filePath){
try {
sendMessage.addFile(MailType.FILE, MimeUtility.encodeWord(attachMentName),description,null,filePath);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return this;
}
/**
* 添加到Email中的Html格式中的的本地图片
* */
public MailMessageFactory setEmailHtmlImgAttachment(String attachMentName,String description,String cldName,String filePath){
try {
sendMessage.addFile(MailType.IMG, MimeUtility.encodeWord(attachMentName),description,cldName,filePath);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return this;
}
/**
* 添加到Email中的Html格式中的的网络图片
* */
public MailMessageFactory setEmailHtmlImgUrl(String attachMentName,String description,String cldName,String url){
try {
sendMessage.addFile(MailType.URL, MimeUtility.encodeWord(attachMentName),description,cldName,url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return this;
}
public void send(){
//检查接收人地址是否为空
Stringto = sendMessage.getTo();
if(null == to || to.length() == 0){
to = EmailEntity.EMAIL_TO;
sendMessage.setTo(to);
}
String subject = sendMessage.getSubject();
if(null != subject && !"".equals(subject)){
email.setSubject(subject);
}
try {
email.addTo(sendMessage.getTo());
email.setFrom(EmailEntity.EMAIL_FROM);
String text = sendMessage.getEmailText();
if(null != text && !"".equals(text)){
//设置内容的字符集为UTF-8,先buildMimeMessage才能设置内容文本
try {
email.getMimeMessage().setText(text,ENCODING);
} catch (MessagingException e) {
e.printStackTrace();
}
//email.setMsg(text);
}
String html = sendMessage.getEmailHtmlText();
//发送文件
List<SendMessage> lists = sendMessage.getImages();
EmailAttachment attachment = null;
String filePath = null;
String imgName = null;
for(SendMessage entity : lists){
filePath = entity.getFilePath();
String clidName = entity.getCitName();
imgName = entity.getImgName();
if(entity.getMailType() == MailType.FILE){
attachment = new EmailAttachment();
attachment.setPath(filePath);
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription(entity.getDescription());
attachment.setName(entity.getImgName());
((MultiPartEmail)email).attach(attachment);
}else if(entity.getMailType() == MailType.IMG){
File file = new File(filePath);
imgName = entity.getImgName();
String cid = ((HtmlEmail) email).embed(file, MimeUtility.encodeText(imgName));
//得到用户定义的在html中图片的名字clid
html = html.replace(clidName, cid);
}else if(entity.getMailType() == MailType.URL){
URL url = new URL(filePath);
imgName = entity.getImgName();
String cid = ((HtmlEmail) email).embed(url, MimeUtility.encodeText(imgName));
html = html.replace(clidName, cid);
}
}
if(sendMailType != SendMailType.TEXT){
if(null != html && !"".equals(html) && sendMailType == SendMailType.HTML){
System.out.println("HTML: "+html);
((HtmlEmail)email).setHtmlMsg(html);
}
}
long startTime = System.currentTimeMillis();
email.send();
long endTime = System.currentTimeMillis();
System.out.println(sendMailType + "成功!,耗费时间: " + (endTime - startTime)+"毫秒!");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (EmailException e) {
e.printStackTrace();
}
}
}
2 消息对象:SendMessage
public class SendMessage {
private Stringto;
private String subject;
private String description;
private String citName;
private String imgName;
private String filePath;
private MailType mailType;
private String form;
private List<String> texts = new ArrayList<String>();
private List<String> htmlTexts = new ArrayList<String>();
//图片集合
private List<SendMessage> images = new ArrayList<SendMessage>();
public MailType getMailType() {
return mailType;
}
public void setMailType(MailType mailType) {
this.mailType = mailType;
}
public void addFile(MailType mailType,String imgName,String description,String citName,String filePath){
images.add(new SendMessage(mailType,imgName,description,citName,filePath));
}
public void addText(String text){
texts.add(text);
}
public void addHtmlText(String htmlText){
htmlTexts.add(htmlText);
}
public SendMessage(MailType mailType,String imgName,String description,String citName,String filePath) {
super();
this.mailType =mailType;
this.imgName = imgName;
this.description = description;
this.citName = citName;
this.filePath = filePath;
}
public List<SendMessage> getImages() {
return images;
}
public void setImages(List<SendMessage> images) {
this.images = images;
}
public String getForm() {
return form;
}
public void setForm(String form) {
this.form = form;
}
public String getImgName() {
return imgName;
}
public void setImgName(String imgName) {
this.imgName = imgName;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public SendMessage() {
}
public SendMessage(String to, String subject, String text) {
super();
this.to = to;
this.subject = subject;
addText(text);
}
@Override
public String toString() {
return new StringBuilder()
.append("接收人地址: ").append(to)
.append(",发送人地址: ").append(form)
.append(",发送标题: ").append(subject)
.append(",发送内容: ").append(getEmailText())
.append(",发送网页内容: ").append(getEmailHtmlText())
.toString();
}
public String getEmailText(){
StringBuilder sbr = new StringBuilder();
List<String> list = getTexts();
for(String text : list){
sbr.append(text);
}
return sbr.toString();
}
public String getEmailHtmlText(){
StringBuilder sbr = new StringBuilder();
List<String> list = getHtmlTexts();
for(String text : list){
sbr.append(text);
}
return sbr.toString();
}
public List<String> getTexts() {
return texts;
}
public void setTexts(List<String> texts) {
this.texts = texts;
}
public List<String> getHtmlTexts() {
return htmlTexts;
}
public void setHtmlTexts(List<String> htmlTexts) {
this.htmlTexts = htmlTexts;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCitName() {
return citName;
}
public void setCitName(String citName) {
this.citName = citName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
3 MailType.java
public enum MailType {
/**
* 图片类型
* */
IMG,
/**
* 文件类型
* */
FILE,
/**
* 网络类型
* */
URL;
@Override
public String toString() {
String message = null;
switch (this) {
case IMG :
message = ",包含图片";
case URL :
message = ",包含网络文件";
default:
message = ",包含附件";
break;
}
return message;
}
}
4 SendMailType.java
public enum SendMailType {
/**
* 文本类型
* */
TEXT,
/**
* 文本及附件类型
* */
FILE,
/**
* HTML类型,包含文本及附件类型及网络资源
* **/
HTML;
@Override
public String toString() {
String message = null;
switch (this) {
case TEXT:
message = "发送文本消息";
break;
case FILE:
message = "发送附件消息";
break;
case HTML :
message = "发送html消息";
break;
}
return message;
}
}
5 其它的类请参见S
pring之Email<封装了常用的四种发送Email的方法(TEXT,HTML,IMG,FILE)>
http://liuzidong.iteye.com/blog/1114783
页:
[1]