摘要:發送郵件好說,接收和下載郵件也好說。所以我們想要解析一封郵件把它拆成人能讀懂的標題收發件人內容附件等,就必須得理解這套協議。了解協議,其實主要就是了解郵件的嵌套結構。另一種壓縮方式,需要用庫函數來解碼。
郵件的解析是個大課題,遠超一般人的預期。它遠比發送郵件和接收郵件要復雜的多的多。
這就是為什么網上中文外文搜郵件的問題,絕大多數都是講發送的而講接收的很少。
發送郵件好說,接收和下載郵件也好說。關鍵是下載下來的郵件是一種比HTML還復雜的嵌套結構
MIME郵件協議參考:阮一峰 - MIME筆記
參考:MIME郵件的組織結構
參考:Parsing email using Python part 2 of 2 : The content
參考:Mozilla - MIME types
先不論Python,也不談什么郵件發展歷史,只論現在:
現在我們要達到通過編程來解析郵件,就絕對避不開這個問題:MIME郵件結構.
MIME是一整套的協議,就像HTTP協議、TCP協議之類的一樣,都是解析郵件的一套規則。
所以我們想要解析一封郵件(把它拆成人能讀懂的標題、收發件人、內容、附件等),就必須得理解這套協議。
就算有現成的Python處理庫也一樣要懂了以后才能開始操作。
了解MIME協議,其實主要就是了解郵件的嵌套結構。這個懂了就全懂了。
要知道,我們收到的一封郵件可能是以下這幾種不同的結構類型:
簡單的幾句話,全是文字。 (text/plain)
非常漂亮的網頁一樣的頁面。(text/html)
包括回復另一封郵件的層層嵌套的內容。(multipart/mixed)
帶附件的內容,比如一張圖片。(multipart/mixed) + (image/jpeg)
當然,這不是全部,只是有代表性的幾種文檔類型。最重要的是知道:
所有超出簡單文字或網頁HTML之外的,全都是multiparts。
最難理解的也是這個multiparts。
下面是最復雜的Multiparts郵件,包括了所有能包括的結構。其中每個方塊都有自己的Content Type和Body。
簡單點的結構圖:
[站外圖片上傳中...(image-8219fc-1548158814349)]
文字型結構圖:
multipart/mixed | +-- multipart/related | | | +-- multipart/alternative | | | | | +-- text/plain | | +-- text/html | | | +-- image/gif | +-- application/msword
詳細一點的結構圖:
[站外圖片上傳中...(image-36fdd8-1548158814349)]
這里是所有郵件能支持的Content Type文檔類型:
text/plain: 純文本,文件擴展名.txt
text/html: HTML文本,文件擴展名.htm和.html
image/jpeg: jpeg格式的圖片,文件擴展名.jpg
image/gif: GIF格式的圖片,文件擴展名.gif
audio/x-wave: WAVE格式的音頻,文件擴展名.wav
audio/mpeg: MP3格式的音頻,文件擴展名.mp3
video/mpeg: MPEG格式的視頻,文件擴展名.mpg
application/zip: PK-ZIP格式的壓縮文件,文件擴展名.zip
編程上需要明確的是:要讀取嵌套結構,必須用遞歸的方法。
Content-Disposition 附件的存在方式對于附件,有兩種存在方式:
inline: 嵌入在文字里的,比如HTML格式郵件中顯示的圖片
attachment: 是附在結尾的,多帶帶的一部分
一般我們只需要處理attachment格式的附件,而inline的東西就讓它保存在inline里吧。
郵件里面要獲取這個部分的格式,需要找到這個參數:Content-Disposition。其它并拍的參數還要Content-Type和Content-ID等。
這個只針對text/plain & text/html類型的文本有用。
這個是每封郵件的必須數據,它必須要指出每段文本的傳輸編碼方式,有的可以壓縮傳輸(base64),有的可以原文傳輸(8bit或7bit),有的可以內置base64圖片可直接打印(quoted-printable)。
正因為每封郵件都可能采用不同的傳輸編碼策略,所以我們解析內容之前必須要判斷是哪種方式才能正確解碼為原文的內容。
目前常見的傳輸編碼方式有:
8bit或7bit:這個最簡單,直接是原文,不需要轉碼。
base64:內容全文用base64壓縮,所以需要用base64.b64decode()庫函數來解碼。
quoted-printable:另一種壓縮方式,需要用quopri.decodestring()庫函數來解碼。
獲取當前內容的傳輸編碼方式的代碼如下:
encoding = part.get("Content-Transfer-Encoding")
其中part可以是庫email.message.Message的實例或者其中multipart多部分中的sub-part,都可以。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43082.html
摘要:大家好,我是辣條。最先審核沒通過,說我腳本涉嫌控制電腦違法違規,經過我再三的溝通之下,完整代碼刪除了,希望能通過審核。 大家好,我是辣條。? 前言 開學沒多久,事又多正愁缺寫博客的素材,這不馬上就來了,憨憨室友又要整活?,看在友(紅)情(包)的份上必須幫忙。 我起初的想法是通過郵箱發送表白...
摘要:在這里真心感謝一直在支持我的那幾個粉絲,謝謝你們的持續關注點贊。果然,第三個包也是按的步差來的,而為零不變,也不變。函數里面的話就是個循環咯,當條件不滿足時就一直加,知道條件滿足為止。我每天都會抽時間給我的粉絲解答,給與一些學習資源。 目錄 前言 準備工作 分析(x0) 分析(x1) 分析(...
摘要:源碼地址準備一臺云服務器寫好的腳本效果因為現在一個的客戶端啟動越來越慢,而且很多自己不感興趣的東西我只是想看看文章,所以就寫了這個小爬蟲。因為一個是每天點會更新,所以自己的服務器要做一個定時服務,下自帶了定時任務。 源碼地址:https://github.com/xcc3641/pySendOneToEmail 準備 一臺云服務器 寫好的Python腳本 效果 因為現在一個的And...
閱讀 3941·2021-11-17 09:33
閱讀 3288·2021-10-08 10:05
閱讀 3117·2021-09-22 15:36
閱讀 1143·2021-09-06 15:02
閱讀 2774·2019-08-29 12:45
閱讀 1594·2019-08-26 13:40
閱讀 3404·2019-08-26 13:37
閱讀 425·2019-08-26 13:37