JavaMail实现收发邮件——(三)接收邮件

JavaMail接收邮件和发送邮件基本一致,大体上是把Transport换成了Store。不过和发送相比,难点是对接收到的邮件进行解析,不然看起来就跟乱码一样。之所以解析这一块难,就在于一封未知的邮件你不知道它的结构是怎样的,因此需要我们通过判断一步步解析。对于这一点,我也不是很清楚,所以下面我就瞎写一点基础的。

一.首先连接POP3服务器获取邮件

(1)创建Properties对象以及Session对象

// 创建一个有具体连接信息的Properties对象  
Properties properties = new Properties();
properties.put("mail.store.protocal", protocal);
properties.put("mail.pop3.host", pop3Server);		

// 使用Properties对象获得Session对象  
Session session = Session.getInstance(properties);
session.setDebug(false);

(2)利用Session对象获得Store对象,并连接pop3服务器

try {
Store store = session.getStore(protocal);
store.connect(pop3Server,username, password);

//获取收件箱  
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);  //以只读权限打开收件箱  
/**
 * Folder.READ_ONLY:表示只读权限。
 * Folder.READ_WRITE:表示可以修改并读取邮件夹中的邮件。
 **/

//获取收件箱中的邮件
Message[] messages = folder.getMessages();
System.out.println("总的邮件数目:"+messages.length);
System.out.println("新邮件数目:"+folder.getNewMessageCount());
System.out.println("未读邮件数目:"+folder.getUnreadMessageCount());

(3)对邮件进行一些处理后,然后进行格式化输出

for(int i=0;i<messages.length;i++){
	HandleReceivedMail handleOneMail = new HandleReceivedMail((MimeMessage) messages[i]);
	System.out.println("Message "+ i + " : 主题:"+handleOneMail.getSubject());
	System.out.println("Message "+ i + " : 时间:"+handleOneMail.getSendDate());
	System.out.println("Message "+ i + " : 发件人:"+handleOneMail.getFrom());
//	System.out.println("Message "+ i + " : Message-ID:"+handleOneMail.getMessageID());
	System.out.println("Message "+ i + " : 回执:"+handleOneMail.getReplySign());
	handleOneMail.getMailContent((Part)messages[i]);
	System.out.println("Message "+ i + " : 正文:"+handleOneMail.getBodyText());
	System.out.println("Message "+ i + " : 附件:"+handleOneMail.isContainAttach((Part)messages[i]));
	System.out.println();
}

(4)关闭连接

//关闭连接
folder.close(false);
store.close();

二.对获取到的邮件传入到一个处理类HandleReceivedMail中进行处理

(1)对主题等内容进行解密,防止中文乱码

public String changeEncode(String str){
		try {
			 if (str == null || "".equals(str)) 
		         str = ""; 
			 else
				 str = MimeUtility.decodeText(str); 
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return str;
	}

(2)获取邮件主题

public String getSubject(){
		String subject = "";
		try {
			subject = changeEncode(mimeMessage.getSubject());
			if(subject == null)
				subject = "";
			return subject;
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		return null;
	}

(3)获取邮件发送时间

public String getSendDate(){
		try {
			Date sendDate = mimeMessage.getSentDate();
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			return dateFormat.format(sendDate);
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

(4)获取发件人姓名和地址

public String getFrom(){
		try {
			InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
			String person = address[0].getPersonal();  //姓名
			if(person == null)
				person = "";
			String from = address[0].getAddress();  //地址
			if(from == null)
				from = "";
			return person+"["+from+"]";
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}

(5)获取邮件的Message-ID

public String getMessageID(){
		try {
			return mimeMessage.getMessageID();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

(6)判断邮件是否需要回执,需要返回“true”,否则返回“false”

	public boolean getReplySign(){
		try {
			String[] reply = mimeMessage.getHeader("Disposition-Notification-To");
			if(reply != null)
				return true;
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}	

(7)解析邮件

public void getMailContent(Part part){
		try {
			String contentType = part.getContentType();
			int nameIndex = contentType.indexOf("name");
			boolean isContainTextAttach = false;  //判断邮件中是否含有嵌套体
			if(nameIndex != -1)
				isContainTextAttach = true;
			if(part.isMimeType("text/plain") && !isContainTextAttach)
				bodytext.append((String)part.getContent());
			else if(part.isMimeType("text/html") && !isContainTextAttach)
				bodytext.append((String)part.getContent());  //对于HTML格式邮件,可以在前后加上标签<html><head>subject</head><body>bodytext</body></html>,保存为html格式文件(PS:未写)
			else if(part.isMimeType("message/rfc822"))
				getMailContent((Part) part.getContent());
			else if(part.isMimeType("multipart/*")){
				Multipart multipart = (Multipart) part.getContent();
				int count = multipart.getCount();
				for(int i=0;i<count;i++)
					getMailContent(multipart.getBodyPart(i));
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

(8)正文文本内容

public String getBodyText(){
		return bodytext.toString();
	}

(9)判断是否包含附件

public boolean isContainAttach(Part part){
		boolean attachflag = false;  //是否有附件
		try {
			String contentType = part.getContentType();
			if(part.isMimeType("multipart/*")){
				Multipart multipart = (Multipart) part.getContent();
				for(int i=0;i<multipart.getCount();i++){
					BodyPart bodyPart = multipart.getBodyPart(i);
					String disposition = bodyPart.getDisposition();
					if((disposition != null) && (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE)))
						attachflag = true;
					else if(bodyPart.isMimeType("multipart/*"))
						attachflag = isContainAttach((Part)bodyPart);
					else{
						String bodytype = bodyPart.getContentType();
						if(bodytype.toLowerCase().indexOf("application") !=-1)
							attachflag = true;
						if(bodytype.toLowerCase().indexOf("name") !=-1)
							attachflag = true;
					}

				}
			}
			else if(part.isMimeType("message/rfc822"))
				attachflag = isContainAttach((Part)part.getContent());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return attachflag;
	}

(10)保存附件到本地

(PS:未写)

三.测试代码

public static void main(String[] args) {
	ReceiveMail receiveMail = new ReceiveMail("pop3.163.com","pop3","[email protected]","******");
//	ReceiveMail receiveMail = new ReceiveMail("pop.qq.com","pop3","[email protected]","******");
		receiveMail.receiveAllMail();
	}

注:1,关于POP3服务器,腾讯的和网易的写法还不一样,一个是:pop.qq.com,一个是:pop3.163.com

2,QQ邮箱如果短时间内大量连接或者重复连接的话,有可能会抽风,即使代码没问题也连不上,对于这种情况,要么等一会,要么换163或其他邮箱进行测试

附:

1,参考博文:http://xiangzhengyan.iteye.com/blog/85961

2,同样,我练习javamail所写的源代码放在了附件中,需要的可以参考下

时间: 2024-09-29 18:44:13

JavaMail实现收发邮件——(三)接收邮件的相关文章

JavaMail入门第四篇 接收邮件

上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操作,再介绍这些类之前,我们先来了解下邮件接收API的体系结构,JavaMail API中定义了一个java.mail.Store类,它用于执行邮件的接收任务,我们在程序中调用这个类中的方法可以获取邮箱中的各个邮件夹的信息.JavaMail使用Folder对象表示邮件夹,通过Folder对象的方法可以

JavaMail入门第五篇 解析邮件

上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类型的数据处理模块,我们只需要在把数据流传输给浏览器之前明确地指定该数据流属于哪种数据类型即可,之后一切的解析操作由浏览器自动帮我们完成.下面这张图可以很好的说明解析邮件的步骤 1.调用Message对象的getFrom.getSubject等方法,可以得到邮件的发件人和主题等信息,调用getCont

python中使用poplib模块接收邮件

目的:用poplib模块接收邮件,并处理文本内容. 环境:windows 7 Python 3.5.3 情景:服务器一般预警都会有邮件通知,如果通知比较多且邮箱还会收到其他的邮件时,这时从中整理出预警信息并统计的话,这个也算是一个比较重复繁琐的事,可以用脚本自动收集信息,并整理相关信息到表格内,方便查看. 使用邮件模块接收邮件需要导入poplib,这个模块是内置的. import poplib # 服务器及用户信息 email = '邮箱地址' username = '登录用户名' passwo

JavaMail实现收发邮件(五)使用SSL实现加密传输

一 概念简介 Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听.一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境.只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL.当前版本为3.0.它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输.(PS:来至百度百科) 二 在JavaM

JavaMail实现收发邮件——(一)相关概念概述

一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: l         SMTP:简单邮件传输协议,用于发送电子邮件的传输协议: l         POP3:用于接收电子邮件的标准协议: l         IMAP:互联网消息协议,是POP3的替代协议. 这三种协议都有

Android Java使用JavaMail API发送和接收邮件的代码示例

JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):mailapi.jar.定义了收发邮件所使用到的接口API:smtp.jar.包含了发送邮件使用到的类:pop3.

exchange系列(三)exchange邮件服务器的邮件传输管理

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:我们前面安装好了exchange2010,但是只能在公司内部发送邮件,如果要给qq邮箱.新浪邮箱,或者其他公司发送电子邮件就要经过internet.但并不是有网就可以,必须要做一系列的设置才能发送internet邮件.主要配置有以下几点: 1)发送连接器和接收连接器: 2)新建权威域: 3)购买域名并新建mx邮件交换记录,实验环境还

C# 利用Jmail接收邮件[转]

1.   w3 Jmail4.3组件重新设计了其内部结构--使用Message对象代替原来的单一对象Jmail.smtpmail发送邮件: 2.   w3 Jmail4.3组件一共有十多个对象(后面将详细介绍)--这些对象中,绝大多数是针对Jmail.Message对象操作的: 3.   支持从POP3邮件服务器收取邮件: 4.   支持加密邮件的传输: 5.   快速发送,一次会话就完成邮件发送: 6.   还有一个特性就是可以使用w3 Jmail4.3组件的集群发送功能一次发送成千上万个邮件

linux(CentOS)之postfix服务器Dovecot接收邮件

一.安装Dovecot来接收邮件,使用rpm方式安装完dovecot软件以后,需要经过一些修改才能正常使用. 首先,直接使用系统的yum源安装dovecot yum install dovecot 修改配置文件 1. 在/etc/dovecot/dovecot.conf中修改 protocols = imap pop3 lmtp    支持的协议 login_trusted_networks = 192.168.10.0/24   //指定允许登录的网段地址 这样在使用outlook客户端登录的