激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JavaMail入門教程之解析郵件(5)

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

2020-07-17 12:07汪先森 Java教程

這篇文章主要為大家詳細介紹了JavaMail入門教程之解析郵件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
 <head>
 <title>login.html</title>
 </head>
 <body>
 <form action="login.jsp" method="post">
  主機名:<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>

登錄頁面,需要用戶填寫郵件服務器的主機名,用戶名和密碼

 login.jsp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ 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);
%>
   發件人地址:<%=from %> 郵件主題:<%=subject %>   
   <a href="displayMsg.jsp?msgnum=<%=i+1%>">查看郵件</a><br/>
<%
  }
   catch(Exception e){}
   }
%>

獲取郵件夾中的所有郵件

 displayMsg.jsp

?
1
2
3
4
<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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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("發件人:" + from + "<br/>");
   out.println("發送日期:" + 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對象包含附件,則應該解析出來
     if (bp.getDisposition() != null) {
      String filename = bp.getFileName();
      System.out.println("filename:" + filename);
      
      if (filename.startsWith("=?")) {
       // 把文件名編碼成符合RFC822規范
       filename = MimeUtility.decodeText(filename);
      }
 
      // 生成打開附件的超鏈接
      out.print("附件:");
      out.print("<a href=HandleAttach?msgnum=" + msgnum + "&&bodynum=" + i + "&&filename=" + filename
        + ">" + filename + "</a><br/>");
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

用于顯示郵件頭內容

 DisplayContent.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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 < bodynum; i++) {
     BodyPart bp = mp.getBodyPart(i);
     /*
      * MIME消息頭中不包含disposition字段, 并且MIME消息類型不為mixed時,
      * 表示當前獲得的MIME消息為郵件正文
      */
     if (!bp.isMimeType("multipart/mixed") && bp.getDisposition() == null) {
      response.setContentType("message/rfc822");
      bp.writeTo(sos);
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

用于顯示郵件正文

 HandleAttact.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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>

首先啟動tomcat服務器,然后在瀏覽器中輸入http://localhost:8080/mailDemo/index.html

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

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

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

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

點擊查看郵件鏈接

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

點擊附件后面的文件名稱即可下載對應附件。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 日韩999 | 97人操| 亚洲成人黄色片 | 欧美日韩在线播放 | 久久免费精品视频 | 亚洲一区二区三区四区精品 | 国产精品99久久99久久久二 | 久久久免费观看完整版 | 国产亚洲精品久久久久久久久久 | 精品亚洲午夜久久久久91 | 国产 视频 一区二区 | 成人在线免费小视频 | 亚洲精品久久久久久久久久久 | 中文字幕在线观看成人 | 欧美视频一区二区 | 黑人日比| 亚洲精品成人18久久久久 | 国产亚洲精品久久久久久久软件 | 羞羞视频2023 | 亚洲成人福利在线观看 | 污版视频在线观看 | 亚洲精品午夜在线 | 55夜色66夜色国产精品视频 | 国产色视频免费 | 免费a网| 国产91精品亚洲精品日韩已满 | 狠狠操精品视频 | 欧美a黄 | xxxx hd videos | 欧美精品一区自拍a毛片在线视频 | 亚洲人成在线播放网站 | 亚洲人成网站免费播放 | 特级黄色一级毛片 | 在线播放亚洲 | 7m视频成人精品分类 | www久| 欧日韩| 在线播放黄色网址 | 少妇一级淫片免费放播放 | 久久久日韩精品一区二区三区 | 欧美成人三级视频 |