JavaMail:郵件發送以及sina、16三、QQ服務器不一樣的解析結果(附圖)

呼…前面的準備終於爲真正實用的 JavaMail 功能、操做——發送郵件打下了基礎,如今咱們想要把一封正文部分是 HTML 格式、幷包含兩個附件的複雜郵件發送給指定的收件人。html

JavaMail 中用於發送郵件的類有 Session 類和 Transport 類,固然也少不了 Message 類。它們之間的進行工做的關係和步驟以下:java

各個類的關係與操做流程:安全

1、建立一個 Properties 對象,該類在 java.util 包中,以鍵-值對的形式設置郵件發送中須要用到的傳輸協議,如 SMTP 協議等;通常的 smtp 服務器都須要用戶身份認證,因此這也要設置爲 true ,以便向 smtp 服務器提交用戶名、密碼等信息;服務器

2、先使用 Session 類中靜態的 getInstance() 或getDefaultInstance() 得到自身對象,此時調用這兩個方法應該傳入上面建立的 Properties 對象;session

3、再用 Session 對象調用 getTransport() 方法得到 Transport 抽象類的具體實現子類對象,如 MimeTransport 類;ide

4、將 Sesson 對象做爲參數建立 MimeMessage 對象,即一封郵件,前面的文章已經有所講述;測試

5、使用 MimeTransport 對象調用相關方法將 MimeMessage 對象發送出去。this

因爲前面的文章已經寫了建立各種郵件的代碼,因此在這裏就直接拿來用而再也不編寫了,建立郵件的代碼放在本文的最後面。咱們使用到了上篇文章中的 WithAttachmentMessage 類做爲一封郵件,稍稍修改一下 from 和 to 就能夠從不一樣的郵箱發送給不一樣的郵箱了。spa

實現代碼:調試

  
  
           
  
  
  1. import java.util.Properties;  
  2.  
  3. import javax.mail.Message;  
  4. import javax.mail.Session;  
  5. import javax.mail.Transport;  
  6. import javax.mail.internet.MimeMessage;  
  7.  
  8. import createMails.WithAttachmentMessage;  
  9. /**  
  10.  * 郵件發送程序  
  11.  * @author haolloyin  
  12.  */ 
  13. public class MessageSender {  
  14.  
  15.     /**  
  16.      * 建立Session對象,此時須要配置傳輸的協議,是否身份認證  
  17.      */ 
  18.     public Session createSession(String protocol) {  
  19.         Properties property = new Properties();  
  20.         property.setProperty("mail.transport.protocol", protocol);  
  21.         property.setProperty("mail.smtp.auth""true");  
  22.  
  23.         Session session = Session.getInstance(property);  
  24.           
  25.         // 啓動JavaMail調試功能,能夠返回與SMTP服務器交互的命令信息  
  26.         // 能夠從控制檯中看一下服務器的響應信息  
  27.         session.setDebug(true);   
  28.         return session;  
  29.     }  
  30.  
  31.     /**  
  32.      * 傳入Session、MimeMessage對象,建立 Transport 對象發送郵件  
  33.      */ 
  34.     public void sendMail(Session session, MimeMessage msg) throws Exception {  
  35.           
  36.         // 設置發件人使用的SMTP服務器、用戶名、密碼  
  37.         String smtpServer = "smtp.sina.com";  
  38.         String user = "test_hao@sina.cn";  
  39.         String pwd = "123456";  
  40.  
  41.         // 由 Session 對象得到 Transport 對象  
  42.         Transport transport = session.getTransport();  
  43.         // 發送用戶名、密碼鏈接到指定的 smtp 服務器  
  44.         transport.connect(smtpServer, user, pwd);  
  45.  
  46.         transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));  
  47.         transport.close();  
  48.     }  
  49.  
  50.     // 測試:發送郵件  
  51.     public static void main(String[] args) throws Exception {  
  52.         MessageSender sender = new MessageSender();  
  53.           
  54.         // 指定使用SMTP協議來建立Session對象  
  55.         Session session = sender.createSession("smtp");  
  56.         // 使用前面文章所完成的郵件建立類得到 Message 對象  
  57.         MimeMessage mail = new WithAttachmentMessage().createMessage(session);  
  58.         sender.sendMail(session, mail);  
  59.     }  

測試發送結果(猜測:不一樣的 smtp 服務器對於同一郵件會有不一樣的解析格式、規範):

一、發送到 163 郵箱

163 將咱們的正文部分的HTML 文本和圖片都變成附件了,真奇怪,多是由於正文是 HTML 格式。

MailSender01

MailSender02

二、發送到 sina 郵箱:

比 163 郵箱稍好一些,附件有3個,內嵌在 HTML 正文中的圖片被看成附件處理了,正文中的純文本被解析了,但是內嵌在 HTML 中的圖片卻顯示不了。

MailSender03

MailSender04

三、發送到 QQ 郵箱:

效果與咱們預期的徹底一致!附件有兩個,正文文本、圖片所有正確解析並顯示出來。

MailSender05

PK結果:

目前淺顯的來看,應該是 QQ 郵箱最厲害了,此外,QQ 郵箱接收郵件的速度最快,不行能夠試一試。固然,安全性什麼的就不能今後處有所瞭解了。

深刻:

因爲在代碼中開啓了 JavaMail API 的調試功能,因此能夠從控制檯輸出的響應信息中瞭解到更多的信息,特別是關於上面不一樣 smtp 服務器解析同一封郵件的過程,它可能跟咱們傳輸、發送過去的具體過程有關。

小結:

如今回想起來,前面使用 telnet 程序在控制檯中麻煩地手工發送純文本郵件是多麼低效。JavaMail API 將這一切與底層協做的過程、操做都封裝掉了,這就是軟件開發的目的吧。

本文使用到上一篇文章中的程序代碼:

  
  
           
  
  
  1. import java.io.FileOutputStream;  
  2. import java.util.Properties;  
  3.  
  4. import javax.activation.DataHandler;  
  5. import javax.activation.FileDataSource;  
  6. import javax.mail.Message;  
  7. import javax.mail.Session;  
  8. import javax.mail.internet.InternetAddress;  
  9. import javax.mail.internet.MimeBodyPart;  
  10. import javax.mail.internet.MimeMessage;  
  11. import javax.mail.internet.MimeMultipart;  
  12.  
  13. /**  
  14.  * 建立內含附件、圖文並茂的郵件  
  15.  * @author haolloyin  
  16.  */ 
  17. public class WithAttachmentMessage {  
  18.  
  19.     /**  
  20.      * 根據傳入的文件路徑建立附件並返回  
  21.      */ 
  22.     public MimeBodyPart createAttachment(String fileName) throws Exception {  
  23.         MimeBodyPart p_w_uploadPart = new MimeBodyPart();  
  24.         FileDataSource fds = new FileDataSource(fileName);  
  25.         p_w_uploadPart.setDataHandler(new DataHandler(fds));  
  26.         p_w_uploadPart.setFileName(fds.getName());  
  27.         return p_w_uploadPart;  
  28.     }  
  29.  
  30.     /**  
  31.      * 根據傳入的郵件正文body和文件路徑建立圖文並茂的正文部分  
  32.      */ 
  33.     public MimeBodyPart createContent(String body, String fileName)  
  34.             throws Exception {  
  35.         // 用於保存最終正文部分  
  36.         MimeBodyPart contentBody = new MimeBodyPart();  
  37.         // 用於組合文本和圖片,"related"型的MimeMultipart對象  
  38.         MimeMultipart contentMulti = new MimeMultipart("related");  
  39.  
  40.         // 正文的文本部分  
  41.         MimeBodyPart textBody = new MimeBodyPart();  
  42.         textBody.setContent(body, "text/html;charset=gbk");  
  43.         contentMulti.addBodyPart(textBody);  
  44.  
  45.         // 正文的圖片部分  
  46.         MimeBodyPart jpgBody = new MimeBodyPart();  
  47.         FileDataSource fds = new FileDataSource(fileName);  
  48.         jpgBody.setDataHandler(new DataHandler(fds));  
  49.         jpgBody.setContentID("logo_jpg");  
  50.         contentMulti.addBodyPart(jpgBody);  
  51.  
  52.         // 將上面"related"型的 MimeMultipart 對象做爲郵件的正文  
  53.         contentBody.setContent(contentMulti);  
  54.         return contentBody;  
  55.     }  
  56.  
  57.     /**  
  58.      * 根據傳入的 Seesion 對象建立混合型的 MIME消息  
  59.      */ 
  60.     public MimeMessage createMessage(Session session) throws Exception {  
  61.  
  62.         String from = "test_hao@sina.cn";  
  63.         String to = "test_hao@163.com";  
  64.           
  65.         String subject = "建立內含附件、圖文並茂的郵件!";  
  66.         String body = "<h4>內含附件、圖文並茂的郵件測試!!!</h4> </br>" 
  67.                 + "<a href = http://haolloyin.blog.51cto.com/> 螞蟻</a></br>" 
  68.                 + "<img src = \"cid:logo_jpg\"></a>";  
  69.  
  70.         MimeMessage msg = new MimeMessage(session);  
  71.         msg.setFrom(new InternetAddress(from));  
  72.         msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));  
  73.         msg.setSubject(subject);  
  74.  
  75.         // 建立郵件的各個 MimeBodyPart 部分  
  76.         MimeBodyPart p_w_upload01 = createAttachment("F:\\java\\Hello_JavaMail.java");  
  77.         MimeBodyPart p_w_upload02 = createAttachment("F:\\java\\Hello_JavaMail.7z");  
  78.         MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg");  
  79.  
  80.         // 將郵件中各個部分組合到一個"mixed"型的 MimeMultipart 對象  
  81.         MimeMultipart allPart = new MimeMultipart("mixed");  
  82.         allPart.addBodyPart(p_w_upload01);  
  83.         allPart.addBodyPart(p_w_upload02);  
  84.         allPart.addBodyPart(content);  
  85.  
  86.         // 將上面混合型的 MimeMultipart 對象做爲郵件內容並保存  
  87.         msg.setContent(allPart);  
  88.         msg.saveChanges();  
  89.         return msg;  
  90.     }  
  91.  
  92.     // 測試生成郵件  
  93.     public static void main(String[] args) throws Exception {  
  94.         WithAttachmentMessage mail = new WithAttachmentMessage();  
  95.         Session session = Session.getDefaultInstance(new Properties());  
  96.         MimeMessage message = mail.createMessage(session);  
  97.         message.writeTo(new FileOutputStream("withAttachmentMail.eml"));  
  98.     }  

個人相關文章:

圖解使用Telnet程序手工發送郵件

簡單的E-mail發送端程序的Java實現

圖解使用telnet程序手工接收郵件及其過程

JavaMail:建立內含附件、圖文並茂的郵件

相關文章
相關標籤/搜索