欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaMail入門(mén)教程之解析郵件(5)

 更新時(shí)間:2016年12月22日 16:19:06   作者:汪先森  
這篇文章主要為大家詳細(xì)介紹了JavaMail入門(mén)教程之解析郵件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

上一篇JavaMail入門(mén)第四篇 接收郵件中,控制臺(tái)打印出的內(nèi)容,我們無(wú)法閱讀,其實(shí),讓我們自己來(lái)解析一封復(fù)雜的郵件是很不容易的,郵件里面格式、規(guī)范復(fù)雜得很。不過(guò),我們所用的瀏覽器內(nèi)置了解析各種數(shù)據(jù)類(lèi)型的數(shù)據(jù)處理模塊,我們只需要在把數(shù)據(jù)流傳輸給瀏覽器之前明確地指定該數(shù)據(jù)流屬于哪種數(shù)據(jù)類(lèi)型即可,之后一切的解析操作由瀏覽器自動(dòng)幫我們完成。下面這張圖可以很好的說(shuō)明解析郵件的步驟

1、調(diào)用Message對(duì)象的getFrom、getSubject等方法,可以得到郵件的發(fā)件人和主題等信息,調(diào)用getContentType方法得到郵件的類(lèi)型;

2、通過(guò)Message.getContentType方法的返回值判斷郵件類(lèi)型,并調(diào)用Message.getContent方法得到郵件內(nèi)容。如果郵件類(lèi)型為"text/plain"或者"text/html",表示郵件內(nèi)容為純文本,此時(shí)調(diào)用Message對(duì)象的getContent方法得到郵件內(nèi)容,然后將返回對(duì)象的類(lèi)型轉(zhuǎn)換成String輸出給顯示軟件即可。如果郵件類(lèi)型為"multipart/*",表示郵件內(nèi)容是一個(gè)復(fù)合類(lèi)型,此時(shí)需將Message.getContent方法復(fù)合的對(duì)象轉(zhuǎn)換成Multipart。

3、調(diào)用Multipart對(duì)象的getCount方法檢測(cè)Multipart對(duì)象中封裝了多少個(gè)BodyPart對(duì)象,并通過(guò)for循環(huán)逐一取出Multipart對(duì)象中的每個(gè)BodyPart對(duì)象進(jìn)行處理。

4、在處理每個(gè)BodyPart對(duì)象時(shí),首先調(diào)用BodyPart對(duì)象的getContentType方法得到它的MIME類(lèi)型,然后根據(jù)MIME類(lèi)型作出如下三種情況的處理:

  當(dāng)MIME類(lèi)型為"text/*"時(shí),表示BodyPart對(duì)象中保存的是純文本數(shù)據(jù),如上圖中的"text/plain",此時(shí)第一BodyPart對(duì)象的getContent方法并將返回的對(duì)象轉(zhuǎn)換成String輸出給顯示軟件顯示即可。

  當(dāng)MIME類(lèi)型表示的是圖片、聲音或者是附件等二進(jìn)制數(shù)據(jù)時(shí),如上圖中的"image/gif"時(shí),此時(shí)應(yīng)調(diào)用BodyPart對(duì)象的getDataHandler方法得到了封裝了數(shù)據(jù)的DataHanlder對(duì)象,然后調(diào)用DataHandler對(duì)象的getInputStream方法獲得與數(shù)據(jù)相關(guān)聯(lián)的InputStream對(duì)象,通過(guò)這個(gè)InputStream對(duì)象中即可獲得原始的二進(jìn)制數(shù)據(jù)內(nèi)容。

  當(dāng)MIME類(lèi)型為"multipart/mixed"時(shí),表示BodyPart對(duì)象中保存的是一個(gè)復(fù)合MIME消息,此時(shí)應(yīng)調(diào)用BodyPart對(duì)象的getContent方法得到封裝復(fù)合MIME消息的對(duì)象并將它轉(zhuǎn)換成Multipart類(lèi)型,接著重復(fù)第3和第4個(gè)步驟操作對(duì)Multipart對(duì)象進(jìn)行遞歸調(diào)用。

下面來(lái)編寫(xiě)一個(gè)接收并解析帶有附件的程序

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;
 }
}

該類(lèi)用來(lái)連接和登錄POP3服務(wù)器,并返回代表郵件夾的Folder對(duì)象

 index.html

<html>
 <head>
 <title>login.html</title>
 </head>
 <body>
 <form action="login.jsp" method="post">
  主機(jī)名:<input name="host" type="text"><br/>
  用戶名:<input name="username" type="text"><br/>
  密碼:<input name="password" type="password"><br/>
  <input type="submit" value="提交"> 
  <input type="reset" value="重置">
 </form>
 </body>
</html>

登錄頁(yè)面,需要用戶填寫(xiě)郵件服務(wù)器的主機(jī)名,用戶名和密碼

 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<messages.length;i++)
  {
   try
   {
    from = messages[i].getFrom()[0].toString();
   subject = messages[i].getSubject();
   out.print(i + 1);
%>
   發(fā)件人地址:<%=from %> 郵件主題:<%=subject %>    
   <a href="displayMsg.jsp?msgnum=<%=i+1%>">查看郵件</a><br/>
<%
  }
   catch(Exception e){}
   }
%>

獲取郵件夾中的所有郵件

 displayMsg.jsp

<frameset rows="25%,*">
 <frame src="/mailDemo/DisplayHead?msgnum=<%=request.getParameter("msgnum")%>" scrolling="no">
 <frame src="/mailDemo/DisplayContent?msgnum=<%=request.getParameter("msgnum")%>" scrolling="no">
</frameset>

用于展示郵件的信息

 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 + "<br/>");
   out.println("發(fā)件人:" + from + "<br/>");
   out.println("發(fā)送日期:" + sendDate + "<br/><br/>");

   System.out.println("contentType:" + msg.getContentType());

   // 如果該郵件是組合型"multipart/*"則可能包含附件等
   if (msg.isMimeType("multipart/*")) {
    Multipart mp = (Multipart) msg.getContent();

    for (int i = 0; i < mp.getCount(); i++) {
     BodyPart bp = mp.getBodyPart(i);

     // 如果該BodyPart對(duì)象包含附件,則應(yīng)該解析出來(lái)
     if (bp.getDisposition() != null) {
      String filename = bp.getFileName();
      System.out.println("filename:" + filename);
      
      if (filename.startsWith("=?")) {
       // 把文件名編碼成符合RFC822規(guī)范
       filename = MimeUtility.decodeText(filename);
      }

      // 生成打開(kāi)附件的超鏈接
      out.print("附件:");
      out.print("<a href=HandleAttach?msgnum=" + msgnum + "&&bodynum=" + i + "&&filename=" + filename
        + ">" + filename + "</a><br/>");
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

用于顯示郵件頭內(nèi)容

 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);
   // 郵件類(lèi)型不是mixed時(shí),表示郵件中不包含附件,直接輸出郵件內(nèi)容
   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 < bodynum; i++) {
     BodyPart bp = mp.getBodyPart(i);
     /*
      * MIME消息頭中不包含disposition字段, 并且MIME消息類(lèi)型不為mixed時(shí),
      * 表示當(dāng)前獲得的MIME消息為郵件正文
      */
     if (!bp.isMimeType("multipart/mixed") && bp.getDisposition() == null) {
      response.setContentType("message/rfc822");
      bp.writeTo(sos);
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

用于顯示郵件正文

 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);

   // 將消息頭類(lèi)型設(shè)置為附件類(lèi)型
   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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>mailDemo</display-name>
  <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <servlet> 
  <servlet-name>DisplayHead</servlet-name> 
  <servlet-class>mail.DisplayHead</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>DisplayHead</servlet-name> 
  <url-pattern>/DisplayHead</url-pattern> 
 </servlet-mapping> 
  
 <servlet> 
  <servlet-name>DisplayContent</servlet-name> 
  <servlet-class>mail.DisplayContent</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>DisplayContent</servlet-name> 
  <url-pattern>/DisplayContent</url-pattern> 
 </servlet-mapping>  
  
 <servlet> 
  <servlet-name>HandleAttach</servlet-name> 
  <servlet-class>mail.HandleAttach</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>HandleAttach</servlet-name> 
  <url-pattern>/HandleAttach</url-pattern> 
 </servlet-mapping> 
</web-app>

首先啟動(dòng)tomcat服務(wù)器,然后在瀏覽器中輸入http://localhost:8080/mailDemo/index.html

輸入用戶名跟密碼(這里需要填寫(xiě)授權(quán)碼,什么是授權(quán)碼,它又是如何設(shè)置?)

列出了郵件夾中所有的郵件

點(diǎn)擊查看郵件鏈接

點(diǎn)擊附件后面的文件名稱即可下載對(duì)應(yīng)附件。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 通過(guò)實(shí)例講解springboot整合WebSocket

    通過(guò)實(shí)例講解springboot整合WebSocket

    這篇文章主要介紹了通過(guò)實(shí)例講解springboot整合WebSocket,WebSocket為游覽器和服務(wù)器提供了雙工異步通信的功能,即游覽器可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向游覽器發(fā)送消息。,需要的朋友可以參考下
    2019-06-06
  • 如何使用JaCoCo分析java單元測(cè)試覆蓋率

    如何使用JaCoCo分析java單元測(cè)試覆蓋率

    在做單元測(cè)試時(shí),代碼覆蓋率常常被拿來(lái)作為衡量測(cè)試好壞的指標(biāo),甚至,用代碼覆蓋率來(lái)考核測(cè)試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。于是乎,測(cè)試人員費(fèi)盡心思設(shè)計(jì)案例覆蓋代碼。下面我們來(lái)學(xué)習(xí)一下吧
    2019-06-06
  • Java?空和null的區(qū)別

    Java?空和null的區(qū)別

    本文主要介紹了Java?空和null的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)內(nèi)容,對(duì)此有需要的朋友們學(xué)習(xí)參考下。
    2019-05-05
  • SpringMVC + servlet3.0 文件上傳的配置和實(shí)現(xiàn)代碼

    SpringMVC + servlet3.0 文件上傳的配置和實(shí)現(xiàn)代碼

    本篇文章主要介紹了SpringMVC + servlet3.0 文件上傳的配置和實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java Map遍歷2種實(shí)現(xiàn)方法代碼實(shí)例

    Java Map遍歷2種實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了Java Map遍歷2種實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot接口返回的數(shù)據(jù)時(shí)間與實(shí)際相差8小時(shí)問(wèn)題排查方式

    SpringBoot接口返回的數(shù)據(jù)時(shí)間與實(shí)際相差8小時(shí)問(wèn)題排查方式

    文章描述了在部署SpringBoot應(yīng)用到容器中時(shí)遇到請(qǐng)求接口返回時(shí)間與實(shí)際相差8小時(shí)的問(wèn)題,并詳細(xì)分析了可能的原因及具體的排查步驟和解決方案,總結(jié)指出,環(huán)境初始時(shí)區(qū)未配置是根本原因,建議在應(yīng)用部署前配置好時(shí)區(qū)
    2025-02-02
  • Java string不可變?cè)韺?shí)例解析

    Java string不可變?cè)韺?shí)例解析

    這篇文章主要介紹了Java string不可變?cè)韺?shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析

    Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析

    Java動(dòng)態(tài)代理是一種在運(yùn)行時(shí)生成代理類(lèi)的機(jī)制,用于代替手動(dòng)編寫(xiě)代理類(lèi)的過(guò)程,這篇文章主要給大家介紹了關(guān)于Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 教你用Springboot實(shí)現(xiàn)攔截器獲取header內(nèi)容

    教你用Springboot實(shí)現(xiàn)攔截器獲取header內(nèi)容

    項(xiàng)目中遇到一個(gè)需求,對(duì)接上游系統(tǒng)是涉及到需要增加請(qǐng)求頭,請(qǐng)求頭的信息是動(dòng)態(tài)獲取的,需要?jiǎng)討B(tài)從下游拿到之后轉(zhuǎn)給上游,文中非常詳細(xì)的介紹了該需求的實(shí)現(xiàn),需要的朋友可以參考下
    2021-05-05

最新評(píng)論