1. 程式人生 > >javaMail解析郵件內容和下載附件

javaMail解析郵件內容和下載附件

介紹一下JavaMail的Message

它對應JavaMail的Message物件,一個Message物件又會有多個子物件如MultiPart物件,更特殊的是整個郵件內容為一個大的 MultiPart,然而郵件的正文則在巢狀的一個子MultiPart中,如果不瞭解這種組織結構,就可能無法正確獲得郵件的正文。此結構如下圖所示:

郵件Message

頭部(主題, 發件人資訊等)

MultiPart郵件全部內容, 包含正文和附件

正文 MultiPart

文字正文 text/plain

Content-Type: text/plain;charset="gb2312"

HTML網頁格式

 text/html

Content-Type: text/html;charset="gb2312"

附件1

Content-Type: application/octet-stream;

       name="String2Java.jpg"

Content-Transfer-Encoding: base64

Content-Disposition: attachment;

       filename="String2Java.jpg"

附件2

Content-Type: application/octet-stream;

       name="FoxmailUpdate.log"

Content-Transfer-Encoding: base64

Content-Disposition: attachment;

       filename="FoxmailUpdate.log"

 附上程式碼

package com.zz.mail;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
/**
* 郵件接受測試
* 
*/
public class POP3MailReceiverTest {
    public POP3MailReceiverTest() {
        try {
        	 // 1. 設定連線資訊, 生成一個 Session
    		Properties props = new Properties();
    		props.setProperty("mail.smtp.host", "smtp.genomics.cn");
    		props.setProperty("mail.smtp.auth", "true");
    		Session session = Session.getDefaultInstance(props);
    		// 2. 獲取 Store 並連線到伺服器	
    		//
    		URLName urlname = new URLName("pop3","pop.genomics.cn",110,null,"
[email protected]
","****"); Store store = session.getStore(urlname); store.connect(); Folder folder = store.getDefaultFolder();// 預設父目錄 if (folder == null) { System.out.println("伺服器不可用"); return; } /* System.out.println("預設信箱名:" + folder.getName()); Folder[] folders = folder.list();// 預設目錄列表 for(int i = 0; i < folders.length; i++) { System.out.println(folders[0].getName()); } System.out.println("預設目錄下的子目錄數: " + folders.length); */ Folder popFolder = folder.getFolder("INBOX");// 獲取收件箱 popFolder.open(Folder.READ_WRITE);// 可讀郵件,可以刪郵件的模式開啟目錄 // 4. 列出來收件箱 下所有郵件 Message[] messages = popFolder.getMessages(); // 取出來郵件數 int msgCount = popFolder.getMessageCount(); System.out.println("共有郵件: " + msgCount + "封"); // FetchProfile fProfile = new FetchProfile();// 選擇郵件的下載模式, // 根據網速選擇不同的模式 // fProfile.add(FetchProfile.Item.ENVELOPE); // folder.fetch(messages, fProfile);// 選擇性的下載郵件 // 5. 迴圈處理每個郵件並實現郵件轉為新聞的功能 for (int i = 0; i < msgCount; i++) { // 單個郵件 System.out.println("第" + i +"郵件開始"); mailReceiver(messages[i]); System.out.println("第" + i +"郵件結束"); //郵件讀取用來校驗 messages[i].writeTo(new FileOutputStream("D:/pop3MailReceiver"+ i +".eml")); } // 7. 關閉 Folder 會真正刪除郵件, false 不刪除 popFolder.close(true); // 8. 關閉 store, 斷開網路連線 store.close(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 解析郵件 * * @param messages 郵件物件 * @param i * @return * @throws IOException * @throws MessagingException * @throws FileNotFoundException * @throws UnsupportedEncodingException */ private void mailReceiver(Message msg)throws Exception{ // 發件人資訊 Address[] froms = msg.getFrom(); if(froms != null) { //System.out.println("發件人資訊:" + froms[0]); InternetAddress addr = (InternetAddress)froms[0]; System.out.println("發件人地址:" + addr.getAddress()); System.out.println("發件人顯示名:" + addr.getPersonal()); } System.out.println("郵件主題:" + msg.getSubject()); // getContent() 是獲取包裹內容, Part相當於外包裝 Object o = msg.getContent(); if(o instanceof Multipart) { Multipart multipart = (Multipart) o ; reMultipart(multipart); } else if (o instanceof Part){ Part part = (Part) o; rePart(part); } else { System.out.println("型別" + msg.getContentType()); System.out.println("內容" + msg.getContent()); } } /** * @param part 解析內容 * @throws Exception */ private void rePart(Part part) throws MessagingException, UnsupportedEncodingException, IOException, FileNotFoundException { if (part.getDisposition() != null) { String strFileNmae = MimeUtility.decodeText(part.getFileName()); //MimeUtility.decodeText解決附件名亂碼問題 System.out.println("發現附件: " + MimeUtility.decodeText(part.getFileName())); System.out.println("內容型別: " + MimeUtility.decodeText(part.getContentType())); System.out.println("附件內容:" + part.getContent()); InputStream in = part.getInputStream();// 開啟附件的輸入流 // 讀取附件位元組並存儲到檔案中 java.io.FileOutputStream out = new FileOutputStream(strFileNmae); int data; while((data = in.read()) != -1) { out.write(data); } in.close(); out.close(); } else { if(part.getContentType().startsWith("text/plain")) { System.out.println("文字內容:" + part.getContent()); } else { //System.out.println("HTML內容:" + part.getContent()); } } } /** * @param multipart // 接卸包裹(含所有郵件內容(包裹+正文+附件)) * @throws Exception */ private void reMultipart(Multipart multipart) throws Exception { //System.out.println("郵件共有" + multipart.getCount() + "部分組成"); // 依次處理各個部分 for (int j = 0, n = multipart.getCount(); j < n; j++) { //System.out.println("處理第" + j + "部分"); Part part = multipart.getBodyPart(j);//解包, 取出 MultiPart的各個部分, 每部分可能是郵件內容, // 也可能是另一個小包裹(MultipPart) // 判斷此包裹內容是不是一個小包裹, 一般這一部分是 正文 Content-Type: multipart/alternative if (part.getContent() instanceof Multipart) { Multipart p = (Multipart) part.getContent();// 轉成小包裹 //遞迴迭代 reMultipart(p); } else { rePart(part); } } } /** * @param args */ public static void main(String[] args) { new POP3MailReceiverTest(); } }

相關推薦

javaMail解析郵件內容下載附件

介紹一下JavaMail的Message 它對應JavaMail的Message物件,一個Message物件又會有多個子物件如MultiPart物件,更特殊的是整個郵件內容為一個大的 MultiPart,然而郵件的正文則在巢狀的一個子MultiPart中,如果不瞭解這種組織

JavaMail解析郵件內容(經典收藏)

import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; /**

用java顯示郵件內容附件的實現

                      用java顯示郵件內容和附件的實現   自己找了好久的內容實現,一直弄不好,現終於實現了,來張效果圖,吼吼吼吼 &nbs

springMVC上傳下載附件

eba adapter 其余 ati import oid sdf eth plain 上傳: 導入需要的jar包:Spring MVC類庫 + 文件上傳下載需要的JAR包,圖中A處為文件上傳下載需要的JAR包,其余為Spring MVC類庫。 構建領域模層

vue+springboot上傳下載附件功能

上傳附件(服務端程式碼) 第一步:在application.yml中配置附件要上傳的路徑(此路徑也是下載的路徑) ***:windows路徑和linux的路徑是不同的,定義路徑時要仔細(存放路勁自己定義即可)       第二步:在服務端要呼叫介面所在的

JavaMail java郵件開發_中文附件名_回信地址_友好名稱等技巧

JavaMail03: package com.yuming.test; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Properties; import javax.ac

python 爬蟲獲取網頁 html 內容以及下載附件的方法

python 爬蟲獲取網頁 html 內容以及下載附件的方法 python 爬蟲獲取網頁 html 內容的兩種方法: 獲取靜態網頁和使用瀏覽器獲取動態內容。 from urllib.request import urlopen from urllib import request

基於javaMail郵件傳送--excel作為附件

基於JavaMail的Java郵件傳送 Author [email protected] Desc 簡單郵件傳送 Date 2017/12/8 專案中需要根據物料資質的狀況實時給使用者傳送郵件,然後

python3讀取解析郵件內容

SMTP用於傳送郵件,如果要收取郵件呢? 收取郵件就是編寫一個MUA作為客戶端,從MDA把郵件獲取到使用者的電腦或者手機上。收取郵件最常用的協議是POP協議,目前版本號是3,俗稱POP3。 Python內建一個poplib模組,實現了POP3協議,可以直接用來收郵件。 注意到POP3協議收取的不是一個已經可

python批量解析郵件下載附件

python中的email模組可以方便的解析郵件,先上程式碼 #-*- encoding: gb2312 -*- import os import email def mail_to_text(ma

解決zabbix郵件內容附件zabbix圖中出現中文亂碼問題

一、解決zabbix郵件內容為附件 安裝zabbix之後,設定郵件指令碼報警的時候,傳送的報警內容變成了tcmime.1278.1278.1724.bin或ATT00001.bin。 yum -y install mailx dos2unix //安

通過FTP服務端來實現匿名用戶基本用戶的訪問,可以實現文件上傳下載。通過web網站來瀏覽內容

ges 用戶 分享圖片 size 下載 mark col term http 通過FTP服務端來實現匿名用戶和基本用戶的訪問,可以實現文件上傳和下載。通過web網站來瀏覽內容

郵件發送超大附件,上傳下載特別慢,怎麽解決?

接收 附件 情況 也會 文件大小 方式 協議 網易郵箱 使用 目前,已有不少郵箱如QQ郵箱、網易郵箱等支持超大附件,可以發送2G或3G大小的文件。但是諸多郵箱發送超大附件普遍存在以下問題: 首先,郵件發送大文件對文件大小有限制,超過上限的超大附件無法發送;其次,超大附件上傳

JavaMail java郵件開發_填充完善建立複雜郵件的細節程式碼

JavaMail03: package com.yuming.test; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Properties; import javax.ac

Centos7 Zabbix3.4郵件告警配置(解決郵件內容為xx.bin附件的問題)

一、新增監控Linux主機 1、配置-主機-建立主機 2、填寫資訊 3、新增模板 4、檢視狀態 二、配置郵箱 系統環境: [[email protected] ~]# cat /etc/redhat-release CentOS Li

使用javamail傳送郵件(文字+附件

java發動郵件其實很簡單,這是使用Javamail來實現,使用maven管理 1.導包:這兩個包缺一不可 <dependency> <groupId>javax.mail</groupId>

Centos7 Zabbix3.4郵件告警配置(解決郵件內容為xx.bin附件的問題)

一、新增監控Linux主機 1、配置-主機-建立主機 2、填寫資訊 3、新增模板 4、檢視狀態 二、配置郵箱 系統環境: [[email protected] ~]# cat /etc/redhat-release CentOS L

9、ssm整合activeMQ、JAVAMail實現郵件非同步註冊登陸功能

1、前言 註冊某個網站的時候,往往要你用郵箱註冊,傳送郵件的功能很簡單,但是在點選註冊傳送郵件的時候,總不能等郵件傳送完畢之後才能跳轉頁面吧?或者說,我們應該將發郵件的這個過程異步出去,讓他自己慢慢去發郵件,我的主執行緒直接跳轉到其他頁面,等郵件到了,使用者點

javaMail傳送郵件,標題/發件人/附件名稱亂碼

javaMail傳送郵件subject會亂碼。 解決辦法: 方法一 在設定主題message.setSubject("なにがありましたら、伝えてくださいね"); 之前設定System.setProperty("mail.mime.charset","UTF-8"); 方法

Java 傳送郵件 傳入收件郵箱郵件內容,返回傳送狀態

import java.util.Date; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.In