Javamail 實作簡單發送郵件(一)
在網際網路剛開始普及的時代,郵件就像古時書信一樣重要。盡管如今實時通訊已經做得非常便捷了,但是郵件依然起着不可替代的作用。許多大廠、學校都有自己的郵件系統,其中比較著名的就屬Gmail、outlook、網易163和QQ等郵箱了。
一、發送郵件原理
兩個重要協定
- SMTP: Simple Mail Transfer Protocol,即簡單郵件傳輸協定,發送郵件的協定,預設端口,25
- POP3: Post Office Protocol 3,即郵局協定,接收郵件的協定,預設端口,110

①、使用者A的電子郵箱為:[email protected],通過郵件用戶端軟體寫好一封郵件,交到QQ的郵件伺服器,這一步使用的協定是SMTP,對應圖示的①;
②、QQ郵箱會根據使用者A發送的郵件進行解析,也就是根據收件位址判斷是否是自己管轄的賬戶,如果收件位址也是QQ郵箱,那麼會直接存放到自己的存儲空間。這裡我們假設收件位址不是QQ郵箱,而是163郵箱,那麼QQ郵箱就會将郵件轉發到163郵箱伺服器,轉發使用的協定也是SMTP,對應圖示的②;
③、163郵箱伺服器接收到QQ郵箱轉發過來的郵件,也會判斷收件位址是否是自己,發現是自己的賬戶,那麼就會将QQ郵箱轉發過來的郵件存放到自己的内部存儲空間,對應圖示的③;
④、使用者A将郵件發送了之後,就會通知使用者B去指定的郵箱收取郵件。使用者B會通過郵件用戶端軟體先向163郵箱伺服器請求,要求收取自己的郵件,對應圖示的④;
⑤、163郵箱伺服器收到使用者B的請求後,會從自己的存儲空間中取出B未收取的郵件,對應圖示⑤;
⑥、163郵箱伺服器取出使用者B未收取的郵件後,将郵件發給使用者B,對應圖示的⑥;最後三步使用者B收取郵件的過程,使用的協定是POP3;
二、代理郵件用戶端(Java)
相信很多人都經曆過郵箱登陸、注冊、接收通知等活動吧!!!郵件的作用很多,尤其在國外異常多!!!我曾經看到過一個視訊,就是Facebook的創始人紮克伯格接收哈佛錄取通知書,視訊中小紮就是打開郵箱檢視的錄取通知書。可想而知,mail是多麼重要而且普及了吧!!!
網站實作郵件登陸、注冊其實并不難。你可以自己申請一個域名,然後建立一個專屬于你的郵箱系統,也可以使用其他大型郵件用戶端的接口,進行學習使用。今天我們主要講第二種,實作接口,發送郵件。
1、開啟第三方登陸(QQ)
主要以QQ郵箱為例,郵箱設定基本都是一樣的隻是位置不同罷了。開啟POP3/SMTP服務和IMAP/SMTP服務,并按提示要求生成授權碼。
2、所需依賴
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
3、編寫代碼實作
public void TestSend() {
/**
* 1、設定郵箱的一些屬性,關于Properties類的介紹
* 2、建立認證對象authenticator,使用自己的郵件賬号和授權碼
* 3、獲得一個session對象,用來儲存認證對象
* 4、建立郵件消息對象message
* 4.1、設定message的發送人,這個要和認證對象的賬号一緻
* 4.2、設定message的接收人
* 4.3、設定郵件的主題和内容
*/
//1 确定連接配接位置
Properties props = System.getProperties();
//1.1擷取qq郵箱smtp伺服器的位址,
props.setProperty("mail.smtp.host", "smtp.qq.com");
//1.2是否進行權限驗證。
props.setProperty("mail.smtp.auth", "true");
//3 建立郵件會話 2、建立認證對象authenticat
Session session = Session.getDefaultInstance(props, new Authenticator() {
//填寫自己的qq郵箱的登入帳号和授權密碼,授權密碼的擷取,在後面會進行講解。
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("[email protected]", "XXXXXXXXX"); //賬戶 授權碼
}
});
//4、建立消息
MimeMessage message = new MimeMessage(session);
//4.1 附帶發件人名字
//設定自定義發件人昵稱
String nickFrom = MimeUtility.encodeText("職能搜尋平台");
String nickTo = MimeUtility.encodeText("酷酷的使用者");
//4.2 設定發信人
message.setFrom(new InternetAddress(nickFrom+"<[email protected]>"));
message.setRecipients(Message.RecipientType.TO, nickTo+"<[email protected]>");
message.setRecipients(Message.RecipientType.BCC, nickFrom+"<[email protected]>");
/**
* 4.2 收件人 (補充)
* 第一個參數:
* RecipientType.TO 代表收件人
* RecipientType.CC 抄送
* RecipientType.BCC 暗送
* 比如A要給B發郵件,但是A覺得有必要給要讓C也看看其内容,就在給B發郵件時,
* 将郵件内容抄送給C,那麼C也能看到其内容了,但是B也能知道A給C抄送過該封郵件
* 而如果是暗送(密送)給C的話,那麼B就不知道A給C發送過該封郵件。
* 第二個參數
* 收件人的位址,或者是一個Address[],用來裝抄送或者暗送人的名單。或者用來群發。可以是相同郵箱伺服器的,也可以是不同的
* 這裡我們發送給我們的qq郵箱
*/
//4.3設定主題和内容
message.setSubject("通過javamail發出!!!");
//文本部分
message.setContent("文本郵件測試", "text/html;charset=UTF-8");
message.setSentDate(new Date());
//發送郵件
Transport.send(message);
}
參考:https://www.cnblogs.com/whgk/p/6506027.html
參考:https://www.cnblogs.com/ysocean/p/7652934.html