用Javamail寫的郵件接收程序
前段時間一直忙于學校里面的事情,沒有時間靜下心來寫接收郵件的程序,現在學校里的事情終于忙完了,可以靜下心里做自己喜歡做的事情了,這種感覺真的很好!
對我自己而言,剛開始在用JavaMail來編寫收郵件的程序時最重要和最難的要數解析附件和郵件正文的部分,因為Mime類型實在是太多了!下面的這段代碼是我自己學習JavaMail的一段體會,供大家來參考(請高手指教,有什么更好的辦法,請回復此文章),具體代碼如下:
上面就是用JavaMail來解析MimeMessage的具體程序代碼,具體使用方法參考main方法里的測試代碼,請大家在看過之余多提寶貴的意見,共同學習,共同成長!!
對我自己而言,剛開始在用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方法里的測試代碼,請大家在看過之余多提寶貴的意見,共同學習,共同成長!!