天天看點

Javamail 實作簡單發送郵件(一)

Javamail 實作簡單發送郵件(一)

  在網際網路剛開始普及的時代,郵件就像古時書信一樣重要。盡管如今實時通訊已經做得非常便捷了,但是郵件依然起着不可替代的作用。許多大廠、學校都有自己的郵件系統,其中比較著名的就屬Gmail、outlook、網易163和QQ等郵箱了。

一、發送郵件原理

​ 兩個重要協定

  1. SMTP: Simple Mail Transfer Protocol,即簡單郵件傳輸協定,發送郵件的協定,預設端口,25
  2. POP3: Post Office Protocol 3,即郵局協定,接收郵件的協定,預設端口,110
Javamail 實作簡單發送郵件(一)

①、使用者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服務,并按提示要求生成授權碼。

Javamail 實作簡單發送郵件(一)

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

繼續閱讀