热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

JavaMail入门教程之解析邮件(5)

这篇文章主要为大家详细介绍了JavaMail入门教程之解析邮件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

1、调用Message对象的getFrom、getSubject等方法,可以得到邮件的发件人和主题等信息,调用getContentType方法得到邮件的类型;

2、通过Message.getContentType方法的返回值判断邮件类型,并调用Message.getContent方法得到邮件内容。如果邮件类型为"text/plain"或者"text/html",表示邮件内容为纯文本,此时调用Message对象的getContent方法得到邮件内容,然后将返回对象的类型转换成String输出给显示软件即可。如果邮件类型为"multipart/*",表示邮件内容是一个复合类型,此时需将Message.getContent方法复合的对象转换成Multipart。

3、调用Multipart对象的getCount方法检测Multipart对象中封装了多少个BodyPart对象,并通过for循环逐一取出Multipart对象中的每个BodyPart对象进行处理。

4、在处理每个BodyPart对象时,首先调用BodyPart对象的getContentType方法得到它的MIME类型,然后根据MIME类型作出如下三种情况的处理:

  当MIME类型为"text/*"时,表示BodyPart对象中保存的是纯文本数据,如上图中的"text/plain",此时第一BodyPart对象的getContent方法并将返回的对象转换成String输出给显示软件显示即可。

  当MIME类型表示的是图片、声音或者是附件等二进制数据时,如上图中的"image/gif"时,此时应调用BodyPart对象的getDataHandler方法得到了封装了数据的DataHanlder对象,然后调用DataHandler对象的getInputStream方法获得与数据相关联的InputStream对象,通过这个InputStream对象中即可获得原始的二进制数据内容。

  当MIME类型为"multipart/mixed"时,表示BodyPart对象中保存的是一个复合MIME消息,此时应调用BodyPart对象的getContent方法得到封装复合MIME消息的对象并将它转换成Multipart类型,接着重复第3和第4个步骤操作对Multipart对象进行递归调用。

下面来编写一个接收并解析带有附件的程序

POP3Help.java

package mail;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Session;
import javax.mail.Store;

public class POP3Help {
 public static Folder getFolder(String host, String username, String password) {
  Properties prop = new Properties();
  prop.setProperty("mail.store.protocol", "pop3");
  prop.setProperty("mail.pop3.host", host);

  Session mailSession = Session.getDefaultInstance(prop, null);
  mailSession.setDebug(false);

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

  return null;
 }
}

该类用来连接和登录POP3服务器,并返回代表邮件夹的Folder对象

 index.html


 
 
 
 
 
  主机名:
用户名:
密码:

登录页面,需要用户填写邮件服务器的主机名,用户名和密码

 login.jsp

<%@ page import="javax.mail.*,mail.*"
 cOntentType="text/html;charset=GB2312" %>
<%
 String host = request.getParameter("host");  
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  String from = "";
  String subject = ""; 
  Folder folder = POP3Help.getFolder(host,username,password);
  session.setAttribute("folder",folder);
  Message [] messages = folder.getMessages();
  
  for(int i=0;i
   发件人地址:<%=from %> 邮件主题:<%=subject %>    
   查看邮件
<% } catch(Exception e){} } %>

获取邮件夹中的所有邮件

 displayMsg.jsp


用于展示邮件的信息

 DisplayHead.java

package mail;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class DisplayHead extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html;charset=gb2312");
  PrintWriter out = response.getWriter();
  HttpSession session = request.getSession();
  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);
   String from = msg.getFrom()[0].toString();
   String subject = msg.getSubject();
   String sendDate = DateFormat.getInstance().format(msg.getSentDate());

   out.println("邮件主题:" + subject + "
"); out.println("发件人:" + from + "
"); out.println("发送日期:" + sendDate + "

"); System.out.println("contentType:" + msg.getContentType()); // 如果该邮件是组合型"multipart/*"则可能包含附件等 if (msg.isMimeType("multipart/*")) { Multipart mp = (Multipart) msg.getContent(); for (int i = 0; i " + filename + "
"); } } } } catch (Exception e) { e.printStackTrace(); } } }

用于显示邮件头内容

 DisplayContent.java

package mail;

import java.io.IOException;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class DisplayContent extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  ServletOutputStream sos = response.getOutputStream();
  HttpSession session = request.getSession();
  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);
   // 邮件类型不是mixed时,表示邮件中不包含附件,直接输出邮件内容
   if (!msg.isMimeType("multipart/mixed")) {
    response.setContentType("message/rfc822");
    msg.writeTo(sos);
   } else {
    // 查找并输出邮件中的邮件正文
    Multipart mp = (Multipart) msg.getContent();
    int bodynum = mp.getCount();
    for (int i = 0; i 

用于显示邮件正文

 HandleAttact.java

package mail;

import java.io.IOException;
import java.io.InputStream;
import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class HandleAttach extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html");
  HttpSession session = request.getSession();
  ServletOutputStream out = response.getOutputStream();

  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  int bodynum = Integer.parseInt(request.getParameter("bodynum"));
  String filename = request.getParameter("filename");
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);

   // 将消息头类型设置为附件类型
   response.setHeader("Content-Disposition", "attachment;filename=" + filename);
   
   Multipart multi = (Multipart) msg.getContent();
   BodyPart bodyPart = multi.getBodyPart(bodynum);
   
   InputStream is = bodyPart.getInputStream();
   int c = 0;
   while ((c = is.read()) != -1) {
    out.write(c);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

用于处理附件

web.xml

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

  mailDemo
  
  index.html
  index.htm
  index.jsp
  default.html
  default.htm
  default.jsp
  
 
   
  DisplayHead 
  mail.DisplayHead 
   
  
  DisplayHead 
  /DisplayHead 
  
  
  
  DisplayContent 
  mail.DisplayContent 
   
  
  DisplayContent 
  /DisplayContent 
   
  
  
  HandleAttach 
  mail.HandleAttach 
   
  
  HandleAttach 
  /HandleAttach 
  

首先启动tomcat服务器,然后在浏览器中输入http://localhost:8080/mailDemo/index.html

输入用户名跟密码(这里需要填写授权码,什么是授权码,它又是如何设置?)

列出了邮件夹中所有的邮件

点击查看邮件链接

点击附件后面的文件名称即可下载对应附件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 本文详细介绍了 BERT 模型中 Transformer 的 Attention 机制,包括其原理、实现代码以及在自然语言处理中的应用。通过结合多个权威资源,帮助读者全面理解这一关键技术。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
author-avatar
楠楠妈妈05乄23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有