top
Loading...
用Javamail寫的郵件接收程序
前段時間一直忙于學校里面的事情,沒有時間靜下心來寫接收郵件的程序,現在學校里的事情終于忙完了,可以靜下心里做自己喜歡做的事情了,這種感覺真的很好!



對我自己而言,剛開始在用JavaMail來編寫收郵件的程序時最重要和最難的要數解析附件和郵件正文的部分,因為Mime類型實在是太多了!下面的這段代碼是我自己學習JavaMail的一段體會,供大家來參考(請高手指教,有什么更好的辦法,請回復此文章),具體代碼如下:

packagecoffeecatwebmail;

importjava.io.*;
importjava.text.*;
importjava.util.*;
importjavax.mail.*;
importjavax.mail.internet.*;

publicclassPraseMimeMessage{
privateMimeMessagemimeMessage=null;
privateStringsaveAttachPath="";//附件下載后的存放目錄
privateStringBufferbodytext=newStringBuffer();
//存放郵件內容的StringBuffer對象
privateStringdateformat="yy-MM-ddHH:mm";//默認的日前顯示格式

/**
*構造函數,初始化一個MimeMessage對象
*/

publicPraseMimeMessage(){}
publicPraseMimeMessage(MimeMessagemimeMessage){
this.mimeMessage=mimeMessage;
System.out.println("createaPraseMimeMessageobject........");
}

publicvoidsetMimeMessage(MimeMessagemimeMessage){
this.mimeMessage=mimeMessage;
}

/**
*獲得發件人的地址和姓名
*/

publicStringgetFrom()throwsException{
InternetAddressaddress[]=(InternetAddress[])mimeMessage.getFrom();
Stringfrom=address[0].getAddress();
if(from==null)from="";
Stringpersonal=address[0].getPersonal();
if(personal==null)personal="";
Stringfromaddr=personal+"<"+from+">";
returnfromaddr;
}
/**
*獲得郵件的收件人,抄送,和密送的地址和姓名,根據所傳遞的參數的不同
*"to"----收件人"cc"---抄送人地址"bcc"---密送人地址
*/


publicStringgetMailAddress(Stringtype)throwsException{
Stringmailaddr="";
Stringaddtype=type.toUpperCase();
InternetAddress[]address=null;
if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BCC")){
if(addtype.equals("TO")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
}elseif(addtype.equals("CC")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
}else{
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if(address!=null){
for(inti=0;i<address.length;i++){
Stringemail=address[i].getAddress();
if(email==null)email="";
else{
email=MimeUtility.decodeText(email);
}
Stringpersonal=address[i].getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtility.decodeText(personal);
}
Stringcompositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}else{
thrownewException("Erroremailaddrtype!");
}
returnmailaddr;
}

/**
*獲得郵件主題
*/


publicStringgetSubject()throwsMessagingException{
Stringsubject="";
try{
subject=MimeUtility.decodeText(mimeMessage.getSubject());
if(subject==null)subject="";
}catch(Exceptionexce){
}
returnsubject;
}

/**
*獲得郵件發送日期
*/


publicStringgetSentDate()throwsException{
Datesentdate=mimeMessage.getSentDate();
SimpleDateFormatformat=newSimpleDateFormat(dateformat);
returnformat.format(sentdate);
}

/**
*獲得郵件正文內容
*/


publicStringgetBodyText(){
returnbodytext.toString();
}

/**
*解析郵件,把得到的郵件內容保存到一個StringBuffer對象中,解析郵件
*主要是根據MimeType類型的不同執行不同的操作,一步一步的解析
*/


publicvoidgetMailContent(Partpart)throwsException{
Stringcontenttype=part.getContentType();
intnameindex=contenttype.indexOf("name");
booleanconname=false;
if(nameindex!=-1)conname=true;
System.out.println("CONTENTTYPE:"+contenttype);
if(part.isMimeType("text/plain")&&!conname){
bodytext.append((String)part.getContent());
}elseif(part.isMimeType("text/html")&&!conname){
bodytext.append((String)part.getContent());
}elseif(part.isMimeType("multipart/*")){
Multipartmultipart=(Multipart)part.getContent();
intcounts=multipart.getCount();
for(inti=0;i<counts;i++){
getMailContent(multipart.getBodyPart(i));
}
}elseif(part.isMimeType("message/rfc822")){
getMailContent((Part)part.getContent());
}else{}
}

/**
*判斷此郵件是否需要回執,如果需要回執返回"true",否則返回"false"
*/

publicbooleangetReplySign()throwsMessagingException{
booleanreplysign=false;
Stringneedreply[]=mimeMessage.getHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
returnreplysign;
}

/**
*獲得此郵件的Message-ID
*/

publicStringgetMessageId()throwsMessagingException{
returnmimeMessage.getMessageID();
}

/**
*【判斷此郵件是否已讀,如果未讀返回返回false,反之返回true】
*/

publicbooleanisNew()throwsMessagingException{
booleanisnew=false;
Flagsflags=((Message)mimeMessage).getFlags();
Flags.Flag[]flag=flags.getSystemFlags();
System.out.println("flags'slength:"+flag.length);
for(inti=0;i<flag.length;i++){
if(flag[i]==Flags.Flag.SEEN){
isnew=true;
System.out.println("seenMessage.......");
break;
}
}
returnisnew;
}

/**
*判斷此郵件是否包含附件
*/

publicbooleanisContainAttach(Partpart)throwsException{
booleanattachflag=false;
StringcontentType=part.getContentType();
if(part.isMimeType("multipart/*")){
Multipartmp=(Multipart)part.getContent();
for(inti=0;i<mp.getCount();i++){
BodyPartmpart=mp.getBodyPart(i);
Stringdisposition=mpart.getDisposition();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE))))
attachflag=true;
elseif(mpart.isMimeType("multipart/*")){
attachflag=isContainAttach((Part)mpart);
}else{
Stringcontype=mpart.getContentType();
if(contype.toLowerCase().indexOf("application")!=-1)attachflag=true;
if(contype.toLowerCase().indexOf("name")!=-1)attachflag=true;
}
}
}elseif(part.isMimeType("message/rfc822")){
attachflag=isContainAttach((Part)part.getContent());
}
returnattachflag;
}

/**
*【保存附件】
*/


publicvoidsaveAttachMent(Partpart)throwsException{
StringfileName="";
if(part.isMimeType("multipart/*")){
Multipartmp=(Multipart)part.getContent();
for(inti=0;i<mp.getCount();i++){
BodyPartmpart=mp.getBodyPart(i);
Stringdisposition=mpart.getDisposition();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
fileName=mpart.getFileName();
if(fileName.toLowerCase().indexOf("gb2312")!=-1){
fileName=MimeUtility.decodeText(fileName);
}
saveFile(fileName,mpart.getInputStream());
}elseif(mpart.isMimeType("multipart/*")){
saveAttachMent(mpart);
}else{
fileName=mpart.getFileName();
if((fileName!=null)&&(fileName.toLowerCase().indexOf("GB2312")!=-1)){
fileName=MimeUtility.decodeText(fileName);
saveFile(fileName,mpart.getInputStream());
}
}
}
}elseif(part.isMimeType("message/rfc822")){
saveAttachMent((Part)part.getContent());
}
}

/**
*【設置附件存放路徑】
*/


publicvoidsetAttachPath(Stringattachpath){
this.saveAttachPath=attachpath;
}

/**
*【設置日期顯示格式】
*/


publicvoidsetDateFormat(Stringformat)throwsException{
this.dateformat=format;
}

/**
*【獲得附件存放路徑】
*/


publicStringgetAttachPath(){
returnsaveAttachPath;
}

/**
*【真正的保存附件到指定目錄里】
*/


privatevoidsaveFile(StringfileName,InputStreamin)throwsException{
StringosName=System.getProperty("os.name");
Stringstoredir=getAttachPath();
Stringseparator="";
if(osName==null)osName="";
if(osName.toLowerCase().indexOf("win")!=-1){
separator="\"
if(storedir==null||storedir.equals(""))storedir="c:\tmp";
}else{
separator="/";
storedir="/tmp";
}
Filestorefile=newFile(storedir+separator+fileName);
System.out.println("storefile'spath:"+storefile.toString());
//for(inti=0;storefile.exists();i++){
//storefile=newFile(storedir+separator+fileName+i);
//}
BufferedOutputStreambos=null;
BufferedInputStreambis=null;
try{
bos=newBufferedOutputStream(newFileOutputStream(storefile));
bis=newBufferedInputStream(in);
intc;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();
}
}catch(Exceptionexception){
exception.printStackTrace();
thrownewException("文件保存失敗!");
}finally{
bos.close();
bis.close();
}
}

/**
*PraseMimeMessage類測試
*/


publicstaticvoidmain(Stringargs[])throwsException{
Stringhost="主機名/ip";//【pop.mail.yahoo.com.cn】
Stringusername="用戶名";//【wwp_1124】
Stringpassword="密碼";//【........】
Propertiesprops=newProperties();
Sessionsession=Session.getDefaultInstance(props,null);
Storestore=session.getStore("pop3");
store.connect(host,username,password);
Folderfolder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Messagemessage[]=folder.getMessages();
System.out.println("Messages'slength:"+message.length);
PraseMimeMessagepmm=null;
for(inti=0;i<message.length;i++){
pmm=newPraseMimeMessage((MimeMessage)message[i]);
System.out.println("Message"+i+"subject:"+pmm.getSubject());
System.out.println("Message"+i+"sentdate:"+pmm.getSentDate());
System.out.println("Message"+i+"replysign:"+pmm.getReplySign());
System.out.println("Message"+i+"hasRead:"+pmm.isNew());
System.out.println("Message"+i+"containAttachment:"+pmm.isContainAttach((Part)message[i]));
System.out.println("Message"+i+"form:"+pmm.getFrom());
System.out.println("Message"+i+"to:"+pmm.getMailAddress("to"));
System.out.println("Message"+i+"cc:"+pmm.getMailAddress("cc"));
System.out.println("Message"+i+"bcc:"+pmm.getMailAddress("bcc"));
pmm.setDateFormat("yy年MM月dd日HH:mm");
System.out.println("Message"+i+"sentdate:"+pmm.getSentDate());
System.out.println("Message"+i+"Message-ID:"+pmm.getMessageId());
pmm.getMailContent((Part)message[i]);
System.out.println("Message"+i+"bodycontent:"+pmm.getBodyText());
pmm.setAttachPath("c:\tmp\coffeecat1124");
pmm.saveAttachMent((Part)message[i]);
}
}
}

上面就是用JavaMail來解析MimeMessage的具體程序代碼,具體使用方法參考main方法里的測試代碼,請大家在看過之余多提寶貴的意見,共同學習,共同成長!!

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗