第七讲:解析邮件内容

一、JavaMail解析邮件内容的流程

二、解析邮件内容

2.1 解析普通邮件内容

如果Message.getContentType方法返回的MIME类型为"text/*"则表示邮件内容为文本内容,此时直接调用Message.getContent方法把邮件内容保存了一个String对象中输出给浏览器即可。但是现实邮件中会有HTML格式的邮件内容时,邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"的MIME消息封装HTML代码。因此对于这两种类型要通过判断之后方可显示。

下面使用例子来进行判断:

当含有"text/plain"和"text/html"中时使用Message.getContentType返回的类型为"multipart/alternative"

public class Demo1 extends HttpServlet {

	String host = "pop3.163.com";
	String protocol = "pop3";
	String username = "XXX";
	String password = "XXX";

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=gb2312");
		PrintWriter out = response.getWriter();

		Properties props = new Properties();
		props.setProperty("mail.store.protocol", protocol);
		props.setProperty("mail.pop3.host", host);
		javax.mail.Session session = javax.mail.Session.getInstance(props);
		session.setDebug(false);

		try {
			Store store = session.getStore(protocol);
			store.connect(host, username, password);
			Folder folder = store.getFolder("inbox");
			folder.open(Folder.READ_WRITE);

			Message[] msgs = folder.getMessages();
			for(int i=0; i< msgs.length; i++){
				String from = msgs[i].getFrom()[0].toString();
				String subject = msgs[i].getSubject();
				out.print("第"+(i+1)+"封邮件<br/>");
				out.print("发件人:"+from);
				out.print("主题:"+subject);
				/**
				 * 检查是否是"multipart/alternative"类型,
				 * 如果是取出其中的"text/html"类型的消息
				 */
				if(msgs[i].isMimeType("multipart/alternative")){
					Multipart mp = (Multipart)msgs[i].getContent();
					int bodynum = mp.getCount();
					for(int j=0; j<bodynum; j++){
						if(mp.getBodyPart(j).isMimeType("text/html")){
							String content = (String)mp.getBodyPart(j).getContent();
							out.print("邮件内容:"+content+"<br/>");
							out.print("-------------------------------<br/>");
						}
						else{
							out.print("不支持的邮件类型<br/>");
						}
					}
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

2.2 解析“multipart/related”类型的邮件

邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。IE浏览器显示的类型就是"multipart/related",因此可以通过IE浏览器显示邮件中的内容只需要将生成的文件名称改为html然后用浏览器打开即可。IE浏览器作为邮件数据显示工具式,不管邮件体中嵌套多少个内嵌资源,程序只需要向IE浏览器输出邮件体中的数据,并告诉浏览器以"message/rfc822"的形式进行处理就可以了。那么IE浏览器就会自动解析并且显示这种形式的邮件数据。

public class Demo2 extends HttpServlet {
	String host = "pop3.163.com";
	String protocol = "pop3";
	String username = "XXX";
	String password = "XXX";

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		Properties props = new Properties();
		props.setProperty("mail.store.protocol", protocol);
		props.setProperty("mail.pop3.host", host);
		javax.mail.Session session = javax.mail.Session.getInstance(props);
		session.setDebug(false);

		try {
			Store store = session.getStore(protocol);
			store.connect(host, username, password);
			Folder folder = store.getFolder("inbox");
			folder.open(Folder.READ_WRITE);

			/**
			 * 假设取得第一封邮件是"multipart/related"
			 * 则直接进行处理
			 */
			Message msg = folder.getMessage(0);
			response.setContentType("message/rfc822");
			msg.writeTo(System.out);
			msg.writeTo(out);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

2.3 使用IE解析正文需要注意的问题

一个IE浏览器只能处理一种数据类型,而我们在解析内嵌资源的邮件时,从邮件中解析出来的邮件头信息通常是以"text/html"格式向输出的,而邮件正文是以"message/rfc822"格式向IE浏览器输出的。因此要想在浏览器中显示符合人们阅读习惯的邮件信息,即在同一个浏览器窗口中即显示邮件头信息又显示邮件正文,就需要对浏览器窗口进行分帧,每个帧窗口显示一种格式的邮件数据。

例如下面的jsp文件用于连接邮件服务器并且缓存Folder对象到会话对象Session中,该文件还定义了两个证窗口分别用来显示邮件头和邮件正文。

<%@ page language="java" import="java.util.*" import="javax.mail.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

	String host = "pop3.163.com";
	String protocol = "pop3";
	String username = "XXX";
	String password = "XXX";
	Properties props = new Properties();
		props.setProperty("mail.store.protocol", protocol);
		props.setProperty("mail.pop3.host", host);
		javax.mail.Session mailSession = javax.mail.Session.getInstance(props);
		mailSession.setDebug(true);

		try {
			Store store = mailSession.getStore(protocol);
			store.connect(host, username, password);
			Folder folder = store.getFolder("inbox");
			folder.open(Folder.READ_WRITE);
			session.setAttribute("folder", folder);
		} catch (Exception e) {
			e.printStackTrace();
		}
%>

<frameset>
	<frame src="/receivedMail/displayHeader" scrolling="no">
	<frame src="/receivedMail/displayContent" scrolling="no">
</frameset>

2.4 解析邮件附件

在Web应用中解析包含附件的邮件时,只需要从Message对象中解析出保存附件数据的BodyPart对象,然后从BodyPart对象中得到附件的输入流、附件的MIME类型和附件的文件名,并且这些信息输出给IE浏览器。浏览器收到信息后,会根据数据的MIME类型弹出相应的对话框提示用户下载或打开附件。

public class Demo3 extends HttpServlet {

	String host = "pop3.163.com";
	String protocol = "pop3";
	String username = "XXX";
	String password = "XXX";

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=gb2312");
		PrintWriter out = response.getWriter();

		Properties props = new Properties();
		props.setProperty("mail.store.protocol", protocol);
		props.setProperty("mail.pop3.host", host);
		javax.mail.Session mailSession = javax.mail.Session.getInstance(props);
		mailSession.setDebug(false);

		try {
			Store store = mailSession.getStore(protocol);
			store.connect(host, username, password);
			Folder folder = store.getFolder("inbox");
			folder.open(Folder.READ_WRITE);

			Message msg1 = folder.getMessage(1);
			request.getSession().setAttribute("message", msg1);

			String from = msg1.getFrom()[0].toString();
			String subject = msg1.getSubject();
			String sendDate = DateFormat.getInstance().format(msg1.getSentDate());
			out.print("发件人:"+from+"<br/>");
			out.print("主题:"+subject+"<br/>");
			out.print("发件日期:"+sendDate+"<br/>");

			Multipart mp = (Multipart)msg1.getContent();
			for(int i=0; i<mp.getCount(); i++){
				BodyPart bp =mp.getBodyPart(i);
				if(bp.getDisposition()!=null){
					String fileName = bp.getFileName();
					if(fileName.startsWith("=?")){
						fileName = MimeUtility.decodeText(fileName);
					}
					out.print("附件:");
					out.print("<a href=\\receivedMail\\HandleAttach?>"+
					"bodynum="+ i +"&&filename= " + fileName + "</a><br/>");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

下面的文件是在用户点击上述的连接时就会自动的现在文件:

public class HandleAttach extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		HttpSession session = request.getSession();
		ServletOutputStream out = response.getOutputStream();

		int bodynum = Integer.parseInt(request.getParameter("bodynum"));
		String fileName = request.getParameter("filename");

		Message message = (Message)session.getAttribute("message");

		try {
			response.setHeader("Content-Disposition", "attachment;filename="+fileName);
			Multipart mp = (Multipart)message.getContent();
			BodyPart bp = mp.getBodyPart(bodynum);
			InputStream is = bp.getInputStream();

			int c=0;
			if((c = is.read())!= -1){
				out.write(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

第七讲:解析邮件内容

时间: 2024-10-09 09:53:11

第七讲:解析邮件内容的相关文章

JavaMail解析邮件内容(经典收藏)

import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; /** * 有一封邮件就需要建立一个ReciveMail对象 */ public class ReciveOneMail { private MimeMessage mimeMessage = null; private String saveAttachPath = ""

今天玩一下python得邮件解析吧,查看邮件内容小儿科,我们下载邮件的附件

直男,直接上代码. 自己看打印的内容 主要功能如下: #如果邮件内容存在链接则返回链接,若不存在则直接下载邮件附件 1 import imapclient,re 2 import pyzmail 3 4 5 #提取邮件里面的链接 6 def getDowmlodUrl(): 7 url = None 8 #这里是腾讯企业邮箱,其他的自行百度 9 imapObj = imapclient.IMAPClient('imap.exmail.qq.com',ssl=True) 10 #邮箱和密码 11

Stanford机器学习---第七讲. 机器学习系统设计

本文原始版本见http://blog.csdn.net/abcjennifer/article/details/7834256 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Standford公开课mach

蓝鸥零基础学习HTML5第七讲 常见标签及标签类型的转换

蓝鸥零基础学习HTML5第七讲 常见标签及标签类型的转换 1.常见标签-块属性的标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="css/reset.css"> </head> <

Linux基础知识第七讲,用户权限以及用户操作命令

目录 Linux基础知识第七讲,用户权限以及用户操作命令 一丶简介linux用户,用户权限,组的概念. 1.1 基本概念 1.2 组 1.3 ls命令查看权限. 二丶用户权限修改命令 1.chmod 命令的使用 三丶超级用户,以及组操作. 1.什么是超级用户 2.组管理 四丶添加linux用户,以及删除linux用户 1.命令 2.用户命令 3.让添加的用户具有sudo权限 4.which 查看命令所执行位置的路径 5.用户切换 Linux基础知识第七讲,用户权限以及用户操作命令 一丶简介lin

(笔记)斯坦福机器学习第七讲--最优间隔分类器

本讲内容 1.Optional margin classifier(最优间隔分类器) 2.primal/dual optimization(原始优化问题和对偶优化问题)KKT conditions(KKT条件) 3.SVM dual (SVM的对偶问题) 4.kernels (核方法) 1.最优间隔分类器 对于一个线性可分的训练集合,最优间隔分类器的任务是寻找到一个超平面(w,b), 使得该超平面到训练样本的几何间隔最大. 你可以任意地成比例地缩放w和b的值,这并不会改变几何间隔的大小. 例如,

32位汇编第七讲,混合编程,内联汇编

32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时候我们会想,C语言可不可以调用汇编的函数,或者反过来调用 或者说C语言里面内部直接内联汇编去编写. 可以实现,静看怎么实现 一丶C语言调用汇编语言的函数 1.创建工程和代码 ①创建VC++控制台程序 FILE(文件) - NEW (新建) 然后我们打开源文件,一级一级展开,找到我们的main函数 那

JavaMail入门第五篇 解析邮件

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

node.js实现收取邮件,以及对特定邮件内容的自动回复,邮件正文保存的功能

废话不多说,直接上代码... var Imap = require('imap');var inspect = require('util').inspect;var MailParser = require("mailparser").MailParser;var nodemailer = require('nodemailer'); var fs = require('fs');var http = require('http'); var imap = new Imap({ us