二、 郵件的收取
Bromon原創(chuàng) 請(qǐng)尊重版權(quán)
通常情況下我們都使用pop3協(xié)議來收郵件,IMAP嘛現(xiàn)在就不涉及了。收郵件的功能雖然我用了很多時(shí)間才基本搞清楚,不過講起來就so easy了,一個(gè)程序就可以基本包括。
郵件大致可以分三種:純文本郵件、含有其他數(shù)據(jù)的文本郵件、含有附件的郵件。

/**//*
* Created on 2004-4-26
*/
package org.bromon.mail;
import javax.mail.*;
import java.util.*;
import java.io.*;


/**//**
* @author Bromon
*/
public class Receiver

{
Folder inbox;
Store store;

//連接郵件服務(wù)器,獲得所有郵件的列表
public Message[] getMail(String host,String name,String password) throws Exception

{
Properties prop=new Properties();
prop.put("mail.pop3.host",host);
Session session=Session.getDefaultInstance(prop);
store=session.getStore("pop3");
store.connect(host,name,password);
inbox=store.getDefaultFolder().getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
Message[] msg=inbox.getMessages();
FetchProfile profile=new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg,profile);
return(msg);
}

//處理任何一種郵件都需要的方法
private void handle(Message msg) throws Exception

{
System.out.println("郵件主題:"+msg.getSubject());
System.out.println("郵件作者:"+msg.getFrom()[0].toString());
System.out.println("發(fā)送日期:"+msg.getSentDate());
}

//處理文本郵件
public void handleText(Message msg) throws Exception

{
this.handle(msg);
System.out.println("郵件內(nèi)容:"+msg.getContent());
}

//處理Multipart郵件,包括了保存附件的功能
public void handleMultipart(Message msg) throws Exception

{
String disposition;
BodyPart part;
Multipart mp=(Multipart)msg.getContent();
int mpCount=mp.getCount();//Miltipart的數(shù)量,用于除了多個(gè)part,比如多個(gè)附件
for(int m=0;m<mpCount;m++)

{
this.handle(msg);
part=mp.getBodyPart(m);
disposition=part.getDisposition();
if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判斷是否有附件

{
//this.saveAttach(part);//這個(gè)方法負(fù)責(zé)保存附件,注釋掉是因?yàn)楦郊赡苡胁《?,?qǐng)清理信箱之后再取掉注釋

}else
{
System.out.println(part.getContent());
}
}
}

private void saveAttach(BodyPart part) throws Exception

{
String temp=part.getFileName();//得到未經(jīng)處理的附件名字
String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
//文件名一般都經(jīng)過了base64編碼,下面是解碼
String fileName=this.base64Decoder(s);
System.out.println("有附件:"+fileName);
InputStream in=part.getInputStream();
FileOutputStream writer=new FileOutputStream(new File(fileName));
byte[] content=new byte[255];
int read=0;
while((read=in.read(content))!=-1)

{
writer.write(content);
}
writer.close();
in.close();
}

//base64解碼
private String base64Decoder(String s) throws Exception

{
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] b=decoder.decodeBuffer(s);
return(new String(b));
}

//關(guān)閉連接
public void close() throws Exception

{
if(inbox!=null)

{
inbox.close(false);
}
if(store!=null)

{
store.close();
}
}

public static void main(String args[])

{
String host="pop.163.com";
String name="bromon";
String password="My password";
Receiver receiver=new Receiver();
try

{
Message[] msg=receiver.getMail(host,name,password);
for(int i=0;i<msg.length;i++)

{
if(msg[i].isMimeType("text/*"))//判斷郵件類型

{
receiver.handleText(msg[i]);

}else
{
receiver.handleMultipart(msg[i]);
}
System.out.println("****************************");
}
receiver.close();
}catch(Exception e)

{
System.out.println(e);
}
}
}

沒有習(xí)慣讀java代碼的兄弟可能會(huì)覺得麻煩了一點(diǎn),其中有個(gè)小問題,下載的附件會(huì)再文件名后面加上一個(gè)”#”符號(hào),不知道這是javamail的特別處理還是pop3的規(guī)范。通過程序更改文件名很簡(jiǎn)單,就不說了。對(duì)于email還有很多其他的操作,可以自己取查看一下javadoc,我就不影響大家探索的樂趣了。在Properties里配置代理服務(wù)器,可以讓程序通過代理收發(fā)郵件,一般的HTTP、socks 4、socks 5都支持。
posted on 2005-03-28 13:26
Sometimes Java 閱讀(438)
評(píng)論(0) 編輯 收藏 所屬分類:
Tech Flow