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

Javamail邮件接收程序(pop3)

阅读更多

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.FetchProfile;
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.UIDFolder;

import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;

import com.sun.mail.pop3.POP3Folder;

/**
 * 邮件接收器,方法调用顺序:<code>open->receive->close</code>。
 */
public class MailReceiver {
	public static final String POP3 = "pop3";
	public static final String INBOX = "INBOX";

	private String pop;
	private String serverName;
	private String serverPasswd;
	private MessageFilter msgFilter;

	/**
	 * 附件下载后的存放目录
	 */
	private String attachSavePath;

	private Store store;
	private POP3Folder inbox;
	private FetchProfile profile;

	/**
	 * 构造器(不保存附件,不对接收邮件进行过滤处理)
	 * 
	 * @param pop
	 *            POP Server URL
	 * @param serverName
	 *            用户名
	 * @param serverPasswd
	 *            密码
	 * @param msgFilter
	 *            邮件过滤器,<code>null</code>表示不过滤
	 */
	public MailReceiver(String pop, String serverName, String serverPasswd) {
		this(pop, serverName, serverPasswd, null, null);
	}

	/**
	 * 构造器(不保存附件)
	 * 
	 * @param pop
	 *            POP Server URL
	 * @param serverName
	 *            用户名
	 * @param serverPasswd
	 *            密码
	 * @param msgFilter
	 *            邮件过滤器,<code>null</code>表示不过滤
	 */
	public MailReceiver(String pop, String serverName, String serverPasswd,
			MessageFilter msgFilter) {
		this(pop, serverName, serverPasswd, msgFilter, null);
	}

	/**
	 * 构造器(不对接收邮件进行过滤处理)
	 * 
	 * @param pop
	 *            POP Server URL
	 * @param serverName
	 *            用户名
	 * @param serverPasswd
	 *            密码
	 * @param attachSavePath
	 *            附件存放路径,<code>null</code>表示不保存附件
	 */
	public MailReceiver(String pop, String serverName, String serverPasswd,
			String attachSavePath) {
		this(pop, serverName, serverPasswd, null, attachSavePath);
	}

	/**
	 * 构造器
	 * 
	 * @param pop
	 *            POP Server URL
	 * @param serverName
	 *            用户名
	 * @param serverPasswd
	 *            密码
	 * @param msgFilter
	 *            邮件过滤器,<code>null</code>表示不过滤
	 * @param attachSavePath
	 *            附件存放路径,<code>null</code>表示不保存附件
	 */
	public MailReceiver(String pop, String serverName, String serverPasswd,
			MessageFilter msgFilter, String attachSavePath) {
		super();
		Assert.hasLength(pop, "Pop");
		Assert.hasLength(serverName, "ServerName");
		Assert.hasLength(serverPasswd, "ServerPasswd");

		this.pop = pop;
		this.serverName = serverName;
		this.serverPasswd = serverPasswd;
		this.msgFilter = msgFilter;
		this.attachSavePath = attachSavePath;
	}

	/**
	 * 连接邮件服务器,打开INBOX
	 */
	public void open() throws MessagingException {
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props, null);

		this.store = session.getStore(POP3);
		store.connect(pop, serverName, serverPasswd);

		this.inbox = (POP3Folder) store.getFolder(INBOX);
		inbox.open(Folder.READ_ONLY);

		this.profile = new FetchProfile();
		profile.add(UIDFolder.FetchProfileItem.UID);
		profile.add(FetchProfile.Item.ENVELOPE);
	}

	/**
	 * 收取邮件,自动保存附件至指定目录,该方法不会关闭INOBX及连接。<br>
	 * 调用 {@link #close()}方法关闭INBOX及连接。
	 * 
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws MessagingException
	 */
	public List<Message> receive() throws UnsupportedEncodingException,
			IOException, MessagingException {
		// 获取邮件及UID
		Message[] messages = inbox.getMessages();
		inbox.fetch(messages, profile);

		// 过滤处理
		List<Message> msgList = new ArrayList<Message>();
		for (Message msg : messages) {
			if (msgFilter == null || msgFilter.filte(inbox, msg)) {
				// 保存附件
				if (StringUtils.hasLength(attachSavePath)
						&& MailUtils.containsAttach(msg)) {
					saveAttachment(msg);
				}
				msgList.add(msg);
			}
		}

		return msgList;
	}

	/**
	 * 关闭INBOX及连接。
	 */
	public void close() {
		try {
			inbox.close(false);
			store.close();
		} catch (MessagingException e) {
			throw new MailException("关闭INBOX及连接出错", e);
		}
	}

	public POP3Folder getInbox() {
		return inbox;
	}

	/**
	 * 保存附件
	 * 
	 * @throws Exception
	 * @throws IOException
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	private void saveAttachment(Part part) throws UnsupportedEncodingException,
			MessagingException, IOException {
		if (part.isMimeType("multipart/*")) {
			String filename = "";
			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 = MailUtils.decodeText(mpart.getFileName());
					saveFile(filename, mpart.getInputStream());
				} else if (mpart.isMimeType("multipart/*")) {
					saveAttachment(mpart);
				} else {
					filename = MailUtils.decodeText(mpart.getFileName());
					if (filename != mpart.getFileName()) {
						saveFile(filename, mpart.getInputStream());
					}
				}
			}
		} else if (part.isMimeType("message/rfc822")) {
			saveAttachment((Part) part.getContent());
		}
	}

	/**
	 * 保存附件到指定目录
	 * 
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	private void saveFile(String filename, InputStream in)
			throws FileNotFoundException, IOException {
		File file = new File(attachSavePath + File.separator + filename);
		FileCopyUtils.copy(in, new FileOutputStream(file));
	}
}

import javax.mail.Message;
import javax.mail.MessagingException;

import com.sun.mail.pop3.POP3Folder;

/**
 * 邮件过滤接口,用于实现只收取未读邮件这样的功能。
 */
public interface MessageFilter {
	/**
	 * 过滤邮件
	 * 
	 * @param box
	 *            邮件文件夹
	 * @param message
	 *            邮件消息
	 * @return 如何需要读取此邮件,返回<code>true</code>,否则返回<code>false</code>
	 */
	boolean filte(POP3Folder box, Message message)  throws MessagingException;
}


import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.MimeUtility;

import org.springframework.util.Assert;

/**
 * 邮件处理实用类
 */
public class MailUtils {
	private MailUtils() {

	}

	/**
	 * <code>MimeUtility.decodeText(text)</code>
	 */
	public static String decodeText(String text)
			throws UnsupportedEncodingException {
		if (text == null)
			return null;

		String s = text.toLowerCase();
		if (s.contains("gb2312") || s.contains("gbk")) {
			return MimeUtility.decodeText(text);
		}

		return text;
	}

	/**
	 * 判断邮件是否包含附件
	 * 
	 * @throws IOException
	 * @throws MessagingException
	 */
	public static boolean containsAttach(Part part) throws MessagingException,
			IOException {
		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/*")) {
					attachflag = containsAttach((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 = containsAttach((Part) part.getContent());
		}
		return attachflag;
	}

	/**
	 * 解析邮件,把得到的邮件内容保存到<code>bodyText</code>对象中.<br>
	 * 根据MimeType类型的不同执行不同的解析操作.
	 * 
	 * @throws IOException
	 * @throws MessagingException
	 */
	public static void getMailContent(Part part, StringBuffer bodyText)
			throws MessagingException, IOException {
		Assert.notNull(bodyText, "bodyText");
		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), bodyText);
			}
		} else if (part.isMimeType("message/rfc822")) {
			getMailContent((Part) part.getContent(), bodyText);
		}
	}
}
分享到:
评论

相关推荐

    电子邮件接收pop3

    这个应用可能使用了JavaMail API来实现POP3邮件接收功能,并且具备一个可视化窗口,让用户能够直观地查看和管理邮件。可视化界面设计通常会涉及到Swing或JavaFX这样的GUI库,用于创建按钮、文本框、列表视图等组件,...

    基于POP3的JAVA邮件接收程序

    总的来说,基于POP3的Java邮件接收程序是通过JavaMail API与POP3服务器通信,执行如登录、查询邮件列表、下载邮件等操作,从而实现邮件的自动化处理。理解POP3协议和JavaMail API的使用是构建这类程序的关键。

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

    JavaMail是Java平台上的一个开源库,它提供了在Java应用程序中发送和接收电子邮件的能力。通过JavaMail API,开发者可以方便地与SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)服务器交互...

    javamail邮件发送程序

    JavaMail邮件发送程序是Java平台上的一个开源库,用于处理电子邮件的发送和接收。这个程序允许开发者通过SMTP(简单邮件传输协议)、POP3(邮局协议)或IMAP(因特网消息访问协议)等标准协议来收发邮件。在Java EE...

    javamail邮件的收发

    JavaMail API支持多种邮件协议,包括SMTP(简单邮件传输协议)用于发送邮件,以及POP3(邮局协议第3版)和IMAP(因特网消息访问协议)用于接收邮件。在这个项目中,它似乎已经与Tomcat服务器集成,使得开发者能够...

    使用JAVAMail代发邮件

    这个类称为 MailInfo,包含了邮件的各种信息,例如邮件服务器的主机名和端口号、邮件发送者的地址、邮件接收者的地址、邮件主题、邮件内容、邮件附件等。 在 MailInfo 类中,我们定义了多个成员变量,用于存储邮件...

    javamail 收发电子邮件

    2. IMAP 和 POP3 协议:对于邮件接收,JavaMail 提供了 `Folder` 和 `Message` 类来处理IMAP或POP3服务器上的邮箱。IMAP 允许用户在线查看邮件,而POP3通常将邮件下载到本地存储。使用 `Store` 类连接到服务器,然后...

    javamail收发邮件加密和不加密

    JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...

    POP3的java邮件接收程序

    在Java编程中,我们可以利用JavaMail API来实现基于POP3的邮件接收功能。以下是对标题和描述中所述知识点的详细解释: 1. **JavaMail API**: JavaMail API 是一套用于处理邮件的Java库,提供了丰富的接口和类,...

    javamail邮件收发机制

    ### 邮件接收流程 1. **配置 Properties**: 设置 POP3 或 IMAP 服务器信息。 2. **创建 Session**: 创建用于连接邮件服务器的 Session。 3. **获取 Store**: 通过 Session 的 `getStore()` 方法获取相应的 Store ...

    简单的JavaMail的收发邮件程序

    这个简单的JavaMail程序包含了收发邮件的基本功能,对于理解JavaMail的工作原理和使用方法非常有帮助。 首先,让我们从发送邮件的部分开始。在JavaMail中,发送邮件的核心类是`javax.mail.Session`和`javax.mail....

    基于Javamail的邮件收发系统(word论文+开题报告+任务书+答辩PPT).zip

    《基于Javamail的邮件收发系统》是一份完整的毕业设计资料,涵盖了从理论到实践的全过程,包括Word论文、开题报告、任务书以及答辩PPT。这个项目主要探讨了如何使用JavaMail API来实现一个高效、稳定的邮件收发系统...

    javamail发送邮件小程序,类以及写好,只要放包,下载一个就可以

    JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中实现电子邮件的发送和接收。这个小程序可能包含了一套完整的类,可以帮助开发者快速构建邮件发送功能,无需从头开始编写所有必需的代码。 JavaMail 提供了对...

    基于JavaMail的电子邮件收发系统设计说明.doc

    JavaMail是一个开源API,用于处理SMTP、IMAP和POP3等邮件协议,使得开发者能够方便地在Java应用程序中实现邮件收发功能。 2.2 Swing和Eclipse Swing是Java的GUI库,用于构建用户界面,而Eclipse是一款广泛使用的...

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

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

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

    JavaMail 是一个开源的 Java API,它允许开发者在 Java 应用程序中发送和接收电子邮件。这个基于 Javamail 的邮件收发系统是利用 JavaMail 提供的接口和类来构建的一个完整的邮件处理系统。该系统可能包含了多个组件...

    基于Javamail的邮件收发系统的实现.rar

    邮件接收功能: 系统能够从用户指定的邮箱服务器上接收邮件,并将邮件内容显示在用户界面上。 使用JavaMail API中的POP3(Post Office Protocol 3)或者IMAP(Internet Message Access Protocol)协议来从邮件...

    javaMail收发邮件经典程序

    在这个"javaMail收发邮件经典程序"中,我们将深入探讨如何利用JavaMail库进行邮件的发送和接收,并特别关注添加多个附件、指定多个发送人以及接收邮件附件的操作。 首先,要使用JavaMail,我们需要在项目中引入其...

    javamail邮件系统开发

    JavaMail邮件系统开发是Java开发者在构建应用程序时用于发送和接收电子邮件的重要工具。它是一个开源的API,提供了丰富的功能,让开发者能够轻松地与各种邮件服务器进行交互。在这个主题中,我们将深入探讨JavaMail...

    JavaMail收发Gmail邮件

    JavaMail API是Java平台中的一个标准扩展库,用于发送、接收以及管理电子邮件。它提供了丰富的接口来实现邮件的各种操作,如构建复杂的MIME消息、处理附件等。 #### 二、使用JavaMail收发Gmail邮件 在使用JavaMail...

Global site tag (gtag.js) - Google Analytics