前言:
最近由於實現web商城的自動發送郵件功能的需求,故涉獵的郵箱協議的內部原理。現將簡單版的Java Mail實例做個代碼展示,並附上其中可能出現的bug貼出,方便感興趣的讀者進行測試!
1.載入相關jar包
客戶端傳輸郵件需要用的jar包:activation.jar和mail.jar
(下載:https://github.com/SeaSky0606/share)
2.JavaMail代碼實現
1 package com.seasky.mail; 2 3 import java.util.Properties; 4 5 import javax.mail.Address; 6 import javax.mail.Message; 7 import javax.mail.MessagingException; 8 import javax.mail.Session; 9 import javax.mail.Transport; 10 import javax.mail.internet.InternetAddress; 11 import javax.mail.internet.MimeMessage; 12 13 public class Mail { 14 15 /** 16 * @param args 17 */ 18 public static void main(String[] args) { 19 20 //屬性設置,創建會話 21 Properties properties = new Properties(); 22 properties.setProperty("mail.transport.protocol", "smtp"); 23 Session session = Session.getInstance(properties); 24 session.setDebug(true); //設置debug模式 25 //創建Message對象 26 Message message = new MimeMessage(session); 27 try { 28 message.setSubject("我是主題"); 29 message.setFrom(new InternetAddress("soft03_test@sina.com")); 30 message.setContent("<h2>我是內容</h2>", "text/html;charset=utf-8"); 31 32 //創建接口,並連接(登錄) 33 Transport transport = session.getTransport(); 34 transport.connect("smtp.sina.com", "soft03_test", "soft03_test"); 35 //發送郵件 36 transport.sendMessage(message, new Address[]{new InternetAddress("123456789@qq.com"), 37 new InternetAddress("soft03_test@sina.com")}); 38 } catch (MessagingException e) { 39 e.printStackTrace(); 40 }finally{ 41 System.out.println("---finish--"); 42 } 43 44 } 45 46 }
登錄測試郵箱查看:
3.Debug模式下打印出smtp連接建立的過程
DEBUG: setDebug: JavaMail version 1.4.1 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth false DEBUG SMTP: trying to connect to host "smtp.sina.com", port 25, isSSL false 220 smtp-2-33.smtpsmail.fmail.yf.sinanode.com ESMTP DEBUG SMTP: connected to host "smtp.sina.com", port: 25 EHLO CJH 250-smtp-2-33.smtpsmail.fmail.yf.sinanode.com 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-STARTTLS 250 8BITMIME DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" DEBUG SMTP: Found extension "STARTTLS", arg "" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Attempt to authenticate AUTH LOGIN 334 VXNlcm5hbWU6 c29mdDAzX3Rlc3Q= 334 UGFzc3dvcmQ6 c29mdDAzX3Rlc3Q= 235 OK Authenticated DEBUG SMTP: use8bit false MAIL FROM:<soft03_test@sina.com> 250 ok RCPT TO:<123456789@qq.com> 250 ok RCPT TO:<soft03_test@sina.com> 250 ok DEBUG SMTP: Verified Addresses DEBUG SMTP: 123456789@qq.com DEBUG SMTP: soft03_test@sina.com DATA 354 End data with <CR><LF>.<CR><LF> From: soft03_test@sina.com Message-ID: <535071474.0.1446284102239.JavaMail.Administrator@CJH> Subject: =?UTF-8?B?5oiR5piv5Li76aKY?= MIME-Version: 1.0 Content-Type: text/html;charset=utf-8 Content-Transfer-Encoding: base64 PGgyPuaIkeaYr+WGheWuuTwvaDI+ . 250 ok queue id 2476333014883 ---finish--
4.常見問題:
1.出現包沖突
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
沒有找到相關的內部類錯誤,即說明存在 jar包沖突!
解決方法:
去除開發環境的內部javaEE包,或者刪除其內部java.mail下面的所有類!
2.注冊的實驗郵箱測試失敗
535 5.7.8 authentication failed
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:319)
at javax.mail.Service.connect(Service.java:169)
at com.seasky.mail.JMailTest.main(JMailTest.java:35)
---finish--
解決方法:
由於實驗測試郵箱可能需要開通vip,所以建議直接使用本樣例中的新浪郵箱的賬號密碼(soft03_test/soft03_test)!