JavaMail:利用Tomcat和浏览器解析邮件内容
2010-07-23 00:47
357 查看
前面的文章 JavaMail:简单的邮件接收程序 只是简单地介绍了如何接收邮箱里面的邮件,并未涉及到邮件内容的解析。因此,当时我们只能在控制台中输出获取到邮件中的原始内容,里面有繁杂的邮件头格式和内容,也有被重新编码后的邮件正文等等,这些原始内容都是我们不能直接读懂的。这,确实没什么意思…
于是,我们需要根据一定的格式和方法将获取到的邮件进行解析,转换成我们平时在 Outlook 或者一些网页上看到的邮件那样子,当然是我们能看懂的啦。
不过,要我们掌握如何对邮件中复杂的 MIME 格式规范进行准确解析,那是相当地不简单,怎么办?这里我们简单地利用 Tomcat 服务器和 Servlet 、JSP 编程技术来简化这一过程,其实,最重要的角色还是浏览器,因为我们只需要将邮件中的原始内容的 MIME 的数据类型(例如message/rfc822 和 text/html )清楚地告知浏览器就可以了。由浏览器从本机注册表中查询到该用哪一种处理方式来处理这些数据,以便于在浏览器中显示出来。
可能这样说着比较难理解,下面是实际操作:
1、用 test_hao@sina.cn 邮箱向 testhao@126.com 邮箱发送一封正文中图文并茂的邮件,如下图:
2、我们登录收到邮件的 testhao@126.com 邮箱中接收这封邮件,并读取、显示在浏览器中;
3、由于需要将邮件的原始内容传输给浏览器进行显示,需要用到 Tomcat 服务器以及 Servlet 、JSP 编程技术,由于邮件中的邮件头格式(text/html )与邮件正文的格式(message/rfc822)一般都不同,因此需要两个 Web 页面来分别指定各自的数据类型。但是在这里我们灵活变通一下,使用 HTML 将一个 Web 页面划分成两个帧,这就达到在同一 Web 页面中使用两种数据类型的需求了;
4、基于上述内容,我们的程序如下:
编写两个 Servlet 程序:ShowMessageContent.java 和 ShowMessageHeader.java ,从文件名种明显可以看出它们分别是负责将邮件正文内容、邮件头信息传输给浏览器进行解析并显示;
而另一个 showMessagePage.jsp 页面则用于登录对应的 POP3 服务器接收邮件,并把 Web 页面划分成两个帧;
此外,Servlet 程序需要在 web.xml 文件中配置 Servlet 信息。
程序代码:
showMessagePage.jsp
ShowMessageHeader.java
ShowMessageContent.java
web.xml 文件
测试过程:
1、编译两个 Servlet 程序,将生成的 .class 文件放到 JavaMail\WEB-INF\classes 文件中;
2、配置 web.xml 文件;
3、开启 Tomcat 服务器,在浏览器地址栏输入(根据我的具体情况)http://localhost:8080/JavaMail/showMessagePage.jsp ,得到以下结果:
看一下我们登录到邮箱时看到的结果:
小结:
1、由于在 ShowMessageContent.java 程序中调用了 response.setContentType("message/rfc822"); 所以上面正文部分的中文乱码了,大概是因为要设置字符集才行,不过我们已经设置为了 message/rfc822 类型,所以无法再重新设置。看来应该将纯文本和内嵌的图片分开来显示,看看这个功能能不能在下一篇文章中解决掉;
2、很明显 126 邮箱将内嵌的图片作为附件来解析了,这是服务器的问题,各个不同的邮件服务器可能都有不同的解析结果。
3、我们还可以在控制台中输出的信息中看一下程序与 POP3 服务器通信、传输数据的过程。
我的相关文章:
JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
JavaMail:简单的邮件接收程序
JavaMail:搜索、过滤接收邮件,删除邮件
JavaMaill:使用MIME协议创建内含图片的复杂邮件
JavaMail:创建内含附件、图文并茂的邮件
于是,我们需要根据一定的格式和方法将获取到的邮件进行解析,转换成我们平时在 Outlook 或者一些网页上看到的邮件那样子,当然是我们能看懂的啦。
不过,要我们掌握如何对邮件中复杂的 MIME 格式规范进行准确解析,那是相当地不简单,怎么办?这里我们简单地利用 Tomcat 服务器和 Servlet 、JSP 编程技术来简化这一过程,其实,最重要的角色还是浏览器,因为我们只需要将邮件中的原始内容的 MIME 的数据类型(例如message/rfc822 和 text/html )清楚地告知浏览器就可以了。由浏览器从本机注册表中查询到该用哪一种处理方式来处理这些数据,以便于在浏览器中显示出来。
可能这样说着比较难理解,下面是实际操作:
1、用 test_hao@sina.cn 邮箱向 testhao@126.com 邮箱发送一封正文中图文并茂的邮件,如下图:
2、我们登录收到邮件的 testhao@126.com 邮箱中接收这封邮件,并读取、显示在浏览器中;
3、由于需要将邮件的原始内容传输给浏览器进行显示,需要用到 Tomcat 服务器以及 Servlet 、JSP 编程技术,由于邮件中的邮件头格式(text/html )与邮件正文的格式(message/rfc822)一般都不同,因此需要两个 Web 页面来分别指定各自的数据类型。但是在这里我们灵活变通一下,使用 HTML 将一个 Web 页面划分成两个帧,这就达到在同一 Web 页面中使用两种数据类型的需求了;
4、基于上述内容,我们的程序如下:
编写两个 Servlet 程序:ShowMessageContent.java 和 ShowMessageHeader.java ,从文件名种明显可以看出它们分别是负责将邮件正文内容、邮件头信息传输给浏览器进行解析并显示;
而另一个 showMessagePage.jsp 页面则用于登录对应的 POP3 服务器接收邮件,并把 Web 页面划分成两个帧;
此外,Servlet 程序需要在 web.xml 文件中配置 Servlet 信息。
程序代码:
showMessagePage.jsp
<%@ page language="java" import="java.util.*,javax.mail.*" pageEncoding="gbk"%> <% // 连接pop3服务器的主机名、协议、用户名、密码 String pop3Server = "pop3.126.com"; String protocol = "pop3"; String user = "testhao"; String pwd = "123456"; // 创建一个有具体连接信息的Properties对象 Properties props = new Properties(); props.setProperty("mail.store.protocol", protocol); props.setProperty("mail.pop3.host", pop3Server); // 使用Properties对象获得Session对象 Session mailSession = Session.getDefaultInstance(props,null); mailSession.setDebug(true); try{ // 利用Session对象获得Store对象,并连接pop3服务器 Store store = mailSession.getStore(); store.connect(pop3Server, user, pwd); // 获得邮箱内的邮件夹Folder对象,以"读-写"打开 Folder folder = store.getFolder("inbox"); folder.open(Folder.READ_WRITE); // 将上面读取到的邮件夹folder设置为属性 session.setAttribute("folder", folder); }catch(Exception e){ e.printStackTrace(); } // 下面用 HTML 将 web 页面分成两帧,便于针对邮件的 // "text/html"邮件头以及"message/rfc822" 格式的邮件正文 %> <frameset rows="25%,*"> <frame src="/JavaMail/showMessageHeader" scrolling="no"> <frame src="/JavaMail/showMessageContent" scrolling="no"> </frameset>
ShowMessageHeader.java
import java.io.*; import java.text.DateFormat; import javax.mail.*; import javax.servlet.*; import javax.servlet.http.*; public class ShowMessageHeader extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gbk"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); Folder folder = (Folder)session.getAttribute("folder"); try{ // 作为实验,这里只获取第 1 封邮件 Message message = folder.getMessage(1); String from = (message.getFrom()[0]).toString(); String subject = message.getSubject(); String sendDate = DateFormat.getInstance().format(message.getSentDate()); out.println("邮件主题:" + subject + "<br/>"); out.println("发件人地址:" + from + "<br/>"); out.println("发送日期:" + sendDate + "<br/>"); }catch(Exception e){ e.printStackTrace(); } } }
ShowMessageContent.java
import java.io.*; import javax.mail.*; import javax.servlet.*; import javax.servlet.http.*; public class ShowMessageContent extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取输出流、Session 会话对象、邮件夹 Folder 对象 ServletOutputStream out = response.getOutputStream(); HttpSession session = request.getSession(); Folder folder = (Folder)session.getAttribute("folder"); try{ // 取得邮件夹中的邮件,并设置MIME类型 // 为"message/rfc822"格式,交给浏览器处理 Message message = folder.getMessage(1); response.setContentType("message/rfc822"); message.writeTo(out); }catch(Exception e){ e.printStackTrace(); } } }
web.xml 文件
<?xml version="1.0" encoding="gb2312"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>ShowMessageHeader</servlet-name> <servlet-class>ShowMessageHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowMessageHeader</servlet-name> <url-pattern>/showMessageHeader</url-pattern> </servlet-mapping> <servlet> <servlet-name>ShowMessageContent</servlet-name> <servlet-class>ShowMessageContent</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowMessageContent</servlet-name> <url-pattern>/showMessageContent</url-pattern> </servlet-mapping> </web-app>
测试过程:
1、编译两个 Servlet 程序,将生成的 .class 文件放到 JavaMail\WEB-INF\classes 文件中;
2、配置 web.xml 文件;
3、开启 Tomcat 服务器,在浏览器地址栏输入(根据我的具体情况)http://localhost:8080/JavaMail/showMessagePage.jsp ,得到以下结果:
看一下我们登录到邮箱时看到的结果:
小结:
1、由于在 ShowMessageContent.java 程序中调用了 response.setContentType("message/rfc822"); 所以上面正文部分的中文乱码了,大概是因为要设置字符集才行,不过我们已经设置为了 message/rfc822 类型,所以无法再重新设置。看来应该将纯文本和内嵌的图片分开来显示,看看这个功能能不能在下一篇文章中解决掉;
2、很明显 126 邮箱将内嵌的图片作为附件来解析了,这是服务器的问题,各个不同的邮件服务器可能都有不同的解析结果。
3、我们还可以在控制台中输出的信息中看一下程序与 POP3 服务器通信、传输数据的过程。
我的相关文章:
JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
JavaMail:简单的邮件接收程序
JavaMail:搜索、过滤接收邮件,删除邮件
JavaMaill:使用MIME协议创建内含图片的复杂邮件
JavaMail:创建内含附件、图文并茂的邮件
相关文章推荐
- JavaMail:利用Tomcat和浏览器解析邮件内容
- javaMail邮件接收解析内容及附件 及删除邮件
- javaMail解析邮件内容和下载附件
- JavaMail解析邮件内容(经典收藏)
- JavaMail深入体验开发三: 利用Tomcat管理邮件session及jar包冲突解决方案
- javamail解析邮件正文内容重复
- javamail 发送邮件 无主题 无收件人 邮件内容乱码 解决
- Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)
- 利用JavaMail创建邮件的示例
- JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
- JavaMail:在Web应用下完整接收、解析复杂邮件
- 用JavaMail显示复合邮件的内容[转载]
- 利用javaMail发送邮件的方法
- 利用chrome插件批量读取浏览器页面内容并写入数据库
- 关于浏览器向服务端(自己写的个tomcat小服务器程序,仅供测试)发送请求的具体内容
- HTML中head里的内容经浏览器解析后全到body里
- 【利用javamail和POP3、SMPT协议实现邮件的收发】
- PHP 利用fsockopen抓取页面后对内容做解析
- javaMail邮件内容乱码的问题解决
- SS vector - 利用浏览器HTML注释解析问题执行javascript(一)