java Mail邮件接收工具类
下面是一个邮件接收的工具类,有点长!!!
publicclassReciveMail{ privateMimeMessagemsg=null; privateStringsaveAttchPath=""; privateStringBufferbodytext=newStringBuffer(); privateStringdateformate="yy-MM-ddHH:mm"; publicReciveMail(MimeMessagemsg){ this.msg=msg; } publicvoidsetMsg(MimeMessagemsg){ this.msg=msg; } /** *获取发送邮件者信息 *@return *@throwsMessagingException */ publicStringgetFrom()throwsMessagingException{ InternetAddress[]address=(InternetAddress[])msg.getFrom(); Stringfrom=address[0].getAddress(); if(from==null){ from=""; } Stringpersonal=address[0].getPersonal(); if(personal==null){ personal=""; } Stringfromaddr=personal+"<"+from+">"; returnfromaddr; } /** *获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同"to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址 *@paramtype *@return *@throwsMessagingException *@throwsUnsupportedEncodingException */ publicStringgetMailAddress(Stringtype)throwsMessagingException,UnsupportedEncodingException{ Stringmailaddr=""; StringaddrType=type.toUpperCase(); InternetAddress[]address=null; if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){ if(addrType.equals("TO")){ address=(InternetAddress[])msg.getRecipients(Message.RecipientType.TO); } if(addrType.equals("CC")){ address=(InternetAddress[])msg.getRecipients(Message.RecipientType.CC); } if(addrType.equals("BCC")){ address=(InternetAddress[])msg.getRecipients(Message.RecipientType.BCC); } if(address!=null){ for(inti=0;i<address.length;i++){ Stringmail=address[i].getAddress(); if(mail==null){ mail=""; }else{ mail=MimeUtility.decodeText(mail); } Stringpersonal=address[i].getPersonal(); if(personal==null){ personal=""; }else{ personal=MimeUtility.decodeText(personal); } Stringcompositeto=personal+"<"+mail+">"; mailaddr+=","+compositeto; } mailaddr=mailaddr.substring(1); } }else{ thrownewRuntimeException("ErroremailType!"); } returnmailaddr; } /** *获取邮件主题 *@return *@throwsUnsupportedEncodingException *@throwsMessagingException */ publicStringgetSubject()throwsUnsupportedEncodingException,MessagingException{ Stringsubject=""; subject=MimeUtility.decodeText(msg.getSubject()); if(subject==null){ subject=""; } returnsubject; } /** *获取邮件发送日期 *@return *@throwsMessagingException */ publicStringgetSendDate()throwsMessagingException{ DatesendDate=msg.getSentDate(); SimpleDateFormatsmd=newSimpleDateFormat(dateformate); returnsmd.format(sendDate); } /** *获取邮件正文内容 *@return */ publicStringgetBodyText(){ returnbodytext.toString(); } /** *解析邮件,将得到的邮件内容保存到一个stringBuffer对象中, *解析邮件主要根据MimeType的不同执行不同的操作,一步一步的解析 *@parampart *@throwsMessagingException *@throwsIOException */ publicvoidgetMailContent(Partpart)throwsMessagingException,IOException{ 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(); intcount=multipart.getCount(); for(inti=0;i<count;i++){ getMailContent(multipart.getBodyPart(i)); } }elseif(part.isMimeType("message/rfc822")){ getMailContent((Part)part.getContent()); } } /** *判断邮件是否需要回执,如需回执返回true,否则返回false *@return *@throwsMessagingException */ publicbooleangetReplySign()throwsMessagingException{ booleanreplySign=false; Stringneedreply[]=msg.getHeader("Disposition-Notification-TO"); if(needreply!=null){ replySign=true; } returnreplySign; } /** *获取此邮件的message-id *@return *@throwsMessagingException */ publicStringgetMessageId()throwsMessagingException{ returnmsg.getMessageID(); } /** *判断此邮件是否已读,如果未读则返回false,已读返回true *@return *@throwsMessagingException */ publicbooleanisNew()throwsMessagingException{ booleanisnew=false; Flagsflags=((Message)msg).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; } /** *判断是是否包含附件 *@parampart *@return *@throwsMessagingException *@throwsIOException */ publicbooleanisContainAttch(Partpart)throwsMessagingException,IOException{ booleanflag=false; //StringcontentType=part.getContentType(); if(part.isMimeType("multipart/*")){ Multipartmultipart=(Multipart)part.getContent(); intcount=multipart.getCount(); for(inti=0;i<count;i++){ BodyPartbodypart=multipart.getBodyPart(i); Stringdispostion=bodypart.getDisposition(); if((dispostion!=null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){ flag=true; }elseif(bodypart.isMimeType("multipart/*")){ flag=isContainAttch(bodypart); }else{ StringconType=bodypart.getContentType(); if(conType.toLowerCase().indexOf("appliaction")!=-1){ flag=true; } if(conType.toLowerCase().indexOf("name")!=-1){ flag=true; } } } }elseif(part.isMimeType("message/rfc822")){ flag=isContainAttch((Part)part.getContent()); } returnflag; } /** *保存附件 *@parampart *@throwsMessagingException *@throwsIOException */ publicvoidsaveAttchMent(Partpart)throwsMessagingException,IOException{ Stringfilename=""; if(part.isMimeType("multipart/*")){ Multipartmp=(Multipart)part.getContent(); for(inti=0;i<mp.getCount();i++){ BodyPartmpart=mp.getBodyPart(i); Stringdispostion=mpart.getDisposition(); if((dispostion!=null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){ filename=mpart.getFileName(); if(filename.toLowerCase().indexOf("gb2312")!=-1){ filename=MimeUtility.decodeText(filename); } saveFile(filename,mpart.getInputStream()); }elseif(mpart.isMimeType("multipart/*")){ saveAttchMent(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")){ saveAttchMent((Part)part.getContent()); } } /** *获得保存附件的地址 *@return */ publicStringgetSaveAttchPath(){ returnsaveAttchPath; } /** *设置保存附件地址 *@paramsaveAttchPath */ publicvoidsetSaveAttchPath(StringsaveAttchPath){ this.saveAttchPath=saveAttchPath; } /** *设置日期格式 *@paramdateformate */ publicvoidsetDateformate(Stringdateformate){ this.dateformate=dateformate; } /** *保存文件内容 *@paramfilename *@paraminputStream *@throwsIOException */ privatevoidsaveFile(Stringfilename,InputStreaminputStream)throwsIOException{ Stringosname=System.getProperty("os.name"); Stringstoredir=getSaveAttchPath(); Stringsepatror=""; if(osname==null){ osname=""; } if(osname.toLowerCase().indexOf("win")!=-1){ sepatror="//"; if(storedir==null||"".equals(storedir)){ storedir="d://temp"; } }else{ sepatror="/"; storedir="/temp"; } Filestorefile=newFile(storedir+sepatror+filename); System.out.println("storefile'spath:"+storefile.toString()); BufferedOutputStreambos=null; BufferedInputStreambis=null; try{ bos=newBufferedOutputStream(newFileOutputStream(storefile)); bis=newBufferedInputStream(inputStream); intc; while((c=bis.read())!=-1){ bos.write(c); bos.flush(); } }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ bos.close(); bis.close(); } } publicvoidrecive(Partpart,inti)throwsMessagingException,IOException{ System.out.println("------------------START-----------------------"); System.out.println("Message"+i+"subject:"+getSubject()); System.out.println("Message"+i+"from:"+getFrom()); System.out.println("Message"+i+"isNew:"+isNew()); booleanflag=isContainAttch(part); System.out.println("Message"+i+"isContainAttch:"+flag); System.out.println("Message"+i+"replySign:"+getReplySign()); getMailContent(part); System.out.println("Message"+i+"content:"+getBodyText()); setSaveAttchPath("c://temp//"+i); if(flag){ saveAttchMent(part); } System.out.println("------------------END-----------------------"); } }
邮件接收与工具类的使用,有好几种邮件接收的写法!:
看了很多网上其他代码,pop3Server的值是pop.mail.163.com,但是试了试不成功,还有user的值既可以是带有username@...com也可以是username。
如果收件邮箱是163邮箱,必须先登陆163邮箱中设置,开启pop3服务。至于别的邮箱暂不知道。
publicstaticvoidmain(String[]args)throwsException{ //连接pop3服务器的主机名、协议、用户名、密码 Stringpop3Server="pop.163.com"; Stringprotocol="pop3"; Stringuser="username"; Stringpwd="password"; //创建一个有具体连接信息的Properties对象 Propertiesprops=newProperties(); props.setProperty("mail.store.protocol",protocol); props.setProperty("mail.pop3.host",pop3Server); //使用Properties对象获得Session对象 Sessionsession=Session.getInstance(props); session.setDebug(true); //利用Session对象获得Store对象,并连接pop3服务器 Storestore=session.getStore(); store.connect(pop3Server,user,pwd); //获得邮箱内的邮件夹Folder对象,以"只读"打开 Folderfolder=store.getFolder("inbox"); folder.open(Folder.READ_ONLY); //获得邮件夹Folder内的所有邮件Message对象 Message[]messages=folder.getMessages(); ReciveMailrm=null; for(inti=0;i<messages.size();i++){ rm=newReciveMail((MimeMessage)messages[i]); rm.recive(messages[i],i);; } folder.close(false); store.close(); }