本次介紹的是,在javaWeb開發中,咱們難免會遇到發送郵件的需求,好比:用戶註冊帳號,須要激活登陸,以及服務器按期向會員發送禮品信息等。因此參考有關資料,寫了這個MailUtils工具類。html
這個MailUtils工具類底層使用了javax.mail包裏面的API。因此咱們要導入依賴的jar包----mail.jar和activation.jar兩個jar包。java
一封郵件基本由發件人、收件人、抄送人(可選)、標題、正文、附件組成。這裏咱們要介紹的是郵件的發送。服務器
在這個工具類中,主要有兩個方法,session
- createSession(String host,final String userName,final String passWord)app
用來建立一個Session對象,參數爲服務器主機,用戶名,登陸密碼。在方法裏面通過設定主機、指定郵件協議、驗證登陸用戶、密碼等,以此完成Session的建立。工具
- send(Session session,final Mail mail)測試
經過建立的Session和Mail對象,來發送郵件,Mail對象中存放發件人的郵箱和收件人的郵箱。ui
在編寫工具類過程當中,咱們要建立Mail郵件和AttachBean附件兩個實體對象。this
【代碼清單--1】Mail.javaspa
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 }
這裏要測試的就是郵件的正確發送,主要驗證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服務是默認關閉的,此時咱們就要申請把它打開。
最後你們在測試的話嗎,郵件就會發送成功。