参考资料
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