自从上次在论坛发表了用JavaMail来发送邮件的程序以后,一直忙于学校里面的事情,没有时间静下心来写接收邮件的程序,现在学校里的事情终于忙完了,可以静下心里做自己喜欢做的事情了,这种感觉真的很好! 对我自己而言,刚开始在用JavaMail来编写收邮件的程序时最重要和最难的要数解析附件和邮件正文的部分,因为Mime类型实在是太多了!下面的这段代码是我自己学习JavaMail的一段体会,供大家来参考(请高手指教,有什么更好的办法,请回复此文章),具体代码如下: ------------------------------------------------------------------------------- package coffeecatwebmail; import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class PraseMimeMessage{ private MimeMessage mimeMessage = null; private String saveAttachPath = ""; //附件下载后的存放目录 private StringBuffer bodytext = new StringBuffer(); //存放邮件内容的StringBuffer对象 private String dateformat = "yy-MM-dd HH:mm"; //默认的日前显示格式 /** * 构造函数,初始化一个MimeMessage对象 */ public PraseMimeMessage(){} public PraseMimeMessage(MimeMessage mimeMessage){ this.mimeMessage = mimeMessage; System.out.println("create a PraseMimeMessage object........"); } public void setMimeMessage(MimeMessage mimeMessage){ this.mimeMessage = mimeMessage; } /** * 获得发件人的地址和姓名 */ public String getFrom()throws Exception{ InternetAddress address[] = (InternetAddress[])mimeMessage.getFrom(); String from = address[0].getAddress(); if(from == null) from=""; String personal = address[0].getPersonal(); if(personal == null) personal=""; String fromaddr = personal+"<"+from+">"; return fromaddr; } /** * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址 */ public String getMailAddress(String type)throws Exception{ String mailaddr = ""; String addtype = 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); }else if(addtype.equals("CC")){ address = (InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC); }else{ address = (InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC); } if(address != null){ for(int i=0;i if(email==null) email=""; else{ email=MimeUtility.decodeText(email); } String personal=address[i].getPersonal(); if(personal==null) personal=""; else{ personal=MimeUtility.decodeText(personal); } String compositeto=personal+"<"+email+">"; mailaddr+=","+compositeto; } mailaddr=mailaddr.substring(1); } }else{ throw new Exception("Error emailaddr type!"); } return mailaddr; } /** * 获得邮件主题 */ public String getSubject()throws MessagingException{ String subject = ""; try{ subject = MimeUtility.decodeText(mimeMessage.getSubject()); if(subject == null) subject=""; }catch(Exception exce){ } return subject; } /** * 获得邮件发送日期 */ public String getSentDate()throws Exception{ Date sentdate = mimeMessage.getSentDate(); SimpleDateFormat format = new SimpleDateFormat(dateformat); return format.format(sentdate); } /** * 获得邮件正文内容 */ public String getBodyText(){ return bodytext.toString(); } /** * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 * 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析 */ public void getMailContent(Part part)throws Exception{ String contenttype = part.getContentType(); int nameindex = contenttype.indexOf("name"); boolean conname =false; if(nameindex != -1) conname=true; System.out.println("CONTENTTYPE: "+contenttype); if(part.isMimeType("text/plain") && !conname){ bodytext.append((String)part.getContent()); }else if(part.isMimeType("text/html") && !conname){ bodytext.append((String)part.getContent()); }else if(part.isMimeType("multipart/*")){ Multipart multipart = (Multipart)part.getContent(); int counts = multipart.getCount(); for(int i=0;i } }else if(part.isMimeType("message/rfc822")){ getMailContent((Part)part.getContent()); }else{} } /** * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false" */ public boolean getReplySign()throws MessagingException{ boolean replysign = false; String needreply[] = mimeMessage.getHeader("Disposition-Notification-To"); if(needreply != null){ replysign = true; } return replysign; } /** * 获得此邮件的Message-ID */ public String getMessageId()throws MessagingException{ return mimeMessage.getMessageID(); } /** * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】 */ public boolean isNew()throws MessagingException{ boolean isnew = false; Flags flags = ((Message)mimeMessage).getFlags(); Flags.Flag []flag = flags.getSystemFlags(); System.out.println("flagss length: "+flag.length); for(int i=0;i isnew=true; System.out.println("seen Message......."); break; } } return isnew; } /** * 判断此邮件是否包含附件 */ public boolean isContainAttach(Part part)throws Exception{ boolean attachflag = false; String contentType = part.getContentType(); if(part.isMimeType("multipart/*")){ Multipart mp = (Multipart)part.getContent(); for(int i=0;i String disposition = mpart.getDisposition(); if((disposition != null) &&((disposition.equals(Part.ATTACHMENT)) ||(disposition.equals(Part.INLINE)))) attachflag = true; else if(mpart.isMimeType("multipart/*")){ attachflag = isContainAttach((Part)mpart); }else{ String contype = mpart.getContentType(); if(contype.toLowerCase().indexOf("application") != -1) attachflag=true; if(contype.toLowerCase().indexOf("name") != -1) attachflag=true; } } }else if(part.isMimeType("message/rfc822")){ attachflag = isContainAttach((Part)part.getContent()); } return attachflag; } /** * 【保存附件】 */ public void saveAttachMent(Part part)throws Exception{ String fileName = ""; if(part.isMimeType("multipart/*")){ Multipart mp = (Multipart)part.getContent(); for(int i=0;i String disposition = 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()); }else if(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()); } } } }else if(part.isMimeType("message/rfc822")){ saveAttachMent((Part)part.getContent()); } } /** * 【设置附件存放路径】 */ public void setAttachPath(String attachpath){ this.saveAttachPath = attachpath; } /** * 【设置日期显示格式】 */ public void setDateFormat(String format)throws Exception{ this.dateformat = format; } /** * 【获得附件存放路径】 */ public String getAttachPath(){ return saveAttachPath; } /** * 【真正的保存附件到指定目录里】 */ private void saveFile(String fileName,InputStream in)throws Exception{ String osName = System.getProperty("os.name"); String storedir = getAttachPath(); String separator = ""; if(osName == null) osName=""; if(osName.toLowerCase().indexOf("win") != -1){ separator = "\\" if(storedir == null || storedir.equals("")) storedir="c:\\tmp"; }else{ separator = "/"; storedir = "/tmp"; } File storefile = new File(storedir+separator+fileName); System.out.println("storefiles path: "+storefile.toString()); //for(int i=0;storefile.exists();i++){ //storefile = new File(storedir+separator+fileName+i); //} BufferedOutputStream bos = null; BufferedInputStream bis = null; try{ bos = new BufferedOutputStream(new FileOutputStream(storefile)); bis = new BufferedInputStream(in); int c; while((c=bis.read()) != -1){ bos.write(c); bos.flush(); } }catch(Exception exception){ exception.printStackTrace(); throw new Exception("文件保存失败!"); }finally{ bos.close(); bis.close(); } } /** * PraseMimeMessage类测试 */ public static void main(String args[])throws Exception{ String host = "主机名/ip"; //【pop.mail.yahoo.com.cn】 String username ="用户名"; //【wwp_1124】 String password ="密码"; //【........】 Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); System.out.println("Messagess length: "+message.length); PraseMimeMessage pmm = null; for(int i=0;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: \r\n"+pmm.getBodyText()); pmm.setAttachPath("c:\\tmp\\coffeecat1124"); pmm.saveAttachMent((Part)message[i]); } } } ------------------------------------------------------------------------------- 上面就是用JavaMail来解析MimeMessage的具体程序代码,具体使用方法参考main方法里的测试代码,请大家在看过之余多提宝贵的意见,共同学习,共同成长!! |
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |