收取邮件(带附件)有几个过程
1.接收邮件
  a.确定对象邮箱的协议、端口和密码等参数
  b.通过Properties类配置(协议、端口和服务器)参数
  c.用session储存这些配置,用于定义环境信息
  d.通过Store取session里的参数来连接邮箱 
  f.通过Folder获得收件箱()(Folder是操作邮件的对象)
  
2.解析邮件
  a.通过Message[]获得收件箱中邮件
  b.通过MimeMessage 获取单个邮件处理对象,MimeMessage是Message子类,实例对象表示一封邮件
3.保存附件
  a.通过Multipart获取复杂体邮件处理对象
  b.通过BodyPart获取复杂邮件的一个邮件体,BodyPart是Multipart的一个属性,图片、附件等节点都可以通过BodyPart组合成一个混合的Multipart整体
4.读取并处理输入流

学习链接:

MIME協議在郵件中的應用詳解

JavaMail發送郵件简单示例

附上个人学习demo: 

public class mytest {
	public static void main(String[] args) throws Exception {

		String duankou = "110";// 端口号
		String servicePath = "pop.qiye.aliyun.com";// 服务器地址(收件端)
		String xieyi = "pop3";// 协议(邮箱类型)
		String mail = " ";// 邮件地址
		String password = "";
		String mydes = "H:\\ ";// 附件保存路径(文件不用另外命名)

		receive(duankou, servicePath, xieyi, mail, password, mydes);
	}

	// 接收邮件
	public static void receive(String duankou, String servicePath, String xieyi, String mail, String password,
			String mydes) throws Exception {

		// 准备连接服务器的会话信息
		Properties props = new Properties();
		props.setProperty("mail.store.protocol", xieyi); // 使用pop3协议(指定接收邮件的协议)
		// props.setProperty("mail.transport.protocol", xieyi); // 使用pop3协议(指定发送邮件的协议)

		props.setProperty("mail.pop3.port", duankou); // 端口
		props.setProperty("mail.pop3.host", servicePath); // pop3服务器
		// 创建Session实例对象
		Session session = Session.getInstance(props);
		Store store = session.getStore(xieyi);
		// store.connect(host, user, password);
		store.connect(mail, password);

		// 获得收件箱
		Folder folder = store.getFolder("INBOX");//通过pop3协议获取某个邮件夹的名称只能为inbox
		folder.open(Folder.READ_WRITE); // 打开收件箱
        //folder.open(Folder.READ_ONLY);

		// 得到收件箱中的所有邮件,并解析
		// Message[] messages = folder.getMessages();
		Message[] messages = folder.search(new SubjectTerm("要访问的邮件主题名称"));
		parsingMessage(messages, mydes);

	}

	// 解析邮件
	public static void parsingMessage(Message[] messages, String mydes) throws Exception {

		// 解析所有邮件
		for (int i = 0, count = messages.length; i < count; i++) {
			MimeMessage msg = (MimeMessage) messages[i];
			msg.getMessageNumber();//第几封邮件
			MimeUtility.decodeText(msg.getSubject());//邮件主题
			msg.getSentDate();//发送时间
			msg.getSize();//邮件大小(兆)
			boolean isContainerAttachment = isContainAttachment(msg);//是否包含附件
			if (isContainerAttachment) {
				saveAttachment(msg, mydes); // 保存附件
			}
			StringBuffer content = new StringBuffer(30);//content是邮件正文

			//获取邮件正文
			content.toString();//对纯文本的适用
			//getMailTextContent(msg, content);//针对复杂体邮件
		}

	}

    //获取邮件文本内容
	/*
	public static void getMailTextContent(Part part, StringBuffer content) throws Exception {
		boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
		if (part.isMimeType("text/*") && !isContainTextAttach) {//邮件是纯文本,并且文本不为空
			content.append(part.getContent().toString());
		} else if (part.isMimeType("message/rfc822")) { //message/rfc822单一邮件体文件
			getMailTextContent((Part) part.getContent(), content);
		} else if (part.isMimeType("multipart/*")) {  //multipart/*复杂体邮件,如带附件邮件
			Multipart multipart = (Multipart) part.getContent();
			int partCount = multipart.getCount();
			for (int i = 0; i < partCount; i++) {
				BodyPart bodyPart = multipart.getBodyPart(i);
				getMailTextContent(bodyPart, content);
			}
		}
	}
	**/

	// 保存附件
	public static void saveAttachment(Part part, String destDir) throws Exception {
		if (part.isMimeType("multipart/*")) { // multipart/*包含附件的邮件
			Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
			// 复杂体邮件包含多个邮件体
			int partCount = multipart.getCount();
			for (int i = 0; i < partCount; i++) {
				// 获得复杂体邮件中其中一个邮件体
				BodyPart bodyPart = multipart.getBodyPart(i);
				// 某一个邮件体也有可能是由多个邮件体组成的复杂体
				String disp = bodyPart.getDisposition();
				if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { // 表示msg已经有内容,文件已经下来或可以打开
					InputStream is = bodyPart.getInputStream();
					saveFile(is, destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码
				} else if (bodyPart.isMimeType("multipart/*")) {
					saveAttachment(bodyPart, destDir);
				} else {
					String contentType = bodyPart.getContentType();
					if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
						saveFile(bodyPart.getInputStream(), destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码
					}
				}
			}
		} else if (part.isMimeType("message/rfc822")) {
			saveAttachment((Part) part.getContent(), destDir);// getContent是获取邮件内容并加以显示
		}

	}


	// 是否包含附件
	public static boolean isContainAttachment(Part part) throws Exception {
		boolean flag = false;
		if (part.isMimeType("multipart/*")) {
			MimeMultipart multipart = (MimeMultipart) part.getContent();
			int partCount = multipart.getCount();
			for (int i = 0; i < partCount; i++) {
				BodyPart bodyPart = multipart.getBodyPart(i);
				String disp = bodyPart.getDisposition();
				if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
					flag = true;
				} else if (bodyPart.isMimeType("multipart/*")) {
					flag = isContainAttachment(bodyPart);
				} else {
					String contentType = bodyPart.getContentType();
					if (contentType.indexOf("application") != -1) {
						flag = true;
					}

					if (contentType.indexOf("name") != -1) {
						flag = true;
					}
				}
				if (flag)
					break;
			}
		} else if (part.isMimeType("message/rfc822")) {
			flag = isContainAttachment((Part) part.getContent());
		}
		return flag;
	}

    	// 读取输入轮流保存到指定位置
	public static void saveFile(InputStream is, String destDir, String fileName) throws Exception {
		BufferedInputStream bis = new BufferedInputStream(is);
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir + fileName)));
		int len = -1;
		while ((len = bis.read()) != -1) {
			bos.write(len);
			bos.flush();
		}
		bos.close();
		bis.close();

	}



}
04-19 04:28