JavaMail(JAVA郵件服務) API詳解 (3)

5.回覆郵件
回覆郵件的方法很簡單:使用Message類的reply()方法,通過配置回覆郵件的收件人地址和主題(如果沒有提供主題的話,系統將默認將“Re:”作爲郵件的主體),這裏不需要設置任何的郵件內容,只要複製發信人或者reply-to到新的收件人。而reply()方法中的boolean參數表示是否將郵件回覆給發送者(參數值爲false),或是恢復給所有人(參數值爲true)。
補充一下,reply-to地址需要在發信時使用setReplyTo()方法設置。
MimeMessage reply = (MimeMessage)message.reply(false);reply.setFrom(new InternetAddress("[email protected]"));reply.setText("Thanks");Transport.send(reply);

6.轉發郵件
轉發郵件的過程不如前面的回覆郵件那樣簡單,它將建立一個轉發郵件,這並非一個方法就能做到。
每個郵件是由多個部分組成,每個部分稱爲一個郵件體部分,是一個BodyPart類對象,對於MIME類型郵件來講就是MimeBodyPart類對象。這些郵件體包含在成爲Multipart的容器中對於MIME類型郵件來講就是MimeMultiPart類對象。在轉發郵件時,我們建立一個文字郵件體部分和一個被轉發的文字郵件體部分,然後將這兩個郵件體放到一個Multipart中。說明一下,複製一個郵件內容到另一個郵件的方法是僅複製它的DataHandler(數據處理者)即可。這是由JavaBeans Activation Framework定義的一個類,它提供了對郵件內容的操作命令的訪問、管理了郵件內容操作,是不同的數據源和數據格式之間的一致性接口。
// Create the message to forwardMessage forward = new MimeMessage(session);// Fill in headerforward.setSubject("Fwd: " + message.getSubject());forward.setFrom(new InternetAddress(from));forward.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));// Create your new message partBodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setText(  "Here you go with the original message:/n/n");// Create a multi-part to combine the partsMultipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);// Create and fill part for the forwarded contentmessageBodyPart = new MimeBodyPart();messageBodyPart.setDataHandler(message.getDataHandler());// Add part to multi partmultipart.addBodyPart(messageBodyPart);// Associate multi-part with messageforward.setContent(multipart);// Send messageTransport.send(forward);

7.使用附件
附件作爲與郵件相關的資源經常以文本、表格、圖片等格式出現,如流行的郵件客戶端一樣,我們可以用JavaMail API從郵件中獲取附件或是發送帶有附件的郵件。

A.發送帶有附件的郵件
發送帶有附件的郵件的過程有些類似轉發郵件,我們需要建立一個完整郵件的各個郵件體部分,在第一個部分(即我們的郵件內容文字)後,增加一個具有DataHandler的附件而不是在轉發郵件時那樣複製第一個部分的DataHandler。

如果我們將文件作爲附件發送,那麼要建立FileDataSource類型的對象作爲附件數據源;如果從URL讀取數據作爲附件發送,那麼將要建立URLDataSource類型的對象作爲附件數據源。

然後將這個數據源(FileDataSource或是URLDataSource)對象作爲DataHandler類構造方法的參數傳入,從而建立一個DataHandler對象作爲數據源的DataHandler。

接着將這個DataHandler設置爲郵件體部分的DataHandler。這樣就完成了郵件體與附件之間的關聯工作,下面的工作就是BodyPart的setFileName()方法設置附件名爲原文件名。

最後將兩個郵件體放入到Multipart中,設置郵件內容爲這個容器Multipart,發送郵件。
// Define messageMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));message.setSubject("Hello JavaMail Attachment");// Create the message part BodyPart messageBodyPart = new MimeBodyPart();// Fill the messagemessageBodyPart.setText("Pardon Ideas");Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);// Part two is attachmentmessageBodyPart = new MimeBodyPart();DataSource source = new FileDataSource(filename);messageBodyPart.setDataHandler(new DataHandler(source));messageBodyPart.setFileName(filename);multipart.addBodyPart(messageBodyPart);// Put parts in messagemessage.setContent(multipart);// Send the messageTransport.send(message);
如果我們使用servlet實現發送帶有附件的郵件,則必須上傳附件給servlet,這時需要注意提交頁面form中對編碼類型的設置應爲multipart/form-data。
     

B.讀取郵件中的附件
讀取郵件中的附件的過程要比發送它的過程複雜一點。因爲帶有附件的郵件是多部分組成的,我們必須處理每一個部分獲得郵件的內容和附件。
但是如何辨別郵件信息內容和附件呢?Sun在Part類(BodyPart類實現的接口類)中提供了getDisposition()方法讓開發者獲得郵件體部分的部署類型,當該部分是附件時,其返回之將是Part.ATTACHMENT。但附件也可以沒有部署類型的方式存在或者部署類型爲Part.INLINE,無論部署類型爲Part.ATTACHMENT還是Part.INLINE,我們都能把該郵件體部分導出保存。
Multipart mp = (Multipart)message.getContent();for (int i=0, n=multipart.getCount(); i下列代碼中使用了saveFile方法是自定義的方法,它根據附件的文件名建立一個文件,如果本地磁盤上存在名爲附件的文件,那麼將在文件名後增加數字表示區別。然後從郵件體中讀取數據寫入到本地文件中(代碼省略)。
// from saveFile()File file = new File(filename);for (int i=0; file.exists(); i++) {  file = new File(filename+i);}
以上是郵件體部分被正確設置的簡單例子,如果郵件體部分的部署類型爲null,那麼我們通過獲得郵件體部分的MIME類型來判斷其類型作相應的處理,代碼結構框架如下:
if (disposition == null) {  // Check if plain  MimeBodyPart mbp = (MimeBodyPart)part;  if (mbp.isMimeType("text/plain")) {    // Handle plain  } else {    // Special non-attachment cases here of     // image/gif, text/html, ...  }...}

8.處理HTML郵件
前面的例子中發送的郵件都是以文本爲內容的(除了附件),下面將介紹如何接收和發送基於HTML的郵件。
A.發送HTML郵件
假如我們需要發送一個HTML文件作爲郵件內容,並使郵件客戶端在讀取郵件時獲取相關的圖片或者文字的話,只要設置郵件內容爲html代碼,並設置內容類型爲text/html即可:
String htmlText = "

Hello

" +   "";message.setContent(htmlText, "text/html"));
請注意:這裏的圖片並不是在郵件中內嵌的,而是在URL中定義的。郵件接收者只有在線時才能看到。
在接收郵件時,如果我們使用JavaMail API接收郵件的話是無法實現以HTML方式顯示郵件內容的。因爲JavaMail API郵件內容視爲二進制流。所以要顯示HTML內容的郵件,我們必須使用JEditorPane或者第三方HTML展現組件。

以下代碼顯示瞭如何使用JEditorPane顯示郵件內容:
if (message.getContentType().equals("text/html")) {  String content = (String)message.getContent();  JFrame frame = new JFrame();  JEditorPane text = new JEditorPane("text/html", content);  text.setEditable(false);  JScrollPane pane = new JScrollPane(text);  frame.getContentPane().add(pane);  frame.setSize(300, 300);  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  frame.show();}

B.在郵件中包含圖片
如果我們在郵件中使用HTML作爲內容,那麼最好將HTML中使用的圖片作爲郵件的一部分,這樣無論是否在線都會正確的顯示HTML中的圖片。處理方法就是將HTML中用到的圖片作爲郵件附件並使用特殊的cid URL作爲圖片的引用,這個cid就是對圖片附件的Content-ID頭的引用。
處理內嵌圖片就像向郵件中添加附件一樣,不同之處在於我們必須通過設置圖片附件所在的郵件體部分的header中Content-ID爲一個隨機字符串,並在HTML中img的src標記中設置爲該字符串。這樣就完成了圖片附件與HTML的關聯。
String file = ...;// Create the messageMessage message = new MimeMessage(session);// Fill its headersmessage.setSubject("Embedded Image");message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));// Create your new message partBodyPart messageBodyPart = new MimeBodyPart();String htmlText = "

Hello

" +   "";messageBodyPart.setContent(htmlText, "text/html");// Create a related multi-part to combine the partsMimeMultipart multipart = new MimeMultipart("related");multipart.addBodyPart(messageBodyPart);// Create part for the imagemessageBodyPart = new MimeBodyPart();// Fetch the image and associate to partDataSource fds = new FileDataSource(file);messageBodyPart.setDataHandler(new DataHandler(fds));messageBodyPart.setHeader("Content-ID","");// Add part to multi-partmultipart.addBodyPart(messageBodyPart);// Associate multi-part with messagemessage.setContent(multipart);
 
發佈了41 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章