<轉>JavaMail的三個主要類:
1、Session類
Session類表示了一個基本的郵件會話過程,它提供了一個郵件的生存過程。Session對象需要java.util.Properties對象對其配置郵件環境屬性,它利用Properties對象來獲取諸如郵件服務器、用戶名、密碼等信息,以及其他可在整個應用程序中共享的信息。
2、Message類
在創建了一個郵件會話Session后,再用Message類提供了一封郵件的所有信息。它是一個抽象類,必須由其子類來構造。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子類,可以使用當前的Session對象創建一個新的MimeMessage對象,然后就可以對其進行各種操作。
message.setSubject("This is subject of the e-mail");
//設置郵件的標題
message.setText("Hello,I am a e-mail");
//設置純文本郵件的內容
InternetAddress sender=new InternetAddress("
cx19830801@163.com
");
//InternetAddress類通過一個合法的e-mail構造出e-mail地址對象
message.setForm(sender);
//設置郵件的發送方地址
InternetAddress receiver=new InternetAddress("
Webmaster@hudax.com
");
message.addRecipient(receiver,RecipientType.TO);
//設置接收方地址
設置接收方地址使用addRecipient方法,地址類型有三種:
RecipientType.TO:e-mail的發送地址;
RecipientType.CC:抄送地址,可以為多個;
RecipientType.BCC:暗送地址,可以為多個。
3、Transport類
郵件發送類。
郵件發送方法:send(message);
e.g
Properties props=new Properties();
Session sendsession = Session.getInstance(props, null);
//使用getInstance方法獲取到這個信息
props.put("mail.smtp.host", "smtp.163.com");
//向屬性中寫入SMTP服務器的地址,為Session設置一個SMTP郵件服務器
props.put("mail.smtp.auth","true");
//用Properties對象的put方法設置了SMTP郵件服務器需要進行權限的認證;
sendsession.setDebug(true);
//用Session對象的setDebug方法設置輸出發送郵件時的調試信息;可在Tomcat服務器上看到同SMTP郵件服務器交互過程中的輸出信息。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子類,可以使用當前的Session對象創建一個新的MimeMessage對象,然后就可以對其進行各種操作。
message.setFrom(new InternetAddress(request.getParameter("from")));
//設置發信人地址
message.setRecipient(Message.RecipientType.TO,new InternetAddress(request.getParameter("to")));
//設置收信人地址
message.setSubject(new String(request.getParameter("subject").getBytes("ISO8859_1"),"GBK"));
//設置e-mail標題
message.setSentDate(new Date());
//設置e-mail發送時間
message.setText(new String(request.getParameter("text").getBytes("ISO8859_1"),"GBK"));
//設置e-mail內容
message.saveChanges();
//保存對于Email的修改,用message對象的saveChanges方法將郵件信息保存起來;
Transport transport=sendsession.getTransport("smtp");
//由當前的session對象使用方法getTransport創建并初始化Transport對象
transport.connect("smtp.163.com","username","password");
//連接到SMTP服務器
transport.sendMessage(message,message.getAllRecipients());
//發送e-mail
transport.close();
//關閉Transport連接
發送帶有附件的郵件:
1、BodyPart類
BodyPart類表示多部分的MIME信息中某一個部分的信息內容,它是一個抽象類,需要用其子類MimeBodyPart創建。
BodyPart messageBodyPart=new MimeBodyPart();
通常郵件的正文是一個BodyPart對象,附件則是另一個BodyPart對象。
2、MultiPart類
MultiPart類表示多部分的MIME信息的內容,它是一個抽象類,需要用其子類MimeMultipart來創建。還可以通過其方法addBodyPart()來創建。
Multipart multipart=new MimeMultipart();
將代表郵件正文的BodyPart對象和代表郵件附件的BodyPart對象分別加入到MimeMultipart對象中。
3、DataSource類
DataSource類表示本地文件和服務器可以直接訪問的資源,它是一個抽象類,用其子類FileDataSource來創建。
FileDataSource fds=new FileDataSource("c:/test.doc");
4、DataHandler類
DataHandler為不同的數據源和數據格式提供提供了一個統一的接口。
messageBodyPart.setDataHandler(new DataHandler(fds));
附件被封裝到一個DataHandler對象,BodyPart對象可以用方法setDataHandler將封裝了附件的DataHandler對象加進來。
發送附件時的處理過程:
BodyPart messageBodyPart=new MimeBodyPart();
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//在要發送附件時,先建立代表郵件正文的BodyPart對象,并把它加到Multipart對象中去
messageBodyPart=new MimeBodyPart();
//建立代表郵件附件部分的BodyPart對象
DataSource source=new FileDataSource(attachment);
messageBodyPart.setDataHandler(new DataHandler(source));
用setDataHandler方法將獲取到的附件包含進來
messageBodyPart.setFileName(attachment);
//設置附件文件名
multipart.addBodyPart(messageBodyPart);
//將與附件相關的內容設置好之后,就可以把代表此附件部分的BodyPart對象加到Multipart對象中去了,最后將Multipart對象放到代表郵件信息的Message對象中,這樣就可以發送帶有附件的郵件了。
接收郵件:
1、URLName類
URLName類實際上是對于某臺郵件服務器上某個用戶的一次操作的唯一標識,它的格式為:
協議名稱://用戶名:密碼@郵件服務器/
URLName irln=new URLName("pop3://username:password@163.com/");
2、Store類
Store類是用于接收郵件的類,它對郵件進行讀、寫、監視、查找等操作。接收郵件時首先要連接到郵件服務器上的一個郵箱,這需要調用Session對象的getStore方法來創建一個Store對象。
Store store=session.getStore("pop3");
//這個方法要設置Store對象所使用的協議,通常為POP3;
store.connect("pop.163.com","username","password");
//在創建了Store對象之后,可以使用它的connect方法連接到遠程郵件服務器中的郵箱。
3、Folder類
在連接到郵箱之后,就可以打開包含郵件的消息文件夾了,打開消息文件夾需要先使用Store對象的getFolder方法創建一個Folder對象作為消息文件夾。
Folder folder=store.getFolder("INBOX");
//參數用來設置消息文件夾的名字,通常設為INBOX,因為POP3協議只支持唯一的消息文件夾INBOX。
使用Folder類的open方法來打開消息文件夾:
folder.open(Folder.READ_ONLY);
它有兩種可選模式:READ_ONLY和READ_WRITE
要從消息文件夾中取出郵件,可以使用Folder類的getMessage方法或getMessages方法。
Message message=inbox.getMessage(i);
//方法getMessage返回以其參數為索引的Message對象
Message message[]=folder.getMessages();
//方法getMessages返回一個Message對象數組
int count=folder.getMessageCount();
//使用Folder類的getMessageCount()得到消息文件夾中的郵件總數
4、Message類
與前面的Message類相同,在這里介紹它在顯示郵件列表和刪除郵件時所使用的一些方法。
(1)、方法getSubject得到一封郵件的標題;
(2)、方法isSet用來判斷一封郵件是否被標記為刪除(DELETED)、是否用戶已經收取過(SEEN)、是否被回復過(ANSWERED)、是否是一個草稿(DRAFT)等等;
(3)、方法setFlag設置一封郵件為待刪除。
在接收和檢索郵件之后,還要關閉程序使用到的資源,
folder.close(true);
store.cloase();
這兩個方法關閉收件箱和到郵件服務器的連接。
顯示郵件詳細信息的Message類的方法:
1、Address[] getFrom():得到發件人的地址,返回一個Address類的對象數組;
2、Address[] getRecipients(Message.RecipientType.TO):得到收件人的地址列表;
3、Address[] getSubject():得到郵件標題
4、Address[] getContent():得到普通文本郵件的詳細內容;
5、Date getSentDate():得到郵件發送的時間;
6、Date getReceivedDate():得到接受郵件的時間;
7、Boolean isMimeType("text/plain"):判斷郵件的MIME(多用途的Internet郵件擴展)類型;
Address類是郵件的地址,它是一個抽象類,可以由其子類InternetAddress來實現。
接收帶附件的郵件:
先用Message對象的isMimeType方法判斷該郵件是否是一個多部分內容的郵件:
if(message.isMimeType("multipart/*"))
如果是的話,就表明該郵件帶有附件,這是可以用Message對象的getContent方法獲得代表該郵件的多部分內容的Multipart對象:
Multipart multipart=(Multipart)message.getContent();
然后依次獲取Multipart對象的每個部分,并用方法getDisposition獲得該部分的屬性:
Part p=multipart.getBodypart(i);
String disposition=p.getDisposition();
如果該部分的屬性是Part.ATTACHMENT或Part.INLINE,就表明它是附件的內容;如果該部分的屬性為null,就表明它是普通文本的內容,在對屬性進行判斷之后,就可以進行相應的處理了:
if((disposition!=null)&&(disposition.equals(Part.ATTACHMENT)||disposition.equals(Part.INLINE)))
{
........
}
else if(disposition==null)
{
if(p.isMimeType("text/plain"))
{
.....
}
}
下載附件的處理:
先設置附件的類型屬性,并生成下載的頭信息:
response.setContentType(p.getContentType());
response.setHeader("Content-Disposition","attachment;filename=\""+p.getFileName()+"\"");
然后設置下載過程中的輸入流和輸出流,為下載附件做好準備工作:
OutputStream os=response.getOutputStream();
InputStream is=p.getInputStream();
最后就可以執行下載的操作了:
int c=is.read();
while(c!=-1)
{
os.write(c);
c=is.read();
}
郵件過濾:
要對郵件進行過濾,需要先查找出所有符合過濾條件的郵件,然后對這些郵件設置待刪除標記,最后在關閉消息文件夾時真正刪除它們。JavaMail提供了一個包javax.mail.search專門用來查找符合條件的郵件,因此可以這樣來實現對郵件的過濾:
建立一個SearchTerm對象,它是一個抽象類,需要用其子類來構造,常用的有以下這些子類,這些字類的構造方法中參數就是過濾的規則,滿足這些規則的郵件將被過濾掉。
AndTerm:查找同時滿足多個條件的郵件;
OrTerm:只要郵件滿足多個條件中的某一個條件,就查找出來;
NotTerm:查找不滿足條件的郵件;
SentDateTerm:查找某個特定時間發送出來的郵件;
BodyTerm:查找正文部分的內容符合條件的郵件;
SubjectTerm:查找標題部分內容符合條件的郵件;
FromTerm:如果郵件的發件人地址頭滿足條件,就查找出來;
FromStringTerm:如果郵件發件人的地址字符串滿足條件,就查找出來;
RecipientTerm:如果郵件的收件人地址頭滿足條件,就查找出來;
RecipientStringTerm:如果郵件收件人的地址字符串滿足條件,就查找出來
例如:要設立這樣的一個過濾規則,凡是標題中含有“驚喜”的郵件或者是由
webmaster@hudax.com
發送過來的郵件都將被過濾。
SearchTerm st=new OrTerm(new SubjectTerm("驚喜"),new FromStringTerm("
webmaster@hudax.com
"));
//建立SearchTerm對象;
Message[] message=folder.search(st);
//設立了過濾規則之后,調用Folder對象的search方法在接收到的郵件中尋找符合過濾條件的郵件;并將它們作為Message的對象數組返回;
message.setflsg(Flags.Flag.DELETED,true);
//將過濾出的所有郵件設置刪除標志;