`
reallyafei
  • 浏览: 98813 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JavaMail接收邮件

阅读更多
封装javamail处理接收邮件过程,简化客户端调用
package tf;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;

import javax.mail.BodyPart;
import javax.mail.FetchProfile;
import javax.mail.Folder;
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 ReceiveEmail {
	private final String username; // 用户名
	private final String password; // 密码
	private String host; // 服务器名
	private String dir = "C:/TEMP"; // 默认附件保存目录
	private boolean ssl = false; // 默认不使用安全套接层协议

	private Store store;
	private Folder folder;

	public ReceiveEmail(String host, String username, String password) {
		this.host = host;
		this.username = username;
		this.password = password;
	}

	/**
	 * 测试接收126邮箱邮件
	 */
	public static void main(String[] args) {
		String host = "pop3.126.com";
		String username = "test";
		String password = "test";

		ReceiveEmail receiveEmail = new ReceiveEmail(host, username, password);
		// receiveEmail.setSSL(true); //接收gmail邮件需设置
		// receiveEmail.setDir("D:/upload"); //设置附件保存目录
		List<Message> list = receiveEmail.receive();
		System.out.println("total email:" + list.size());

		for (Message msg : list) {
			System.out.println("-------------start--------------------------");
			System.out.println("from:" + msg.getFrom());
			System.out.println("sendDate:" + msg.getFormatSendDate());// msg.getSendDate();
			System.out.println("subject:" + msg.getSubject());
			System.out.println("content:" + msg.getContent());

			Map<String, String> map = msg.getAttachMap();
			for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) {
				String name = it.next();
				String path = map.get(name);
				System.out.println("attach:" + name + "===" + path);
			}
			System.out.println("-------------end----------------------------");
		}
	}

	/**
	 * 设置附件保存目录
	 */
	public void setDir(String dir) {
		this.dir = dir;
	}

	/**
	 * 设置是否使用安全套接层协议
	 */
	public void setSSL(boolean ssl) {
		this.ssl = ssl;
	}

	/**
	 * 接收邮件,返回所有的(新)邮件信息
	 */
	public List<Message> receive() {
		List<Message> list = null;
		try {
			list = handleMessages();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				folder.close(true);
				store.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	/**
	 * 处理服务器上所有Message
	 */
	private List<Message> handleMessages() throws Exception {
		javax.mail.Message[] msgs = getMessages();

		List<Message> list = new ArrayList<Message>();
		for (int i = 0; i < msgs.length; i++) {
			if (isNew((MimeMessage) msgs[i])) {
				Message message = new Message();
				message.setFrom(getFrom(msgs[i]));
				message.setSubject(msgs[i].getSubject());
				message.setSendDate(msgs[i].getSentDate());
				message.setContent(getContent(msgs[i]));

				handleAttachments(message, msgs[i]);
				list.add(message);
			}
		}
		return list;
	}

	/**
	 * 获取服务器上所有Message
	 */
	private javax.mail.Message[] getMessages() throws Exception {
		Properties props = System.getProperties();
		if (ssl) {
			handleSSL(props);
			host = host.replace("pop3", "pop");
		}

		Session session = Session.getDefaultInstance(props, null);
		store = session.getStore("pop3");
		store.connect(host, username, password);
		folder = store.getFolder("INBOX");
		folder.open(Folder.READ_WRITE);
		javax.mail.Message[] msgs = folder.getMessages();

		FetchProfile fp = new FetchProfile();
		fp.add(FetchProfile.Item.ENVELOPE);
		fp.add(FetchProfile.Item.FLAGS);
		fp.add("X-Mailer");
		folder.fetch(msgs, fp);
		return msgs;
	}

	/**
	 * 处理邮件来源
	 */
	private String getFrom(javax.mail.Message msg) throws Exception {
		String personal = ((InternetAddress) msg.getFrom()[0]).getPersonal();
		String address = "<"
				+ ((InternetAddress) msg.getFrom()[0]).getAddress() + ">";
		if (null == personal) {
			personal = address.substring(1, address.indexOf("@"));
		}
		return personal + address;
	}

	/**
	 * 处理邮件内容
	 */
	private String getContent(Part part) throws Exception {
		if (part.isMimeType("text/plain")) {
			return (String) part.getContent();
		} else if (part.isMimeType("text/html")) {
			return (String) part.getContent();
		} else if (part.isMimeType("multipart/*")) {
			Multipart multipart = (Multipart) part.getContent();
			return getContent(multipart.getBodyPart(0));
		} else if (part.isMimeType("message/rfc822")) {
			return getContent((Part) part.getContent());
		}
		return "";
	}

	/**
	 * 判断是否新邮件(处理省略)
	 */
	private boolean isNew(MimeMessage msg) throws Exception {
		// 对于pop3协议,用msg.getMessageID()唯一的UID判断(可建表保存UID,再判断是否存在即可。)
		// javamail提供的处理新邮件方法对pop3协议不起作用
		return true;
	}

	/**
	 * 处理附件
	 */
	private void handleAttachments(Message message, Part part) throws Exception {
		if (part.isMimeType("multipart/*")) {
			Multipart mp = (Multipart) part.getContent();
			for (int i = 0; i < mp.getCount(); i++) {
				BodyPart bp = mp.getBodyPart(i);
				String disposition = bp.getDisposition();
				if (disposition != null
						&& (disposition.equals(Part.ATTACHMENT) || disposition
								.equals(Part.INLINE))) {
					saveFile(message, bp);
				} else if (bp.isMimeType("multipart/*")) {
					handleAttachments(message, (Part) part.getContent());
				} else {
					saveFile(message, bp);
				}
			}
		} else if (part.isMimeType("message/rfc822")) {
			handleAttachments(message, (Part) part.getContent());
		}
	}

	/**
	 * 真正的处理附件上传
	 */
	private void saveFile(Message message, BodyPart bp) throws Exception {
		String fileName = bp.getFileName();
		if ((fileName != null)) {
			new File(dir).mkdirs(); // 新建目录
			fileName = MimeUtility.decodeText(fileName);
			String suffix = fileName.substring(fileName.lastIndexOf("."));
			String filePath = dir + "/" + UUID.randomUUID() + suffix;
			message.attachMap.put(fileName, filePath);

			File file = new File(filePath);
			BufferedInputStream bis = new BufferedInputStream(bp
					.getInputStream());
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(file));
			int i;
			while ((i = bis.read()) != -1) {
				bos.write(i);
			}
			bos.close();
			bis.close();
		}
	}

	/**
	 * 处理安全套接层协议
	 */
	private void handleSSL(Properties props) {
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
		final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
		props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
		props.setProperty("mail.pop3.socketFactory.fallback", "false");
		props.setProperty("mail.pop3.port", "995");
		props.setProperty("mail.pop3.socketFactory.port", "995");

		props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
		props.setProperty("mail.imap.socketFactory.fallback", "false");
		props.setProperty("mail.imap.port", "993");
		props.setProperty("mail.imap.socketFactory.port", "993");
	}

	/**
	 * 保存读取的每封邮件信息
	 */
	public static class Message {
		private String from; // 发件人
		private String subject; // 主题
		private String content; // 内容
		private Date sendDate; // 发送日期
		// 附件信息(文件名=文件路径)
		private Map<String, String> attachMap = new HashMap<String, String>();

		public String getFrom() {
			return from;
		}

		public void setFrom(String from) {
			this.from = from;
		}

		public String getSubject() {
			return subject;
		}

		public void setSubject(String subject) {
			this.subject = subject;
		}

		public String getContent() {
			return content;
		}

		public void setContent(String content) {
			this.content = content;
		}

		public String getFormatSendDate() {
			return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(sendDate);
		}

		public Date getSendDate() {
			return sendDate;
		}

		public void setSendDate(Date sendDate) {
			this.sendDate = sendDate;
		}

		public Map<String, String> getAttachMap() {
			return attachMap;
		}

		public void setAttachMap(Map<String, String> attachMap) {
			this.attachMap = attachMap;
		}
	}
}

分享到:
评论
3 楼 cfan_haifeng 2014-05-27  
props.setProperty("mail.pop3.port", String.valueOf(110));//修改pop3的的端口
2 楼 cfan_haifeng 2014-05-15  
请问 imap 的如何实现啊
1 楼 cfan_haifeng 2014-05-15  
兄弟,谢了,先

相关推荐

    JAVA100例之实例48 使用JavaMail接收邮件

    以上就是关于"JAVA100例之实例48 使用JavaMail接收邮件"的主要内容,通过学习和实践这个实例,开发者将能够熟练地使用JavaMail API来实现邮件的接收功能,这对于构建自动化邮件系统或者处理邮件相关的业务需求非常有...

    javamail接收邮件例子

    javamail接收邮件例子,我稍微改动了一下,有些错误和异常抛出了

    基于javamail接收邮件源代码

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一套API,使得开发者能够方便地处理SMTP、POP3和IMAP等邮件协议。在给定的标题和描述中,我们讨论的是如何使用JavaMail API来接收邮件...

    javamail 邮件解析、接收、发送程序

    很好的邮件处理代码,1.5版本,作为build path放在eclipse里面,就可以用啦! oracle官方推的,很好!jdk1.6版本以上用起来很方便。

    使用JAVAMail代发邮件

    JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 IMAP。 在本文中,我们将讨论如何使用 JavaMail 库来代发邮件...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    javamail收取邮件(包括附件)

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。它支持多种协议,如POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol),这两种协议常用于从邮件服务器...

    javamail 回执邮件资料

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...

    基于Javamail的邮件收发系统

    2. **邮件协议**:Javamail支持多种邮件协议,如SMTP(Simple Mail Transfer Protocol)用于发送邮件,POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol)用于接收邮件。在实现邮件...

    基于Javamail的邮件收发系统(系统+文档+开题报告+任务书+外文翻译+文献综述+答辩PPT).zip

    通过JavaMail API,开发者可以方便地与SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)服务器交互,实现邮件的创建、发送、接收和管理等功能。 二、邮件收发原理 邮件收发系统的核心在于...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    JavaMail 具备垃圾邮件过滤功能的邮箱

    JavaMail 是一个强大的Java库,它允许开发人员在Java应用程序中实现邮件的发送、接收以及管理功能。这个项目不仅提供了SMTP、POP3和IMAP协议的支持,还包含了丰富的API,可以方便地处理邮件的MIME编码、附件、HTML...

    javamail收发邮件加密和不加密

    它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据安全至关重要。 1. **POP3(Post Office Protocol version 3)**: -...

    用javaMail发送邮件

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个功能通常涉及到SMTP(简单邮件传输协议)和其他相关的互联网邮件协议。在JavaMail中,`mail.jar` 和 `activation.jar` 是两个关键的库...

    javaMail 发邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...

    javamail 收发电子邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件的发送和接收。它支持多种邮件协议,如SMTP(简单邮件传输协议)用于发送邮件,IMAP(因特网消息访问协议)和POP3(邮局协议)用于接收邮件。在...

    怎么用JavaMail收取邮件

    JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送与接收。在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 ...

Global site tag (gtag.js) - Google Analytics