Java-Java mail詳解

郵件服務器協議


1.SMTP

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的服務器,就可以把E-mail寄到收信人的服務器上了,整個過程只要幾分鐘。SMTP服務器則是遵循SMTP協議的發送郵件服務器,用來發送或中轉發出的電子郵件。


2.POP

POP是一種郵局協議,目前爲第3個版本,即衆所周知的POP3。POP定義了一種用戶如何獲得郵件的機制。它規定了每個用戶使用一個單獨的郵箱。大多數人在使用POP時所熟悉的功能並非都被支持,例如查看郵箱中的新郵件數量。而這個功能是微軟的Outlook內建的,那麼就說明微軟Outlook之類的郵件客戶端軟件是通過查詢最近收到的郵件來計算新郵件的數量來實現前面所說的功能。因此在我們使用JavaMail API時需要注意,當需要獲得如前面所講的新郵件數量之類的信息時,我們不得不自己進行計算。

3.IMAP

IMAP(Internet Mail Access Protocol,Internet郵件訪問協議)以前稱作交互郵件訪問協議(Interactive Mail Access Protocol)。IMAP是斯坦福大學在1986年開發的一種郵件獲取協議。它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協議從郵件服務器上獲取郵件的信息,下載郵件等。當前的權威定義是RFC3501。IMAP協議運行在TCP/IP協議之上,使用的端口是143。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作。


4.MIME

MIME並不是用於傳送郵件的協議,它作爲多用途郵件的擴展定義了郵件內容的格式:信息格式、附件格式等等。


5.使用Smtp服務器發送郵件

1、打開cmd,輸入命令如下(以新浪郵箱爲例):
telent smtp.sina.com 25
2、連接以後,打開新窗口,輸入:
ehlo
3、輸入命令
auth login
4、輸入用戶名
注:需要使用base64編碼轉換
5、輸入密碼
(同樣需要進行編碼轉換)
6、開始發郵件
mail from: <[email protected]>   //發件人
rcpt to: <[email protected]>  //收件人
data  //表示開始輸入郵件內容
from: <[email protected]>    //郵件主題顯示的發件人
to: xxxx
subject:
date:
    //此處需空一行,上述四行爲郵件頭部內容
xxxxxxxxx    //內容
.        //以英文符號的句號結束,表示郵件書寫完畢
//發送成功
quit    //退出
注:在書寫過程中,應該按照順序書寫每一個字母,如果字母書寫錯誤就會出現
錯誤提示,同時在書寫<[email protected]>時也應該按照順序進行,不能先寫出<>再寫

裏邊的內容。


安裝

1.Java mail

包含開發java mail所需要的API

下載:http://pan.baidu.com/s/1geXlZoB

2.JavaBeans Activation Framework

對任何數據塊的分類、以及對它們的處理的特性。這些特性是JavaMail API需要的。

下載:http://pan.baidu.com/s/1gfLWY8F


Java mail核心類講解

1.Session

Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發郵件的工作都是基於這個會話的。Session對象利用了java.util.Properties對象獲得了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息。

Session類的構造方法是私有的,所以可以使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個默認的Session對象:

Properties props = new Properties();

Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()這個靜態工廠方法獲得自定義的Session: 

Properties props = new Properties();

Session session = Session.getInstance(props, null);

從上面的兩個例子中不難發現,getDefaultInstance()和getInstance()方法的第二個參數都是null,這是因爲在上面的例子中並沒有使用到郵件授權,下文中將對授權進行詳細介紹。

從很多的實例看,在對mail server進行訪問的過程中使用共享的Session是足夠的,即使是工作在多個用戶郵箱的模式下也不例外。


2.Message

建立了Session對象後,便可以構造發送的信息體了。在這裏SUN提供了Message類型來幫助開發者完成這項工作。由於Message是一個抽象類,大多數情況下,我們使用javax.mail.internet.MimeMessage這個子類,該類是使用MIME類型、MIME信息頭的郵箱信息。信息頭只能使用US-ASCII字符,而非ASCII字符將通過編碼轉換爲ASCII的方式使用。

爲了建立一個MimeMessage對象,必須將Session對象作爲MimeMessage構造方法的參數傳入:

MimeMessage message = new MimeMessage(session);

注意:對於MimeMessage類來講存在着多種構造方法,比如使用輸入流作爲參數的構造方法。

在建立了MimeMessage對象後,我們需要設置它的各個part,對於MimeMessage類來說,這些part就是MimePart接口。

最基本的設置信息內容的方法就是通過表示信息內容和類型的參數調用setContent()方法:

message.setContent("Hello mail", "text/plain");

然而,如果我們所使用的MimeMessage中信息內容是文本的話,我們便可以直接使用setText()方法來方便的設置文本內容。

message.setText("Hello mail");

前面所講的兩種方法,對於文本信息,後者更爲合適。而對於其它的一些信息類型,比如HTML信息,則要使用前者。

需要注意的是,使用setSubject()方法對郵件設置郵件主題:

message.setText("Hello mail");

3.Address

Address,跟Message一樣,Address類也是一個抽象類,所以需要使用javax.mail.internet.InternetAddress這個子類。
通過傳入代表郵件地址的字符串,可以建立一個郵件地址類:

Address address = new InternetAddress("[email protected]"); 
如果要在郵件地址後面增加名字的話,可以通過傳遞兩個參數:代表郵件地址和名字的字符串來建立一個具有郵件地址和名字的郵件地址類:
Address address = new InternetAddress("[email protected]", "swxctx"); 
在建立了郵件地址類後,可以通過message的setFrom()和setReplyTo()兩種方法設置郵件的發信人:
message.setFrom(address);//發件人
message.setReplyTo(address);//收件人
若在郵件中存在多個發信人地址,可用addForm()方法增加發信人:
Address address[ ] = ...;message.addFrom(address);
爲了設置收信人,可使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來區分收信人的類型:
message.addRecipient(type, address)
下面是Message.RecipientType的三個常量:
Message.RecipientType.TO //收件人
Message.RecipientType.CC //抄送
Message.RecipientType.BCC //密送
因此,如果我們要發送郵件給某人,併發送一個副本給另一人的話,下面的方法將被用到:
Address toAddress = new InternetAddress([email protected]);
Address ccAddress = new InternetAddress([email protected]);
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
JavaMail API並沒有提供檢查郵件地址有效性的機制。當然我們可以自己完成這個功能:驗證郵件地址的字符是否按照RFC822規定的格式書寫或者通過DNS服務器上的MX記錄驗證等。

4.Authenticator

像java.net類那樣,JavaMail API通過使用授權者類(Authenticator)以用戶名、密碼的方式訪問那些受到保護的資源,在這裏“資源”就是指郵件服務器。

在javax.mail包中可以找到這個JavaMail的授權者類(Authenticator)。

在使用Authenticator這個抽象類時,必須採用繼承該抽象類的方式,並且該繼承類必須具有返回PasswordAuthentication對象(用於存儲認證時要用到的用戶名、密

碼)getPasswordAuthentication()方法。並且要在Session中進行註冊,使Session能夠了解在認證時該使用哪個類。

下面代碼片斷中的MyAuthenticator就是一個Authenticator的子類。

Properties props = new Properties(); 
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

5.Transport

在發送信息時,Transport類將被用到。這個類實現了發送信息的協議(通稱爲SMTP),此類是一個抽象類,可以使用這個類的靜態方法send()來發送消息,如下:

Transport.send(message);
我們也可由Session獲得相應協議對應的Transport實例。

通過傳遞用戶名、密碼、郵件服務器主機名等參數建立與郵件服務器的連接,並使用sendMessage()方法將信息發送,最後關閉連接,如下示例:

message.saveChanges(); 
Transport transport = session.getTransport("smtp");//使用smtp服務器
transport.connect(host, username, password);//連接服務器
transport.sendMessage(message, message.getAllRecipients());//發送消息
transport.close();//關閉連接
注意:如果需要在發送郵件過程中監控mail命令的話,可以在發送前設置debug標誌:
session.setDebug(true);

6.Store和Folder

接收郵件和發送郵件很類似都要用到Session。但是在獲得Session後,需要從Session中獲取特定類型的Store,然後連接到Store,

這裏的Store代表了存儲郵件的郵件服務器。在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。

Store store = session.getStore("pop3");
store.connect(host, username, password);
在連接到Store後,一個Folder對象即目錄對象將通過Store的getFolder()方法被返回,即可從這個Folder中讀取郵件信息:
Folder folder = store.getFolder("INBOX");//獲取到目錄(特定)
folder.open(Folder.READ_ONLY);//以只讀方式打開目錄
Message message[] = folder.getMessages();//得到消息數組
注:對於POP3協議只有一個名爲INBOX的Folder有效,而對於IMAP協議,我們可以訪問多個Folder。

而且SUN在設計Folder的getMessages()方法時採取了很智能的方式:首先接收新郵件列表,然後再需要的時候(比如讀取郵件內容)才從郵件服務器讀取郵件內容。

在讀取郵件時,可以用Message類的getContent()方法接收郵件或是writeTo()方法將郵件保存,getContent()方法只接收郵件內容(不包含郵件頭),而writeTo()方法將包括郵件頭。

System.out.println(((MimeMessage)message).getContent());
在讀取郵件內容後,關閉Folder和Store。
folder.close(aBoolean);
store.close();
傳遞給Folder.close()方法的boolean 類型參數表示是否在刪除操作郵件後更新Folder。


實例練習

1.發送郵件

在獲得了Session後,建立並填入郵件信息,然後發送它到郵件服務器。這便是使用Java Mail API發送郵件的過程,在發送郵件之前,

需要設置SMTP服務器:通過設Properties的mail.smtp.host屬性。

String host = ...;//smtp服務器名
String from = ...;//發件人
String to = ...; //收件人
Properties props = System.getProperties();
//  服務器認證
props.put("mail.smtp.host", host);
// 獲取session
Session session = Session.getDefaultInstance(props, null);
//定義消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));//發件人
message.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));  收件人
message.setSubject("Hello JavaMail");//主題
message.setText("Welcome to JavaMail");//正文
// 發送消息
Transport.send(message);
由於建立郵件信息和發送郵件的過程中可能會拋出異常,所以需要將上面的代碼放入到try-catch結構塊中。


2.接收郵件

爲了在讀取郵件,我們獲得了session,並且連接到了郵箱的相應store,打開相應的Folder,然後得到我們想要的郵件,當然別忘記了在結束時關閉連接。

String host = ...;//服務器
String username = ...;//郵箱
String password = ...;//密碼 
Properties props = new Properties();
//獲取session
Session session = Session.getDefaultInstance(props, null);
// 獲取store
Store store = session.getStore("pop3");//pop3服務器
store.connect(host, username, password); //連接
// 得到文件夾
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
//  得到文件消息
Message message[] = folder.getMessages();
for (int i=0, n=message.length; i<n;i++) {
System.out.println(i+":"+message[i].getFrom()[0]
+"\t"+message[I].getSubject());}  
//關閉連接
folder.close(false);
store.close();
上面的代碼所作的是從郵箱中讀取每個郵件,並且顯示郵件的發信人地址和主題。

下面的代碼片斷有效的說明了如何讀取郵件內容,在顯示每個郵件發信人和主題後,將出現用戶提示從而得到用戶是否讀取該郵件的確認,如果輸入YES的話,

可用Message.writeTo(java.io.OutputStream os)方法將郵件內容輸出到控制檯上,關於Message.writeTo()的具體用法請看JavaMail API。

BufferedReader reader = new BufferedReader (  new InputStreamReader(System.in));
Message message[] = folder.getMessages();
for (int i=0, n=message.length; i<n;i++){
System.out.println(i+":"+message[i].getFrom()[0]+"\t"+message[i].getSubject());
System.out.println("do you want to read message ? "+"[YES TO READ QUIT to end] ");  
String line ='' reader.readLine(); 
 if ("YES".equals(line)) 
{ 
     message[i].writeTo(System.out);  
}
else if ("QUIT".equals(line)) 
{ break;  }}

3.刪除郵件和標誌

設置與message相關的Flags是刪除郵件的常用方法。這些Flags表示了一些系統定義和用戶定義的不同狀態。在Flags類的內部類Flag中預定義了一些標誌:

Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
在使用時需要注意:標誌存在並非意味着這個標誌被所有的郵件服務器所支持。

例如,對於刪除郵件的操作,POP協議不支持上面的任何一個。所以要確定哪些標誌是被支持的。

通過訪問一個已經打開的Folder對象的getPermanetFlags()方法,它將返回當前被支持的Flags類對象。

刪除郵件時,我們可以設置郵件的DELETED標誌: 

message.setFlag(Flags.Flag.DELETED, true);
但是首先要採用READ_WRITE的方式打開Folder:
folder.open(Folder.READ_WRITE);
在對郵件進行刪除操作後關閉Folder時,需要傳遞一個true作爲對刪除郵件的擦除確認。
folder.close(true);
Folder類中另一種用於刪除郵件的方法expunge()也同樣可刪除郵件,但是它並不爲sun提供的POP3實現支持,

而其它第三方提供的POP3實現支持或者並不支持這種方法。

另外,介紹一種檢查某個標誌是否被設置的方法:Message.isSet(Flags.Flag flag)方法,其中參數爲被檢查的標誌。


4.郵件認證

在前面已經學會了如何使用Authenticator類來代替直接使用用戶名和密碼這兩字符串作爲Session.getDefaultInstance()或者Session.getInstance()方法的參數。

我們在此取代了直接使用郵件服務器主機名、用戶名、密碼這三個字符串作爲連接到POP3 Store的方式,使用存儲了郵件服務器主機名信息的屬性文件,

並在獲得Session時傳入自定義的Authenticator實例:

Properties props = System.getProperties();
props.put("mail.pop3.host", host);
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
Store store = session.getStore("pop3");
store.connect();
PopupAuthenticator類繼承了抽象類Authenticator,並且通過重載Authenticator類的getPasswordAuthentication()方法返回PasswordAuthentication類對象。

而getPasswordAuthentication()方法的參數param是以逗號分割的用戶名、密碼組成的字符串。

import javax.mail.*;
import java.util.*;
public class PopupAuthenticator extends Authenticator {  
public PasswordAuthentication getPasswordAuthentication(String param) {
String username, password;    
StringTokenizer st = new StringTokenizer(param, ","); 
username = st.nextToken();
password = st.nextToken(); 
return new PasswordAuthentication(username, password);  
}
} 


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定義的一個類,它提供了對郵件內容的操作命令的訪問、管理了郵件內容操作,是不同的數據源和數據格式之間的一致性接口。

Message forward = new MimeMessage(session);
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(  "Here you go with the original message:\n\n");
// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// Create and fill part for the forwarded contentmessage
BodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());
// Add part to multi part
multipart.addBodyPart(messageBodyPart);
// Associate multi-part with messageforward.
setContent(multipart);
// Send message
Transport.send(forward);

7.使用附件

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

發送帶有附件的郵件

發送帶有附件的郵件的過程有些類似轉發郵件,我們需要建立一個完整郵件的各個郵件體部分,在第一個部分(即我們的郵件內容文字)後,

增加一個具有DataHandler的附件而不是在轉發郵件時那樣複製第一個部分的DataHandler。

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

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

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

最後將兩個郵件體放入到Multipart中,設置郵件內容爲這個容器Multipart,發送郵件。

// Define message
Message 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 messagemessage
BodyPart.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 message
message.setContent(multipart);
// Send the message
Transport.send(message);
如果使用servlet實現發送帶有附件的郵件,則必須上傳附件給servlet,這時需要注意提交頁面form中對編碼類型的設置應爲multipart/form-data。
<form enctype="multipartform-data"     method='post' action="/myservlet"''>
<input type="file"bane="thefile">
<input type= "submit" value="upload">


讀取郵件中的附件

讀取郵件中的附件的過程要比發送它的過程複雜一點。因爲帶有附件的郵件是多部分組成的,必須處理每一個部分獲得郵件的內容和附件。

但是如何辨別郵件信息內容和附件呢?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<n; i++)
{
Part part = Multipart.getBodypart(i));
String disposition = part.getDisposition (); 
IF ((disposition != null) && ((disposition.equals(part.attachment) ||        (disposition.equals(part.inline))) {
savefile(part.getFilename(),
part.getInputStream());}}
下列代碼中使用了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的郵件。

發送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();}


在郵件中包含圖片

如果我們在郵件中使用HTML作爲內容,那麼最好將HTML中使用的圖片作爲郵件的一部分,這樣無論是否在線都會正確的顯示HTML中的圖片。

處理方法就是將HTML中用到的圖片作爲郵件附件並使用特殊的cid URL作爲圖片的引用,這個cid就是對圖片附件的Content-ID頭的引用。

處理內嵌圖片就像向郵件中添加附件一樣,不同之處在於我們必須通過設置圖片附件所在的郵件體部分的header中Content-ID爲一個隨機字符串,

並在HTML中img的src標記中設置爲該字符串。這樣就完成了圖片附件與HTML的關聯。

String file = ...;// Create the message
Message message = new MimeMessage(session);
// Fill its headers
message.setSubject("Embedded Image");
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));
// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = " Hello" + "<CCID_FILE VALUES="\CID:MEMEMEME\" />";
messageBodyPart.setContent(htmlText, "text/html");
// Create a related multi-part to combine the parts
MimeMultipart multipart = new MimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
// Create part for the imagemessageBodyPart = new MimeBodyPart();
// Fetch the image and associate to par
tDataSource fds = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID","");
// Add part to multi-part
multipart.addBodyPart(messageBodyPart);
// Associate multi-part with message
message.setContent(multipart);

9.在郵件中搜索短語

JavaMail API提供了過濾器機制,它被用來建立搜索短語。這個短語由javax.mail.search包中的SearchTerm抽象類來定義,

在定義後我們便可以使用Folder的Search()方法在Folder中查找郵件:

SearchTerm st = ...;Message[] msgs = folder.search(st);
下面有22個不同的類(繼承了SearchTerm類)供我們使用:
AND terms (class AndTerm)
OR terms (class OrTerm)
NOT terms (class NotTerm)
SENT DATE terms (class SentDateTerm)
CONTENT terms (class BodyTerm)
HEADER terms (FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)
使用這些類定義的斷語集合,我們可以構造一個邏輯表達式,並在Folder中進行搜索。

下面是一個實例:在Folder中搜索郵件主題含有“XC”字符串或者發信人地址爲[email protected]的郵件。

SearchTerm st =   new OrTerm(    new SubjectTerm("XC:"), 
new FromStringTerm("[email protected]"));
Message[] msgs = folder.search(st);


結語:

此文來源於網絡與個人總結,感謝DIY的指導。

Java mail已經是多年以前的技術,現在各大公司發展的也比較成熟,但是作爲一名java程序員,掌握java mail也是必須的;

對於基本的操作是需要掌握的,對於高併發與垃圾等處理則是需要深入研究的,畢竟在市場是需要考慮很多東西的;此係個人

觀點,廣大愛好者請多指教。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章