`
log_cd
  • 浏览: 1098598 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JavaMail读发邮件

阅读更多
一、基本概念:

  SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它定义了发送电子邮件的机制。在 JavaMail API 环境中,基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service Provider's,ISP's)SMTP 服务器通信。SMTP 服务器可将消息中转至接收方 SMTP 服务器,以便最终让用户经由 POP 或 IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。

  POP(Post Office Protocol),即邮局协议。目前用的是版本3,所以人们通常将它称为 POP3,RFC 1939 定义了这个协议。POP 和SMTP一样,也是一种机制,Internet上大多数人通过它得到邮件。该协议规定每个用户只能有一个邮箱的支持。这就是它所能做的,而这也造成了许多混淆。使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用 JavaMail API 时,如果读者想要这类信息,就只能由自己来计算了。

  IMAP(Internet Message Access Protocol),即Internet消息访问协议,是更高级的用于接收消息的协议,在 RFC 2060 中有它的定义。目前使用的IMAP版本为4,人们习惯将它称为 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况--用户在服务器上可以有多个文件夹(folder),并且这些文件夹可以被多个用户共享。
  因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。

  MIME(Multipurpose Internet Mail Extensions),即多用途Internet邮件扩展标准。它不是邮件传输协议,而是对传输内容的消息、附件及其它的内容定义了格式。这里有很多不同的RFC(Requirement of Comment)文档:RFC 822、RFC 2045、RFC 2046 和 RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。

二、例子
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
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.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 使用Gmail发送邮件
 */
public class GmailSenderAndFetch {

	private static String messageContentMimeType = "text/html; charset=gb2312";

	private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

	public static Properties getProperties() {
		Properties props = System.getProperties();
		props.setProperty("mail.smtp.host", "smtp.gmail.com");
		// Gmail提供的POP3和SMTP是使用安全套接字层SSL的
		props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
		props.setProperty("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.port", "465");
		props.setProperty("mail.smtp.socketFactory.port", "465");

		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");

		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.put("mail.smtp.auth", "true");
		return props;
	}

	/**
	 * 构建邮件
	 * 
	 * @param username
	 * @param password
	 * @param receiver
	 * @return
	 * @throws AddressException
	 * @throws MessagingException
	 */
	@SuppressWarnings( { "unchecked", "serial" })
	public static Message buildMimeMessage(final String username,
			final String password, String receiver) throws AddressException,
			MessagingException {
		Session session = Session.getDefaultInstance(getProperties(),
				new Authenticator() {
					protected PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication(username, password);
					}
				});

		Message msg = new MimeMessage(session);
		
		//鉴别发送者,您可以使用setFrom()和setReplyTo()方法。
		//msg.setFrom(new InternetAddress("[发件人]"));
		msg.addFrom(InternetAddress.parse("[发件人]"));//地址来源,没作用?
		msg.setReplyTo(InternetAddress.parse("[回复时收件人]"));//回复时用的地址
		//消息接收者
		msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
				receiver, false));
		msg.setSubject("JavaMail邮件发送");
		msg.setSentDate(new Date());

		String content = "How are you!这是一个测试!";
		// 邮件内容数据(Content)
		msg.setContent(buildMimeMultipart(content, new Vector() {
			{
				add("D:/uploadDir/test.txt");
			}
		}));

		return msg;
	}

	/**
	 * 构建邮件的正文和附件
	 * 
	 * @param msgContent
	 * @param attachedFileList
	 * @return
	 * @throws MessagingException
	 */
	public static Multipart buildMimeMultipart(String msgContent,
			Vector attachedFileList) throws MessagingException {
		Multipart mPart = new MimeMultipart();// 多部分实现

		// 邮件正文
		MimeBodyPart mBodyContent = new MimeBodyPart();// MIME邮件段体
		if (msgContent != null) {
			mBodyContent.setContent(msgContent, messageContentMimeType);
		} else {
			mBodyContent.setContent("", messageContentMimeType);
		}
		mPart.addBodyPart(mBodyContent);

		// 附件
		String file;
		String fileName;
		if (attachedFileList != null) {
			for (Enumeration fileList = attachedFileList.elements(); fileList
					.hasMoreElements();) {
				file = (String) fileList.nextElement();
				fileName = file.substring(file.lastIndexOf("/") + 1);
				MimeBodyPart mBodyPart = new MimeBodyPart();
				//远程资源
				//URLDataSource uds=new URLDataSource(http://www.iteye.com/logo.gif);
				FileDataSource fds = new FileDataSource(file);
				mBodyPart.setDataHandler(new DataHandler(fds));
				//mBodyPart.setFileName(fileName);
            mBodyPart.setFileName(javax.mail.internet.MimeUtility.encodeWord(fileName));//解决中文附件名问题
				mPart.addBodyPart(mBodyPart);
			}
		}

		return mPart;
	}

	/**
	 * 字串解码
	 * 
	 * @param text
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	protected static String decodeText(String text)
			throws UnsupportedEncodingException {
		if (text == null)
			return null;
		if (text.startsWith("=?GB") || text.startsWith("=?gb")) {
			text = MimeUtility.decodeText(text);
		} else {
			text = new String(text.getBytes("ISO8859_1"));
		}
		return text;
	}

	/**
	 * 分析邮件
	 * 
	 * @param mPart
	 */
	public static void parseMailContent(Object content) {
		try {
			if (content instanceof Multipart) {
				Multipart mPart = (MimeMultipart) content;
				for (int i = 0; i < mPart.getCount(); i++) {
					extractPart((MimeBodyPart) mPart.getBodyPart(i));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 抽取内容
	 * 
	 * @param part
	 */
	public static void extractPart(MimeBodyPart part) {
		try {
			String disposition = part.getDisposition();

			if (disposition != null
					&& (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE))) {// 附件
				String fileName = decodeText(part.getFileName());
				System.out.println(fileName);
				saveAttachFile(part);//保存附件
			} else {// 正文
				if(part.getContent() instanceof String){//接收到的纯文本
					System.out.println(part.getContent());
				}
				if(part.getContent() instanceof MimeMultipart){//接收的邮件有附件时
					BodyPart bodyPart = ((MimeMultipart) part.getContent()).getBodyPart(0);
					System.out.println(bodyPart.getContent());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存附件
	 * @param part
	 */
	public static void saveAttachFile(Part part){
		try{
			if(part.getDisposition()==null) return;

			String dir="D:/uploadDir/";
			String filename = decodeText(part.getFileName());
			
			InputStream in=part.getInputStream();
			OutputStream out = new FileOutputStream(new File(dir+filename));
			
			byte [] buffer=new byte[8192];
			while(in.read(buffer) != -1){
				out.write(buffer);
			}
			
			in.close();
			out.flush();
			out.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 发送邮件
	 * 
	 * @throws AddressException
	 * @throws MessagingException
	 */
	public static void sendMail() throws AddressException, MessagingException {
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
		//Transport 是用来发送信息的
		Transport.send(buildMimeMessage("[用户名]", "[邮箱密码]",
				"[收件地址]"));

		System.out.println("Message send...");

	}

	/**
	 * 取邮件信息
	 * 
	 * @throws Exception
	 */
	public static void fetchMail() throws Exception {
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
		Session session = Session.getDefaultInstance(getProperties(), null);
		//用pop3协议:new URLName("pop3", "pop.gmail.com", 995, null,"[邮箱帐号]", "[邮箱密码]");
		//用IMAP协议
		URLName urln = new URLName("imap", "imap.gmail.com", 995, null,
				"[邮箱帐号]", "[邮箱密码]");
		Store store = null;
		Folder inbox = null;
		try {
			//Store用来收信,Store类实现特定邮件协议上的读、写、监视、查找等操作。
			store = session.getStore(urln);
			store.connect();
			inbox = store.getFolder("INBOX");//收件箱
			inbox.open(Folder.READ_ONLY);
			FetchProfile profile = new FetchProfile();
			profile.add(FetchProfile.Item.ENVELOPE);
			Message[] messages = inbox.getMessages();
			inbox.fetch(messages, profile);
			System.out.println("收件箱的邮件数:" + messages.length);
			System.out.println("未读邮件数:" + inbox.getUnreadMessageCount());
			System.out.println("新邮件数:" + inbox.getNewMessageCount());

			for (int i = 0; i < messages.length; i++) {
				// 邮件发送者
				String from = decodeText(messages[i].getFrom()[0].toString());
				InternetAddress ia = new InternetAddress(from);
				System.out.println("FROM:" + ia.getPersonal() + '('
						+ ia.getAddress() + ')');
				// 邮件标题
				System.out.println("TITLE:" + messages[i].getSubject());
				// 邮件内容
				parseMailContent(messages[i].getContent());

				// 邮件大小
				System.out.println("SIZE:" + messages[i].getSize());
				// 邮件发送时间
				System.out.println("DATE:" + messages[i].getSentDate());
			}
		} finally {
			try {
				inbox.close(false);
			} catch (Exception e) {
			}
			try {
				store.close();
			} catch (Exception e) {
			}
		}
	}

}

三、如何实现消息的删除
    消息的删除涉及到与消息相关的 Flags(标志)。不同 flag 表示不同的状态,有些标志由系统定义,而有些则由用户自己定义。下面列出在内部类 Flags.Flag 中预定义的标志:
  ·Flags.Flag.ANSWERED
  ·Flags.Flag.DELETED
  ·Flags.Flag.DRAFT
  ·Flags.Flag.FLAGGED
  ·Flags.Flag.RECENT
  ·Flags.Flag.SEEN
  ·Flags.Flag.USER
  上述这些标志只是标准定义,并不意味着所有邮件服务器或供应商都支持所有这些标志。例如,除了删除消息标志外,POP 协议不再支持其它任何标志。检查是否存在新邮件,这不是个 POP 任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用 getPermanentFlags() 向 folder 提出请求。
  要删除消息,您可以设置消息的 DELETED flag:
  message.setFlag(Flags.Flag.DELETED, true);
  首先,请以 READ_WRITE 模式打开 folder:
  folder.open(Folder.READ_WRITE);
  然后,当所有消息的处理完成后,关闭 folder,并传递一个 true 值,从而擦除(expunge)有 delete 标志的消息。
  folder.close(true);
  一个 Folder 的 expunge() 方法可以用来删除消息。但 Sun 的 POP3 供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP 供应商极有可能实现此功能。因为 POP 只支持单个对邮箱的访问,对 Sun 的供应商来说,您必需关闭 folder 以删除消息。
  要取消标志,只要传递 false 给 setFlag() 方法就行了。想知道是否设置过标志,可以用 isSet() 检查。
分享到:
评论
1 楼 在世界的中心呼喚愛 2013-10-15  
这个不错。。。代码可以,我稍微改造下!!

相关推荐

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

    在这个资源中,我们将探讨如何使用 JavaMail 实现邮件的发送、接收、查看邮件数量以及未读邮件的标记为已读。 首先,让我们从发送邮件开始。在 JavaMail 中,你需要创建一个 `Session` 对象来配置邮件服务器的连接...

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

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

    javamail 回执邮件资料

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

    JavaMail(JAVA邮件服务) API详解

    例如,`MessageCountListener`可以监听邮箱中邮件数量的变化,而`Flags`类则允许你操作邮件的标记,如“已读”或“未读”。 总的来说,JavaMail API为Java开发者提供了全面的邮件处理能力,使他们能够在各种场景下...

    使用javaMail发送邮件

    这个对象将包含邮件的所有信息,如发件人、收件人、主题和正文: ```java MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("from@example.com")); message.setRecipients...

    java获取读取未读邮件旧未读邮件最新邮件删除邮件指定读取指定邮件下载附件内容包括附件包含javamailjar

    项目中要求读取指定邮件未读邮件的内容,在网上查了很多资料发现都不行,不是自己想要的,要么是读取最新的,要么是读取第一封邮件,根本就不能读取未读的旧邮件。...java读取未读邮件内容包括附件包含javamail.jar

    javamail写的邮件

    JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中实现电子邮件的发送和接收。它提供了丰富的 API,可以处理 SMTP、POP3、IMAP 协议,以及 MIME 消息的创建和解析。JavaMail 允许开发者轻松地实现邮件服务器的...

    javamail-完全封装-各种邮件都可以发-javamail工具类

    它可能包含一个邮件列表,用于添加、删除和查找邮件,或者提供对邮件箱的操作接口,例如获取未读邮件数量或标记邮件为已读。 4. **MailInfo.java**:这个类可能定义了一个邮件信息的数据结构,包括发件人、收件人、...

    javamail.jar,javamail资源包

    它提供了读取和管理邮件存储的能力,如收取新的邮件、删除已读邮件等。主要的实现有`POP3Store`和`IMAPStore`,分别对应POP3和IMAP协议。 4. **Transport**: 负责将邮件发送到指定的邮件服务器。通过`javax.mail....

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

    使用JavaMail API中的POP3(Post Office Protocol 3)或者IMAP(Internet Message Access Protocol)协议来从邮件服务器上下载邮件,并将其解析成可读的格式供用户查看。 邮件管理功能: 用户可以在系统界面上对收...

    javamail-1.4.4-邮件发送组件

    POP3(Post Office Protocol version 3)通常用于下载邮件,而 IMAP(Internet Message Access Protocol)则允许在服务器上管理邮件,比如标记已读、移动邮件到其他文件夹等操作。 总的来说,JavaMail-1.4.4 是一个...

    javamail 视频源码 第一部分

    POP3 主要用于下载邮件,而 IMAP 允许用户在服务器上管理邮件,如移动、删除或标记已读。 7. **异常处理**:在实际开发中,我们需要处理各种可能的异常,如网络问题、认证失败或权限不足等。JavaMail 提供了相应的...

    SpringUseJavaMailSendEmail(spring使用javamail发送邮件的例子)

    JavaMail API则是一个用于处理电子邮件的开放源码库,它允许开发者通过编程方式发送、接收和管理邮件。本示例将详细解释如何在Spring框架中结合JavaMail API来发送电子邮件。 首先,我们需要理解Spring框架中的邮件...

    Javamail邮件开发 OA办公系统-邮件管理

    Javamail邮件开发 OA办公系统-邮件管理模块是一个小型的练习项目,运用java开发语言,MyEclipse 6.5开发工具,MySQL数据库。实现的功能是:对收件箱和发件箱中的邮件进行查询,删除,查看邮件详情和更改邮件已读未读...

    javamail 1.4.3 mail.jar 1.4.3 jar 包+源代码下载 天涯浪子

    5. **事件驱动模型**:JavaMail 使用JavaBeans Activation Framework (JAF) 实现事件驱动模型,可以监听邮件状态的变化,例如新邮件到达、邮件已读等。 6. **国际化**:JavaMail 支持多种语言,便于创建多语言的...

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

    4. 接收功能:通过连接邮件服务器,获取邮件列表,展示未读/已读邮件,并允许用户下载附件。 5. 安全性:考虑到邮件系统的安全性,应使用SSL/TLS加密连接,保护用户的登录信息和邮件内容。 三、毕业设计流程 1. ...

    JavaMail简易教程

    - **接收邮件**: 支持接收来自服务器的新邮件,可以检查是否有未读邮件,并获取邮件的基本信息。 - **管理邮件**: 包括读取邮件内容、标记邮件为已读/未读、移动邮件到不同的文件夹等功能。 ##### 2. 协议相关功能 ...

    JavaMail1.4.0正式版

    JavaMail 1.4.0中的IMAP支持让用户可以离线访问邮件,同时提供搜索、移动邮件、标记已读/未读等操作。 POP3,全称是Post Office Protocol version 3,主要用于从邮件服务器下载邮件到本地设备。JavaMail 1.4.0的...

    Java通过Exchange协议发送和接收邮件

    3. 创建EmailMessage对象:这是实际的邮件实体,可以设置发件人、收件人、主题、正文等属性。 4. 设置附件:如果需要发送附件,可以通过EmailMessage的addAttachment方法添加。 5. 发送邮件:使用EmailMessage的send...

Global site tag (gtag.js) - Google Analytics