专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 人工智能

Commons: 打包Apache Commons Email简化邮件发送

发布时间:2011-07-03 09:08:50 文章来源:www.iduyao.cn 采编人员:星星草
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(){
		
		//检查接收人地址是否为空  
        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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: