本人第一次写博客 大家将就一下啊
关于使用javamail pop接收邮件 在网上找了很多例子 都可以用 但是在解析附件的时候会抛异常
javax.mail.MessagingException: Missing start boundary at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:297) at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:159) ...于是只能自己编译了 花了半个小时 终于可以运行了 接下来看代码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; System.out.println("初始化一个PraseMimeMessage对象--------"); } 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<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{ 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()); } } /** * 判断此邮件是否需要回执,如果需要回执返回"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("flags's length: "+flag.length); for(int i=0;i<flag.length;i++){ if(flag[i] == Flags.Flag.SEEN){ isnew=true; System.out.println("seen Message......."); break; } } return isnew; } /** * ----判断此邮件是否包含附件---- */ public boolean isContainAttach(Part part)throws Exception{ boolean attachflag = false; if(part.isMimeType("multipart/*")){ Multipart mp = (Multipart)part.getContent(); for(int i=0;i<mp.getCount();i++){ BodyPart mpart = mp.getBodyPart(i); String disposition = mpart.getDisposition(); if((disposition != null) &&((disposition.equals(Part.ATTACHMENT)) ||(disposition.equals(Part.INLINE)))) attachflag = true; else if(mpart.isMimeType("multipart/*")){ }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<mp.getCount();i++){ BodyPart mpart = mp.getBodyPart(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{ 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 = ""; System.out.println(osName); if(osName == null) osName=""; if(osName.toLowerCase().indexOf("win") != -1){//判断是不是pc端 separator="//"; if(storedir == null || storedir.equals("")) storedir="D:////"; }else{ separator = "/"; storedir = "/pop"; } File storefile = new File(storedir+separator+fileName); System.out.println("文件路径: "+storefile.toString()); for(int i=0;storefile.exists();i++){ storefile = new File(storedir+separator+fileName+i); } if(!storefile.exists()) { try { storefile.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 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 = "pop.163.com"; //QQ的话 用pop.qq.com 其他自推 String username ="*****@163.com"; //例如:******@163.com String passWord ="*******"; //如果是qq或163邮箱 得用授权码当作密码来验证 Properties props = new Properties(); props.setProperty("mail.transport.protocol", "pop3"); // 使用的协议(JavaMail规范要求) props.setProperty("mail.smtp.host", host); // 发件人的邮箱的 SMTP服务器地址 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("Messages's length: "+message.length); PraseMimeMessage pmm = null; for(int i=0;i<message.length;i++){ pmm = new PraseMimeMessage((MimeMessage)message[i]); System.out.println("Message "+i+" 主题: "+pmm.getSubject()); System.out.println("Message "+i+" 时间: "+pmm.getSentDate()); System.out.println("Message "+i+" 是否需要回执: "+pmm.getReplySign()); System.out.println("Message "+i+" 是否已读: "+pmm.isNew()); System.out.println("Message "+i+" 是否包含附件: "+pmm.isContainAttach((Part)message[i])); System.out.println("Message "+i+" 发件人的地址和姓名: "+pmm.getFrom()); System.out.println("Message "+i+" 邮件的收件人: "+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+" 时: "+pmm.getSentDate()); System.out.println("Message "+i+" 邮件的Message-ID: "+pmm.getMessageId()); pmm.getMailContent((Part)message[i]); System.out.println("Message "+i+" 邮件正文内容: /r/n"+pmm.getBodyText()); File file=new File(""); if(!file.exists()){ file.mkdirs(); } pmm.setAttachPath(file.toString()); pmm.saveAttachMent((Part)message[i]); } }}就这样就可以跑起来了
新闻热点
疑难解答