<轉(zhuǎn)>JavaMail的三個(gè)主要類:
1、Session類
Session類表示了一個(gè)基本的郵件會(huì)話過程,它提供了一個(gè)郵件的生存過程。Session對(duì)象需要java.util.Properties對(duì)象對(duì)其配置郵件環(huán)境屬性,它利用Properties對(duì)象來獲取諸如郵件服務(wù)器、用戶名、密碼等信息,以及其他可在整個(gè)應(yīng)用程序中共享的信息。


2、Message類
在創(chuàng)建了一個(gè)郵件會(huì)話Session后,再用Message類提供了一封郵件的所有信息。它是一個(gè)抽象類,必須由其子類來構(gòu)造。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子類,可以使用當(dāng)前的Session對(duì)象創(chuàng)建一個(gè)新的MimeMessage對(duì)象,然后就可以對(duì)其進(jìn)行各種操作。
message.setSubject("This is subject of the e-mail");
//設(shè)置郵件的標(biāo)題
message.setText("Hello,I am a e-mail");
//設(shè)置純文本郵件的內(nèi)容
InternetAddress sender=new InternetAddress("
cx19830801@163.com ");
//InternetAddress類通過一個(gè)合法的e-mail構(gòu)造出e-mail地址對(duì)象
message.setForm(sender);
//設(shè)置郵件的發(fā)送方地址
InternetAddress receiver=new InternetAddress("
Webmaster@hudax.com ");
message.addRecipient(receiver,RecipientType.TO);
//設(shè)置接收方地址
設(shè)置接收方地址使用addRecipient方法,地址類型有三種:
RecipientType.TO:e-mail的發(fā)送地址;
RecipientType.CC:抄送地址,可以為多個(gè);
RecipientType.BCC:暗送地址,可以為多個(gè)。

3、Transport類
郵件發(fā)送類。
郵件發(fā)送方法:send(message);

e.g
Properties props=new Properties();
Session sendsession = Session.getInstance(props, null);
//使用getInstance方法獲取到這個(gè)信息
props.put("mail.smtp.host", "smtp.163.com");
//向?qū)傩灾袑懭隨MTP服務(wù)器的地址,為Session設(shè)置一個(gè)SMTP郵件服務(wù)器
props.put("mail.smtp.auth","true");
//用Properties對(duì)象的put方法設(shè)置了SMTP郵件服務(wù)器需要進(jìn)行權(quán)限的認(rèn)證;
sendsession.setDebug(true);
//用Session對(duì)象的setDebug方法設(shè)置輸出發(fā)送郵件時(shí)的調(diào)試信息;可在Tomcat服務(wù)器上看到同SMTP郵件服務(wù)器交互過程中的輸出信息。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子類,可以使用當(dāng)前的Session對(duì)象創(chuàng)建一個(gè)新的MimeMessage對(duì)象,然后就可以對(duì)其進(jìn)行各種操作。
message.setFrom(new InternetAddress(request.getParameter("from")));
//設(shè)置發(fā)信人地址
message.setRecipient(Message.RecipientType.TO,new InternetAddress(request.getParameter("to")));
//設(shè)置收信人地址
message.setSubject(new String(request.getParameter("subject").getBytes("ISO8859_1"),"GBK"));
//設(shè)置e-mail標(biāo)題
message.setSentDate(new Date());
//設(shè)置e-mail發(fā)送時(shí)間
message.setText(new String(request.getParameter("text").getBytes("ISO8859_1"),"GBK"));
//設(shè)置e-mail內(nèi)容
message.saveChanges();
//保存對(duì)于Email的修改,用message對(duì)象的saveChanges方法將郵件信息保存起來;
Transport transport=sendsession.getTransport("smtp");
//由當(dāng)前的session對(duì)象使用方法getTransport創(chuàng)建并初始化Transport對(duì)象
transport.connect("smtp.163.com","username","password");
//連接到SMTP服務(wù)器
transport.sendMessage(message,message.getAllRecipients());
//發(fā)送e-mail
transport.close();
//關(guān)閉Transport連接

發(fā)送帶有附件的郵件:
1、BodyPart類
BodyPart類表示多部分的MIME信息中某一個(gè)部分的信息內(nèi)容,它是一個(gè)抽象類,需要用其子類MimeBodyPart創(chuàng)建。
BodyPart messageBodyPart=new MimeBodyPart();
通常郵件的正文是一個(gè)BodyPart對(duì)象,附件則是另一個(gè)BodyPart對(duì)象。

2、MultiPart類
MultiPart類表示多部分的MIME信息的內(nèi)容,它是一個(gè)抽象類,需要用其子類MimeMultipart來創(chuàng)建。還可以通過其方法addBodyPart()來創(chuàng)建。
Multipart multipart=new MimeMultipart();
將代表郵件正文的BodyPart對(duì)象和代表郵件附件的BodyPart對(duì)象分別加入到MimeMultipart對(duì)象中。

3、DataSource類
DataSource類表示本地文件和服務(wù)器可以直接訪問的資源,它是一個(gè)抽象類,用其子類FileDataSource來創(chuàng)建。
FileDataSource fds=new FileDataSource("c:/test.doc");

4、DataHandler類
DataHandler為不同的數(shù)據(jù)源和數(shù)據(jù)格式提供提供了一個(gè)統(tǒng)一的接口。
messageBodyPart.setDataHandler(new DataHandler(fds));
附件被封裝到一個(gè)DataHandler對(duì)象,BodyPart對(duì)象可以用方法setDataHandler將封裝了附件的DataHandler對(duì)象加進(jìn)來。

發(fā)送附件時(shí)的處理過程:
BodyPart messageBodyPart=new MimeBodyPart();
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//在要發(fā)送附件時(shí),先建立代表郵件正文的BodyPart對(duì)象,并把它加到Multipart對(duì)象中去
messageBodyPart=new MimeBodyPart();
//建立代表郵件附件部分的BodyPart對(duì)象
DataSource source=new FileDataSource(attachment);
messageBodyPart.setDataHandler(new DataHandler(source));
用setDataHandler方法將獲取到的附件包含進(jìn)來
messageBodyPart.setFileName(attachment);
//設(shè)置附件文件名
multipart.addBodyPart(messageBodyPart);
//將與附件相關(guān)的內(nèi)容設(shè)置好之后,就可以把代表此附件部分的BodyPart對(duì)象加到Multipart對(duì)象中去了,最后將Multipart對(duì)象放到代表郵件信息的Message對(duì)象中,這樣就可以發(fā)送帶有附件的郵件了。


接收郵件:
1、URLName類
URLName類實(shí)際上是對(duì)于某臺(tái)郵件服務(wù)器上某個(gè)用戶的一次操作的唯一標(biāo)識(shí),它的格式為:
協(xié)議名稱://用戶名:密碼@郵件服務(wù)器/
URLName irln=new URLName("pop3://username:password@163.com/");

2、Store類
Store類是用于接收郵件的類,它對(duì)郵件進(jìn)行讀、寫、監(jiān)視、查找等操作。接收郵件時(shí)首先要連接到郵件服務(wù)器上的一個(gè)郵箱,這需要調(diào)用Session對(duì)象的getStore方法來創(chuàng)建一個(gè)Store對(duì)象。
Store store=session.getStore("pop3");
//這個(gè)方法要設(shè)置Store對(duì)象所使用的協(xié)議,通常為POP3;
store.connect("pop.163.com","username","password");
//在創(chuàng)建了Store對(duì)象之后,可以使用它的connect方法連接到遠(yuǎn)程郵件服務(wù)器中的郵箱。

3、Folder類
在連接到郵箱之后,就可以打開包含郵件的消息文件夾了,打開消息文件夾需要先使用Store對(duì)象的getFolder方法創(chuàng)建一個(gè)Folder對(duì)象作為消息文件夾。
Folder folder=store.getFolder("INBOX");
//參數(shù)用來設(shè)置消息文件夾的名字,通常設(shè)為INBOX,因?yàn)镻OP3協(xié)議只支持唯一的消息文件夾INBOX。
使用Folder類的open方法來打開消息文件夾:
folder.open(Folder.READ_ONLY);
它有兩種可選模式:READ_ONLY和READ_WRITE
要從消息文件夾中取出郵件,可以使用Folder類的getMessage方法或getMessages方法。
Message message=inbox.getMessage(i);
//方法getMessage返回以其參數(shù)為索引的Message對(duì)象
Message message[]=folder.getMessages();
//方法getMessages返回一個(gè)Message對(duì)象數(shù)組
int count=folder.getMessageCount();
//使用Folder類的getMessageCount()得到消息文件夾中的郵件總數(shù)

4、Message類
與前面的Message類相同,在這里介紹它在顯示郵件列表和刪除郵件時(shí)所使用的一些方法。
(1)、方法getSubject得到一封郵件的標(biāo)題;
(2)、方法isSet用來判斷一封郵件是否被標(biāo)記為刪除(DELETED)、是否用戶已經(jīng)收取過(SEEN)、是否被回復(fù)過(ANSWERED)、是否是一個(gè)草稿(DRAFT)等等;
(3)、方法setFlag設(shè)置一封郵件為待刪除。

在接收和檢索郵件之后,還要關(guān)閉程序使用到的資源,
folder.close(true);
store.cloase();
這兩個(gè)方法關(guān)閉收件箱和到郵件服務(wù)器的連接。


顯示郵件詳細(xì)信息的Message類的方法:
1、Address[] getFrom():得到發(fā)件人的地址,返回一個(gè)Address類的對(duì)象數(shù)組;
2、Address[] getRecipients(Message.RecipientType.TO):得到收件人的地址列表;
3、Address[] getSubject():得到郵件標(biāo)題
4、Address[] getContent():得到普通文本郵件的詳細(xì)內(nèi)容;
5、Date getSentDate():得到郵件發(fā)送的時(shí)間;
6、Date getReceivedDate():得到接受郵件的時(shí)間;
7、Boolean isMimeType("text/plain"):判斷郵件的MIME(多用途的Internet郵件擴(kuò)展)類型;
Address類是郵件的地址,它是一個(gè)抽象類,可以由其子類InternetAddress來實(shí)現(xiàn)。

接收帶附件的郵件:
先用Message對(duì)象的isMimeType方法判斷該郵件是否是一個(gè)多部分內(nèi)容的郵件:
if(message.isMimeType("multipart/*"))
如果是的話,就表明該郵件帶有附件,這是可以用Message對(duì)象的getContent方法獲得代表該郵件的多部分內(nèi)容的Multipart對(duì)象:
Multipart multipart=(Multipart)message.getContent();
然后依次獲取Multipart對(duì)象的每個(gè)部分,并用方法getDisposition獲得該部分的屬性:
Part p=multipart.getBodypart(i);
String disposition=p.getDisposition();
如果該部分的屬性是Part.ATTACHMENT或Part.INLINE,就表明它是附件的內(nèi)容;如果該部分的屬性為null,就表明它是普通文本的內(nèi)容,在對(duì)屬性進(jìn)行判斷之后,就可以進(jìn)行相應(yīng)的處理了:
if((disposition!=null)&&(disposition.equals(Part.ATTACHMENT)||disposition.equals(Part.INLINE)))
{
........
}
else if(disposition==null)
{
if(p.isMimeType("text/plain"))
{
.....
}
}

下載附件的處理:
先設(shè)置附件的類型屬性,并生成下載的頭信息:
response.setContentType(p.getContentType());
response.setHeader("Content-Disposition","attachment;filename=\""+p.getFileName()+"\"");
然后設(shè)置下載過程中的輸入流和輸出流,為下載附件做好準(zhǔn)備工作:
OutputStream os=response.getOutputStream();
InputStream is=p.getInputStream();
最后就可以執(zhí)行下載的操作了:
int c=is.read();
while(c!=-1)
{
os.write(c);
c=is.read();
}


郵件過濾:
要對(duì)郵件進(jìn)行過濾,需要先查找出所有符合過濾條件的郵件,然后對(duì)這些郵件設(shè)置待刪除標(biāo)記,最后在關(guān)閉消息文件夾時(shí)真正刪除它們。JavaMail提供了一個(gè)包javax.mail.search專門用來查找符合條件的郵件,因此可以這樣來實(shí)現(xiàn)對(duì)郵件的過濾:
建立一個(gè)SearchTerm對(duì)象,它是一個(gè)抽象類,需要用其子類來構(gòu)造,常用的有以下這些子類,這些字類的構(gòu)造方法中參數(shù)就是過濾的規(guī)則,滿足這些規(guī)則的郵件將被過濾掉。
AndTerm:查找同時(shí)滿足多個(gè)條件的郵件;
OrTerm:只要郵件滿足多個(gè)條件中的某一個(gè)條件,就查找出來;
NotTerm:查找不滿足條件的郵件;
SentDateTerm:查找某個(gè)特定時(shí)間發(fā)送出來的郵件;
BodyTerm:查找正文部分的內(nèi)容符合條件的郵件;
SubjectTerm:查找標(biāo)題部分內(nèi)容符合條件的郵件;
FromTerm:如果郵件的發(fā)件人地址頭滿足條件,就查找出來;
FromStringTerm:如果郵件發(fā)件人的地址字符串滿足條件,就查找出來;
RecipientTerm:如果郵件的收件人地址頭滿足條件,就查找出來;
RecipientStringTerm:如果郵件收件人的地址字符串滿足條件,就查找出來
例如:要設(shè)立這樣的一個(gè)過濾規(guī)則,凡是標(biāo)題中含有“驚喜”的郵件或者是由
webmaster@hudax.com 發(fā)送過來的郵件都將被過濾。
SearchTerm st=new OrTerm(new SubjectTerm("驚喜"),new FromStringTerm("
webmaster@hudax.com "));
//建立SearchTerm對(duì)象;
Message[] message=folder.search(st);
//設(shè)立了過濾規(guī)則之后,調(diào)用Folder對(duì)象的search方法在接收到的郵件中尋找符合過濾條件的郵件;并將它們作為Message的對(duì)象數(shù)組返回;
message.setflsg(Flags.Flag.DELETED,true);
//將過濾出的所有郵件設(shè)置刪除標(biāo)志;