设为首页 收藏本站
查看: 639|回复: 0

[经验分享] JavaMail:利用Tomcat和浏览器解析邮件内容

[复制链接]

尚未签到

发表于 2017-2-6 10:53:12 | 显示全部楼层 |阅读模式
前面的文章 JavaMail:简单的邮件接收程序 只是简单地介绍了如何接收邮箱里面的邮件,并未涉及到邮件内容的解析。因此,当时我们只能在控制台中输出获取到邮件中的原始内容,里面有繁杂的邮件头格式和内容,也有被重新编码后的邮件正文等等,这些原始内容都是我们不能直接读懂的。这,确实没什么意思…  于是,我们需要根据一定的格式和方法将获取到的邮件进行解析,转换成我们平时在 Outlook 或者一些网页上看到的邮件那样子,当然是我们能看懂的啦。
  不过,要我们掌握如何对邮件中复杂的 MIME 格式规范进行准确解析,那是相当地不简单,怎么办?这里我们简单地利用 Tomcat 服务器和 Servlet 、JSP 编程技术来简化这一过程,其实,最重要的角色还是浏览器,因为我们只需要将邮件中的原始内容的 MIME 的数据类型(例如message/rfc822 和 text/html )清楚地告知浏览器就可以了。由浏览器从本机注册表中查询到该用哪一种处理方式来处理这些数据,以便于在浏览器中显示出来。
  可能这样说着比较难理解,下面是实际操作:
  1、test_hao@sina.cn 邮箱向
testhao@126.com 邮箱发送一封正文中图文并茂的邮件,如下图:http://img1.iyunv.com/attachment/201007/22/1177454_1279817263NdLS.png

  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


  • <%@pagelanguage="java"
  • import="java.util.*,javax.mail.*"
  • pageEncoding="gbk"%>

  • <%
  • //连接pop3服务器的主机名、协议、用户名、密码
  • Stringpop3Server="pop3.126.com";
  • Stringprotocol="pop3";
  • Stringuser="testhao";
  • Stringpwd="123456";

  • //创建一个有具体连接信息的Properties对象
  • Propertiesprops=newProperties();
  • props.setProperty("mail.store.protocol",protocol);
  • props.setProperty("mail.pop3.host",pop3Server);

  • //使用Properties对象获得Session对象
  • SessionmailSession=Session.getDefaultInstance(props,null);
  • mailSession.setDebug(true);

  • try{
  • //利用Session对象获得Store对象,并连接pop3服务器
  • Storestore=mailSession.getStore();
  • store.connect(pop3Server,user,pwd);

  • //获得邮箱内的邮件夹Folder对象,以"读-写"打开
  • Folderfolder=store.getFolder("inbox");
  • folder.open(Folder.READ_WRITE);

  • //将上面读取到的邮件夹folder设置为属性
  • session.setAttribute("folder",folder);

  • }catch(Exceptione){
  • e.printStackTrace();
  • }

  • //下面用HTML将web页面分成两帧,便于针对邮件的
  • //"text/html"邮件头以及"message/rfc822"格式的邮件正文
  • %>

  • <framesetrows="25%,*">
  • <framesrc="/JavaMail/showMessageHeader"scrolling="no">
  • <framesrc="/JavaMail/showMessageContent"scrolling="no">
  • </frameset>

  ShowMessageHeader.java


  • importjava.io.*;
  • importjava.text.DateFormat;
  • importjavax.mail.*;
  • importjavax.servlet.*;
  • importjavax.servlet.http.*;

  • publicclassShowMessageHeaderextendsHttpServlet
  • {
  • publicvoiddoGet(HttpServletRequestrequest,
  • HttpServletResponseresponse)throwsServletException,IOException
  • {
  • response.setContentType("text/html;charset=gbk");
  • PrintWriterout=response.getWriter();
  • HttpSessionsession=request.getSession();

  • Folderfolder=(Folder)session.getAttribute("folder");

  • try{
  • //作为实验,这里只获取第1封邮件
  • Messagemessage=folder.getMessage(1);
  • Stringfrom=(message.getFrom()[0]).toString();
  • Stringsubject=message.getSubject();
  • StringsendDate=DateFormat.getInstance().format(message.getSentDate());

  • out.println("邮件主题:"+subject+"<br/>");
  • out.println("发件人地址:"+from+"<br/>");
  • out.println("发送日期:"+sendDate+"<br/>");

  • }catch(Exceptione){
  • e.printStackTrace();
  • }
  • }
  • }

  ShowMessageContent.java


  • importjava.io.*;
  • importjavax.mail.*;
  • importjavax.servlet.*;
  • importjavax.servlet.http.*;

  • publicclassShowMessageContentextendsHttpServlet
  • {
  • publicvoiddoGet(HttpServletRequestrequest,
  • HttpServletResponseresponse)throwsServletException,IOException
  • {
  • //获取输出流、Session会话对象、邮件夹Folder对象
  • ServletOutputStreamout=response.getOutputStream();
  • HttpSessionsession=request.getSession();
  • Folderfolder=(Folder)session.getAttribute("folder");

  • try{
  • //取得邮件夹中的邮件,并设置MIME类型
  • //为"message/rfc822"格式,交给浏览器处理
  • Messagemessage=folder.getMessage(1);
  • response.setContentType("message/rfc822");
  • message.writeTo(out);

  • }catch(Exceptione){
  • e.printStackTrace();
  • }
  • }
  • }

  web.xml文件


  • <?xmlversion="1.0"encoding="gb2312"?>

  • <web-appxmlns="http://java.sun.com/xml/ns/j2ee"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://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
,得到以下结果:

  http://img1.iyunv.com/attachment/201007/22/1177454_12798172641tuQ.png
  看一下我们登录到邮箱时看到的结果:
  http://img1.iyunv.com/attachment/201007/22/1177454_1279817266isdl.png
  http://img1.iyunv.com/attachment/201007/22/1177454_1279817267U4dI.png

  小结:
  1、由于在 ShowMessageContent.java 程序中调用了 response.setContentType("message/rfc822"); 所以上面正文部分的中文乱码了,大概是因为要设置字符集才行,不过我们已经设置为了 message/rfc822 类型,所以无法再重新设置。看来应该将纯文本和内嵌的图片分开来显示,看看这个功能能不能在下一篇文章中解决掉;
  2、很明显 126 邮箱将内嵌的图片作为附件来解析了,这是服务器的问题,各个不同的邮件服务器可能都有不同的解析结果。
  3、我们还可以在控制台中输出的信息中看一下程序与 POP3 服务器通信、传输数据的过程。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-338224-1-1.html 上篇帖子: Tomcat 5.5: Configure One-way SSL Instruction 下篇帖子: Tomcat 中建项目实例--(网上测试制作)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表