本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等。所以参考有关资料,写了这个MailUtils工具类。
1.MailUtils的概述
这个MailUtils工具类底层使用了javax.mail包里面的API。所以我们要导入依赖的jar包----mail.jar和activation.jar两个jar包。
一封邮件基本由发件人、收件人、抄送人(可选)、标题、正文、附件组成。这里我们要介绍的是邮件的发送。
在这个工具类中,主要有两个方法,
- createSession(String host,final String userName,final String passWord)
用来创建一个Session对象,参数为服务器主机,用户名,登录密码。在方法里面经过设定主机、指定邮件协议、验证登录用户、密码等,以此完成Session的创建。
- send(Session session,final Mail mail)
通过创建的Session和Mail对象,来发送邮件,Mail对象中存放发件人的邮箱和收件人的邮箱。
2.MailUtils的实现
在编写工具类过程中,我们要创建Mail邮件和AttachBean附件两个实体对象。
【代码清单--1】Mail.java
1 package com.lxf.bean; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 邮件类 8 * 包括:发件人,收件人,抄送(可选),主题,正文,附件 9 * @author Administrator 10 * 11 */ 12 public class Mail 13 { 14 //发件人 15 private String from; 16 //收件人 17 private StringBuilder toAddress = new StringBuilder(); 18 //抄送 19 private StringBuilder ccAddress = new StringBuilder(); 20 //主题 21 private String subject; 22 //正文 23 private String content; 24 //附件列表 25 private List<AttachBean> list = new ArrayList<AttachBean>(); 26 27 public Mail() 28 { 29 } 30 31 public Mail(String from, String to) 32 { 33 this(from,to,null,null); 34 } 35 36 public Mail(String from,String to,String subject,String content) 37 { 38 this.from = from; 39 this.toAddress.append(to); 40 this.subject = subject; 41 this.content = content; 42 } 43 44 public String getFrom() 45 { 46 return from; 47 } 48 public void setFrom(String from) 49 { 50 this.from = from; 51 } 52 53 public String getToAddress() 54 { 55 return toAddress.toString(); 56 } 57 58 public void ADDToAddress(String to) 59 { 60 if(this.toAddress.length() > 0) 61 { 62 toAddress.append(","); 63 } 64 this.toAddress .append(to); 65 } 66 67 public String getCcAddress() 68 { 69 return ccAddress.toString(); 70 } 71 public void addCcAddress(String cc) 72 { 73 if(this.ccAddress.length() > 0) 74 { 75 this.ccAddress.append(","); 76 } 77 this.ccAddress.append(cc); 78 } 79 80 public String getSubject() 81 { 82 return subject; 83 } 84 public void setSubject(String subject) 85 { 86 this.subject = subject; 87 } 88 public String getContent() 89 { 90 return content; 91 } 92 public void setContent(String content) 93 { 94 this.content = content; 95 } 96 public List<AttachBean> getAttachs() 97 { 98 return list; 99 } 100 public void setList(AttachBean attachBean) 101 { 102 this.list.add(attachBean); 103 } 104 105 }
【代码清单--2】 AttachBean.java(附件:文件序号、文件、文件名)
1 package com.lxf.bean; 2 3 import java.io.File; 4 5 public class AttachBean 6 { 7 //序号,文件,文件名 8 private String cid; 9 private File file; 10 private String fileName; 11 12 public AttachBean() 13 { 14 } 15 16 public AttachBean(String cid, File file, String fileName) 17 { 18 super(); 19 this.cid = cid; 20 this.file = file; 21 this.fileName = fileName; 22 } 23 24 public String getCid() 25 { 26 return cid; 27 } 28 29 public void setCid(String cid) 30 { 31 this.cid = cid; 32 } 33 34 public File getFile() 35 { 36 return file; 37 } 38 39 public void setFile(File file) 40 { 41 this.file = file; 42 } 43 44 public String getFileName() 45 { 46 return fileName; 47 } 48 49 public void setFileName(String fileName) 50 { 51 this.fileName = fileName; 52 } 53 54 }
【代码清单--3】MailUtils.java 邮件工具类 ---用来发送邮件
1 package com.lxf.myCommonUtils; 2 3 import java.io.IOException; 4 import java.util.List; 5 import java.util.Properties; 6 7 import javax.mail.Authenticator; 8 import javax.mail.Message.RecipientType; 9 import javax.mail.MessagingException; 10 import javax.mail.PasswordAuthentication; 11 import javax.mail.Session; 12 import javax.mail.Transport; 13 import javax.mail.internet.InternetAddress; 14 import javax.mail.internet.MimeBodyPart; 15 import javax.mail.internet.MimeMessage; 16 import javax.mail.internet.MimeMultipart; 17 import javax.mail.internet.MimeUtility; 18 19 import com.lxf.bean.AttachBean; 20 import com.lxf.bean.Mail; 21 22 /** 23 * 邮件工具类 ---用来发送邮件 24 * 该工具类底层运用到了javaMail,因此需要引入两个jar包 25 * 26 * mail.jar activator.jar 27 * @author Administrator 28 * 29 */ 30 public class MailUtils 31 { 32 //创建session对象。 33 public static Session createSession(String host,final String userName,final String passWord) 34 { 35 Properties prop = new Properties(); 36 //设定主机 37 prop.setProperty("mail.host", host); 38 //指定邮件协议,验证为true 39 prop.setProperty("mail.smtp.auth", "true"); 40 41 //创建验证器 42 Authenticator auth = new Authenticator(){ 43 public PasswordAuthentication getPasswordAuthenticator() 44 { 45 return new PasswordAuthentication(userName,passWord); 46 } 47 }; 48 return Session.getInstance(prop, auth); 49 } 50 51 public static void send(Session session,final Mail mail) throws MessagingException, MessagingException, IOException 52 { 53 //创建邮件对象 54 MimeMessage msg = new MimeMessage(session); 55 //设置发件人 56 msg.setFrom(new InternetAddress(mail.getFrom())); 57 msg.addRecipients(RecipientType.TO, mail.getToAddress()); 58 59 //设置抄送 60 String cc = mail.getCcAddress(); 61 if(!cc.isEmpty()) 62 { 63 msg.addRecipients(RecipientType.CC, cc); 64 } 65 66 //设置主题 67 msg.setSubject(mail.getSubject()); 68 69 //创建部件集对象 70 MimeMultipart parts = new MimeMultipart(); 71 72 //创建一个部件 73 MimeBodyPart part = new MimeBodyPart(); 74 75 //设置邮件正文内容 76 part.setContent(mail.getContent(),"text/html;charset=utf-8"); 77 //把部件加到部件集中 78 parts.addBodyPart(part); 79 80 //获取所有附件 81 List<AttachBean> list = mail.getAttachs(); 82 if(null != list) 83 { 84 for(AttachBean attach :list) 85 { 86 //创建一个部件 87 MimeBodyPart attachPart = new MimeBodyPart(); 88 //设置附件文件 89 attachPart.attachFile(attach.getFile()); 90 //设置附件文件名 91 attachPart.setFileName(MimeUtility.encodeText(attach.getFileName())); 92 String cid = attach.getCid(); 93 if(cid != null) 94 { 95 attachPart.setContentID(cid); 96 } 97 parts.addBodyPart(attachPart); 98 } 99 } 100 //给邮件设置内容 101 msg.setContent(parts); 102 Transport.send(msg); 103 } 104 }
3.MailUtils的测试
这里要测试的就是邮件的正确发送,主要验证send()方法。
【代码清单--4】
1 package com.lxf.test; 2 3 import java.io.IOException; 4 5 import javax.mail.MessagingException; 6 import javax.mail.Session; 7 8 import org.junit.Test; 9 10 import com.lxf.bean.Mail; 11 import com.lxf.myCommonUtils.MailUtils; 12 13 14 /** 15 * 邮件测试类 16 * @author Administrator 17 * 18 */ 19 public class MailTest 20 { 21 @Test 22 public void testSend() throws MessagingException, IOException 23 { 24 //创建Session对象,指定主机,用户名,密码 25 //这里假设用163邮箱,smtp是邮件协议。 26 Session session = MailUtils.createSession("smtp.163.com", "这里输入邮箱@前面的信息", "邮箱密码"); 27 28 //创建一个Mail对象,设置发件人和收件人 29 Mail mail = new Mail("你的邮箱完整信息","对方邮箱完整信息"); 30 //设置主题 31 mail.setSubject("给**的100封信"); 32 //设置正文 33 mail.setContent("这时第1封信"); 34 //发送邮件 35 MailUtils.send(session, mail); 36 } 37 }
这里要说的是,当你在测试的话,可能会下面抛出这个异常。
这时因为你的邮箱在注册的时候没有勾选开启,用代码发送邮件的协议,也就是上面的那个smtp协议,所有,我们要正确开启,才能把邮件发送出去。
这里我已QQ邮箱为例,来介绍一下怎么开启smtp协议。
1.打开你的qq邮箱,点击你的用户名,则进入【邮箱设置】界面;
2.在【账户】信息栏,下拉,找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”项。
大家可以看到,SMTP服务是默认关闭的,此时我们就要申请把它打开。
最后大家在测试的话吗,邮件就会发送成功。
4.后期补充。