JavaMail解析邮件类整理

JavaMail 解析邮件类

public class PraseMessage {
	private MimeMessage mimeMessage = null;
	private String saveAttachPath = "";// 附件下载后的存放目录
	private StringBuffer bodytext = new StringBuffer();
	// 存放邮件内容的StringBuffer对象
	private String dateformat = "yy-MM-dd HH:mm";// 默认的日前显示格式

	/**
	 *  * 构造函数,初始化一个MimeMessage对象  
	 */
	public PraseMessage() {
	}

	public PraseMessage(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 = "imap.163.com";
		String username = "";//邮箱地址
		String password = "";//邮箱密码
		Properties props = System.getProperties();
		Session session = Session.getDefaultInstance(props, null);
		Store store = session.getStore("imap");
		store.connect(host, username, password);
		Folder folder = store.getFolder("INBOX");
		folder.open(Folder.READ_ONLY);
		Message message[] = folder.getMessages();
		PraseMessage pmm = null;
		for (int i = 0; i < message.length; i++) {
			System.out.println("****************************************第"
					+ (i + 1) + "封邮件**********************************");
			pmm = new PraseMessage((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)
					+ "封邮件结束*************************************");
		}
	}
}


 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值