JavaMail中收取邮件内容解析的问题
我在用javaMail做收邮件时怎么邮件内容重复(一种文本格式的,一种html格式的),并且图片无法正常显示:
这是我用的代码:请高手指教:
package com.ghy.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; 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; } public void setMimeMessage(MimeMessage mimeMessage){ this.mimeMessage=mimeMessage; } /** * 获得发件人的地址和姓名 */ public String getFrom1()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"---密送人地址 * @throws Exception */ public String getMailAddress(String type){ String mailaddr=""; try { String addtype=type.toUpperCase(); InternetAddress []address=null; if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BBC")){ 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 < address.length; i++) { String email=address[i].getAddress(); 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{ } } catch (Exception e) { // TODO: handle exception } return mailaddr; } /** * 获得邮件主题 */ public String getSubject() { String subject=""; try { subject=MimeUtility.decodeText(mimeMessage.getSubject()); if(subject==null)subject=""; } catch (Exception e) { // TODO: handle exception } return subject; } /** * 获得邮件发送日期 */ public String getSendDate()throws Exception{ Date senddate=mimeMessage.getSentDate(); SimpleDateFormat format=new SimpleDateFormat(dateformat); return format.format(senddate); } /** * 解析邮件,把得到的邮件内容保存到一个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; 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<counts;i++){ getMailContent(multipart.getBodyPart(i)); } }else if(part.isMimeType("message/rfc822")){ getMailContent((Part)part.getContent()); } else{} } /** * 获得邮件正文内容 */ public String getBodyText(){ return bodytext.toString(); } /** * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false" * @throws MessagingException */ public boolean getReplySign() throws MessagingException{ boolean replysign=false; String needreply[]=mimeMessage.getHeader("Disposition-Notification-To"); if(needreply!=null){ replysign=true; } return replysign; } /** * 获得此邮件的Message-ID * @throws MessagingException */ public String getMessageId() throws MessagingException{ return mimeMessage.getMessageID(); } /** * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】 * @throws MessagingException */ public boolean isNew() throws MessagingException{ boolean isnew =false; Flags flags=((Message)mimeMessage).getFlags(); Flags.Flag[]flag=flags.getSystemFlags(); for (int i = 0; i < flag.length; i++) { if(flag[i]==Flags.Flag.SEEN){ isnew=true; break; } } return isnew; } /** * 判断此邮件是否包含附件 * @throws MessagingException */ 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 j=0;j<mp.getCount();j++){ BodyPart mpart=mp.getBodyPart(j); String disposition=mpart.getDescription(); 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; } /** * 【保存附件】 * @throws Exception * @throws IOException * @throws MessagingException * @throws Exception */ public void saveAttachMent(Part part) throws Exception { String fileName=""; if(part.isMimeType("multipart/*")){ Multipart mp=(Multipart)part.getContent(); for(int j=0;j<mp.getCount();j++){ BodyPart mpart=mp.getBodyPart(j); String disposition=mpart.getDescription(); if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){ fileName=mpart.getFileName(); if(fileName.toLowerCase().indexOf("GBK")!=-1){ fileName=MimeUtility.decodeText(fileName); } saveFile(fileName,mpart.getInputStream()); } else if(mpart.isMimeType("multipart/*")){ fileName=mpart.getFileName(); } else{ fileName=mpart.getFileName(); if((fileName!=null)){ 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){ 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){ //如果是window 操作系统 separator="/"; if(storedir==null||storedir.equals(""))storedir="c:tmp"; } else{ //如果是其他的系统 separator="/"; storedir="/tmp"; } File strorefile=new File(storedir+separator+fileName); BufferedOutputStream bos=null; BufferedInputStream bis=null; try { bos=new BufferedOutputStream(new FileOutputStream(strorefile)); bis=new BufferedInputStream(in); int c; while((c=bis.read())!=-1){ bos.write(c); bos.flush(); } } catch (Exception e) { // TODO: handle exception }finally{ bos.close(); bis.close(); } } /** * PraseMimeMessage类测试 * @throws Exception */ public static void main(String[] args) throws Exception { String host="pop3.sina.com.cn"; String username="guohuaiyong70345"; String password="071120"; 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(); PraseMimeMessage pmm=null; for (int i = 0; i < message.length; i++) { System.out.println("****************************************第"+(i+1)+"封邮件**********************************"); pmm=new PraseMimeMessage((MimeMessage)message[i]); System.out.println("主题 :"+pmm.getSubject()); pmm.setDateFormat("yy年MM月dd日 HH:mm"); System.out.println("发送时间 :"+pmm.getSendDate()); System.out.println("是否回执 :"+pmm.getReplySign()); System.out.println("是否包含附件 :"+pmm.isContainAttach((Part)message[i])); System.out.println("发件人 :"+pmm.getFrom1()); System.out.println("收件人 :"+pmm.getMailAddress("TO")); System.out.println("抄送地址 :"+pmm.getMailAddress("CC")); System.out.println("密送地址 :"+pmm.getMailAddress("BCC")); System.out.println("邮件ID :"+i+":"+pmm.getMessageId()); pmm.getMailContent((Part)message[i]); //根据内容的不同解析邮件 pmm.setAttachPath("c:/tmp/mail"); //设置邮件附件的保存路径 pmm.saveAttachMent((Part)message[i]); //保存附件 System.out.println("邮件正文 :"+pmm.getBodyText()); System.out.println("*********************************第"+(i+1)+"封邮件结束*************************************"); } } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
求过滤纯文本正文和html正文的方法
十分感谢!
看了一下Apache的mime4j ,不是太明白,回头再读一下RFC822,看来邮件的结构还是很复杂的!
谢谢了,老兄,我明白了!
内容重复,因为很多邮件工具在发送HTML邮件的时候,为了防止接收端无法阅读html邮件,都附送了一份纯文本的邮件。解析的时候需要对这种情况进行过滤
建议试试这个项目:http://www.oschina.net/p/james+mime4j