设为首页 收藏本站
查看: 581|回复: 0

[经验分享] Commons: 封装Apache Commons Email简化邮件发送

[复制链接]

尚未签到

发表于 2017-1-10 08:49:15 | 显示全部楼层 |阅读模式
参考资料
1 用Apache Commons Email简化邮件发送
http://www.blogjava.net/fastunit/archive/2008/01/25/177799.html
我测试时是用的是:新浪的邮箱:smtp.sina.com也是可以的
如下设置:
DSC0000.jpg
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)

二 工程图片
DSC0001.jpg
或者你也可以这样,使用打包好的jar:email.commons.util.jar
DSC0002.jpg ,见附件
三 调用说明
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(){
//检查接收人地址是否为空  
String  to = 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 String  to;
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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326296-1-1.html 上篇帖子: Apache中httpd.conf文件的中文翻译 下篇帖子: PHP开发环境搭建(基于Eclipse+Apache+Xdebug)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表