`

利用JavaMail实现邮件的收取

阅读更多

     昨天写了一个利用JavaMail发送邮件的示例,本着有始有终的原则。今天写了一篇利用JavaMail收取邮件的示例。由于实力有限,代码写的不周到的地方,请大家见亮。本人只是写了一个简单的例子,在实际项目开发中,还有很多东西需要读者自己去斟酌和修改。废话不多说,直接上代码。

1、一些参数配置的常量类

package com.bao.receivemail;

/**
 * 邮件配置的常量类
 */
public class Config {
	
	public static String MAIL_HOST = "pop3.163.com";//服务器ip
	
	public static int MAIL_PORT = 110;//端口
	
	public static String MAIL_TYPE = "pop3";//服务类型
	
	public static String MAIL_AUTH = "true";
	
	public static String MAIL_ATTACH_PATH = "upload/recMail/";//附件存放目录
}

2、邮件的收取类

package com.bao.receivemail;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Properties;

import javax.mail.BodyPart;
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.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

import com.sun.mail.pop3.POP3Message;

/**
 * 邮件的收取类
 */
public class ReceiveMailHandler {
    
	/**
	 * 获取session会话的方法
	 * @return
	 * @throws Exception
	 */
    private Session getSessionMail() throws Exception {
    	Properties properties = System.getProperties();
    	properties.put("mail.smtp.host", Config.MAIL_HOST);
    	properties.put("mail.smtp.auth", Config.MAIL_AUTH);
    	Session sessionMail = Session.getDefaultInstance(properties, null);
	    return sessionMail;
    }
    
    /**
	 * 接收邮件
	 * @param 邮箱的用户名和密码
	 * @return 无
	 */
	public void receiveMail(String userName,String passWord) {
    	Store store = null;
    	Folder folder = null;
    	int messageCount = 0;
    	URLName urln = null;
		try{
			//进行用户邮箱连接
			urln = new URLName(Config.MAIL_TYPE, Config.MAIL_HOST, Config.MAIL_PORT, null,userName,passWord);   
			store = getSessionMail().getStore(urln);   
			store.connect();
			//获得邮箱内的邮件夹Folder对象,以"只读"打开
			folder = store.getFolder("INBOX");//打开收件箱
			folder.open(Folder.READ_ONLY);//设置只读
			//获得邮件夹Folder内的所有邮件个数
			messageCount = folder.getMessageCount();// 获取所有邮件个数
	        //获取新邮件处理
			System.out.println("============>>邮件总数:"+messageCount);
			if(messageCount > 0){
				Message[] messages = folder.getMessages(messageCount,messageCount);//读取最近的一封邮件
				for(int i = 0;i < messages.length;i++) {	
					String content = getMailContent((Part)messages[i]);//获取内容
				    if (isContainAttach((Part)messages[i])) {
	                	saveAttachMent((Part)messages[i],Config.MAIL_ATTACH_PATH);
	                } 
					System.out.println("=====================>>开始显示邮件内容<<=====================");
		            System.out.println("发送人: " + getFrom(messages[i]));
		            System.out.println("主题: " + getSubject(messages[i]));
		            System.out.println("内容: " + content);
		            System.out.println("发送时间: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(((MimeMessage) messages[i]).getSentDate()));
	                System.out.println("是否有附件: " + (isContainAttach((Part)messages[i]) ? "有附件" : "无附件"));
		            System.out.println("=====================>>结束显示邮件内容<<=====================");
		            ((POP3Message) messages[i]).invalidate(true);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(folder != null && folder.isOpen()){
				try {
					folder.close(true);
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
			if(store.isConnected()){
				try {
					store.close();
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		}
    }
   
	/**
     * 获得发件人的地址
     * @param message:Message
     * @return 发件人的地址
     */
	private String getFrom(Message message) throws Exception {  
        InternetAddress[] address = (InternetAddress[]) ((MimeMessage) message).getFrom();    
        String from = address[0].getAddress();    
        if (from == null){
        	from = "";
        }
        return from;    
    }
	
	 /**
     * 获得邮件主题   
     * @param message:Message
     * @return 邮件主题  
     */
	private String getSubject(Message message) throws Exception {
    	String subject = "";
    	if(((MimeMessage) message).getSubject() != null){
    		subject = MimeUtility.decodeText(((MimeMessage) message).getSubject());// 将邮件主题解码  
    	}
    	return subject;    
    }
	
    /**
     * 获取邮件内容
     * @param part:Part
     */
	private String getMailContent(Part part) throws Exception {    
		StringBuffer bodytext = new StringBuffer();//存放邮件内容
		//判断邮件类型,不同类型操作不同
		if (part.isMimeType("text/plain")) {    
            bodytext.append((String) part.getContent());    
        } else if (part.isMimeType("text/html")) {    
            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 {}    
        return bodytext.toString();
    }
    
    /**
     * 判断此邮件是否包含附件 
     * @param part:Part
     * @return 是否包含附件
     */
	private boolean isContainAttach(Part part) throws Exception { 
        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 = 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;    
    }	
	
	 /**
     * 保存附件
     * @param part:Part
     * @param filePath:邮件附件存放路径
     */
	private void saveAttachMent(Part part,String filePath) throws Exception {    
    	String fileName = "";
    	//保存附件到服务器本地
        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)))) {   
                	fileName = mpart.getFileName();    
                	if (fileName != null) {
                    	fileName = MimeUtility.decodeText(fileName);
                        saveFile(fileName, mpart.getInputStream(),filePath);  
                    }  
                } else if (mpart.isMimeType("multipart/*")) {    
                	saveAttachMent(mpart,filePath);
                } else {
                	fileName = mpart.getFileName();    
                	if (fileName != null) {
                    	fileName = MimeUtility.decodeText(fileName);
                        saveFile(fileName, mpart.getInputStream(),filePath);
                    }    
                }    
            }    
        } else if (part.isMimeType("message/rfc822")) {    
            saveAttachMent((Part) part.getContent(),filePath);    
        }
        
    }
    
    /**
     * 保存附件到指定目录里 
     * @param fileName:附件名称
     * @param in:文件输入流
     * @param filePath:邮件附件存放基路径
     */
    private void saveFile(String fileName, InputStream in,String filePath) throws Exception {    
    	File storefile = new File(filePath);   
        if(!storefile.exists()){
        	storefile.mkdirs();
    	}
        BufferedOutputStream bos = null;   
        BufferedInputStream bis = null;   
        try {   
            bos = new BufferedOutputStream(new FileOutputStream(filePath + "\\" + fileName));   
            bis = new BufferedInputStream(in);   
            int c;   
            while ((c = bis.read()) != -1) {   
                bos.write(c);   
                bos.flush();   
            }   
        } catch (Exception e) {   
        	throw e;   
        } finally {
        	if(bos != null){
        		bos.close();
        	}
            if(bis != null){
            	bis.close();
            }
        }   
    } 
}

 3、测试程序

package com.bao.main;

import com.bao.receivemail.ReceiveMailHandler;

public class Main {

	public static void main(String[] args) {
		try {
			new ReceiveMailHandler().receiveMail("username", "password");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果会在控制台打印出来,只读取了邮箱中最新的那一封邮件。如果有附件,附件会自动保存到项目中你设置的文件目录中。程序不上传了,大家自己看下吧!谢谢大家的支持^.^!

4
5
分享到:
评论
3 楼 alice2012 2012-09-13  
辛苦啦~~~
2 楼 cx372877498 2012-09-13  
支持下,感谢分享
1 楼 TheMatrix 2012-09-13  
我的毕设就是用Javamail写的,当然你写的应该比较好吧。

相关推荐

    利用JavaMail实现邮件的收取.doc

    【JavaMail实现邮件收取详解】 JavaMail 是一个用于处理电子邮件的开源库,它提供了发送和接收邮件的功能。本文将详细讲解如何使用JavaMail API来实现邮件的收取。 首先,我们需要了解一些基本配置。在示例代码中...

    james和javamail实现邮件收发(带发送附件)

    在这个例子中,我们将深入探讨如何利用James服务器和JavaMail API来实现这一目标,同时处理中文内容和附件。 首先,James(Apache James)是一个开源的邮件服务器,它支持SMTP、POP3和IMAP协议,可以作为企业级的...

    javamail收取邮件(包括附件)

    在JavaMail中,我们可以利用其API来实现邮件的收发功能,包括处理附件。下面我们将详细探讨如何使用JavaMail API实现邮件的收取,特别是如何通过POP3和IMAP协议获取邮件信息。 首先,确保你的项目中已经引入了...

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

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未...同时,利用调试工具深入理解邮件发送的具体流程也有助于快速定位和解决问题。

    javamail通过imap协议收取邮件(Exchange2007)

    在JavaMail中使用IMAP协议来收取Exchange 2007中的邮件,首先需要理解以下几个关键概念: 1. **JavaMail API**: JavaMail API提供了一系列的类和接口,如`Session`、`Store`、`Folder`和`Message`,它们是处理邮件...

    基于Javamail的邮件收发系统.zip

    通过理解以上核心概念,你可以根据项目中的代码实现,详细学习如何利用JavaMail API搭建一个完整的邮件收发系统。这个项目可能涵盖了创建、配置`Session`,构建`Message`,连接`Store`,操作`Folder`,以及使用`...

    javamail附件从流中获取

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。...通过合理地组织代码和利用提供的工具类,可以轻松实现这一功能。在实际开发中,我们还需要注意错误处理和异常捕获,确保邮件发送的健壮性。

    JavaMail邮件上传发送的成功的小demo

    JavaMail邮件上传发送的成功的小demo是一个实用的程序示例,它展示了如何利用JavaMail API在Java应用程序中实现邮件的上传和发送功能。JavaMail是一个开源的Java库,它提供了丰富的API,使得开发者能够轻松地处理...

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

    这个项目的核心是利用JavaMail API来实现邮件的发送和接收功能,为用户提供高效、稳定、安全的邮件服务。下面将详细介绍这个系统的关键知识点。 1. **JavaMail API**:JavaMail API 是一套用于处理电子邮件的开源库...

    JavaMail邮件系统

    在名为"MyJavaMail"的压缩包文件中,可能包含了实现上述功能的源代码示例、配置文件、库依赖等资源,开发者可以通过学习这些内容来理解和构建自己的JavaMail邮件系统。对于初学者,理解并实践这些代码可以帮助深入...

    利用JavaGUI和javamail实现的email客户端.pdf

    - **收取邮件功能**:通过POP3或IMAP协议,从邮件服务器下载新邮件到客户端。 - **发送邮件功能**:使用SMTP协议将邮件发送到指定的收件人地址。 - **通讯录功能**:客户端提供保存联系人信息的功能,方便用户...

    JavaMail_简易教程

    ### JavaMail简易教程知识点概述 #### 一、JavaMail API简介 ...以上是对JavaMail简易教程的主要知识点总结,通过掌握这些内容,开发者可以利用JavaMail API高效地开发出功能强大的邮件应用程序。

    javamail Demo

    2. **POP3(Post Office Protocol version 3)**:POP3 是一种邮件收取协议,主要用于从邮件服务器下载邮件。用户通常在完成邮件阅读后,可以选择在本地存储或删除服务器上的邮件。JavaMail 提供了对 POP3 的支持,...

    JavaMail_API详解.doc

    了解相关的邮件协议(如SMTP、POP、IMAP和MIME)对于有效地利用JavaMail API至关重要。通过这个API,开发者可以创建功能丰富的邮件应用,如邮件客户端,或者在企业级应用中实现邮件通知等功能。在使用JavaMail API时...

    email客户端-实现发送邮件-纯java实现-包括所需要的库文件

    在这个“email客户端-实现发送邮件-纯java实现-包括所需要的库文件”的主题中,我们将深入探讨如何使用 JavaMail API 实现一个简单的电子邮件客户端,以及必要的库文件。 首先,JavaMail API 提供了 javax.mail 包...

    模拟邮件系统(SMTP+POP3协议)计算机网络课程设计

    设计内容: 基于SMTP协议,编写程序模拟邮件系统收发邮件的运行...本系统的总体目标是为了实现邮件的发送与收取。其中主要是用户登录并与公网邮箱绑定后,使用SMTP协议向其他邮箱发送邮件、查看收件箱并对收件进行回复

    完整邮件客户端

    3. 接收邮件:利用POP3协议,JavaMail可以从邮件服务器上拉取邮件,将其存储在本地或展示给用户。邮件的检索通常基于用户账户,按时间顺序排列。 二、POP3与SMTP协议 1. POP3(Post Office Protocol version 3):...

    基于WEB的电子邮件系统邮件协议研究与系统功能实现毕业论文.doc

    该系统利用JavaMail、Struts、Spring和Hibernate等开源框架,采用面向对象的设计方法,旨在提供一个高效、安全且易于使用的电子邮件服务。 1. 引言 随着互联网技术的发展,基于WEB的电子邮件系统已经成为日常通信...

    邮件客户端论文

    本文主要探讨的是基于JavaMail的邮件服务系统客户端的实现,这是一种使用Java编程语言和Eclipse 3.2开发工具构建的应用程序,旨在提供简洁易用的邮件管理功能,包括发送、接收、转发、回复邮件以及管理地址簿。...

Global site tag (gtag.js) - Google Analytics