关于使用javamail pop接收邮件

本人第一次写博客   大家将就一下啊      

关于使用javamail   pop接收邮件     在网上找了很多例子     都可以用  但是在解析附件的时候会抛异常    


  1. javax.mail.MessagingException: Missing start boundary  
  2.     at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:297)  
  3.     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]);
		}
	}
}
就这样就可以跑起来了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值