python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西,它可以對郵件編碼解碼,用來處理郵件非常好用。

處理郵件是一個很細致的工作,尤其是解碼郵件,因為它的格式變化太多了,下面先看看一個郵件的源文件:

Received: from 192.168.208.56 ( 192.168.208.56 [192.168.208.56] ) by

ajax-webmail-wmsvr37 (Coremail) ; Thu, 12 Apr 2007 12:07:48 +0800 (CST)

Date: Thu, 12 Apr 2007 12:07:48 +0800 (CST)

From: user1

To: zhaowei

Message-ID: <31571419.200911176350868321.JavaMail.root@bj163app37.163.com>

Subject: =?gbk?B?u+nJtA==?=

MIME-Version: 1.0

Content-Type: multipart/Alternative;

boundary="----=_Part_21696_28113972.1176350868319"

------=_Part_21696_28113972.1176350868319

Content-Type: text/plain; charset=gbk

Content-Transfer-Encoding: base64

ztLS0b+qyrzS1M6qysfSu7j20MfG2ru70ru0zqOs1K3AtMrH0ru49tTCtffSu7TOztLDx8/W1NrT

prjDysew67XjssXE3MjI1ebC6bezICAg

------=_Part_21696_28113972.1176350868319

Content-Type: text/html; charset=gbk

Content-Transfer-Encoding: quoted-printable

=CE=D2=D2=D1=BF=AA=CA=BC=D2=D4=CE=AA=CA=C7=D2=BB=B8=F6=D0=C7=C6=DA=BB=

=BB=D2=BB=B4=CE=A3=AC=D4=AD=C0=B4=CA=C7=D2=BB=B8=F6=D4=C2=B5=F7=D2=BB=B4=CE=

=CE=D2=C3=C7=CF=D6=D4=DA=D3=A6=B8=C3=CA=C7=B0=EB=B5=E3=B2=C5=C4=DC=C8=

=C8

=D5=E6=C2=E9=B7=B3

------=_Part_21696_28113972.1176350868319--

上面的就是以封郵件的源文件,從第一行到第一個空行之間的為信件頭,后面的就是信件體了。把上面的信息復制下來存到一個叫xxx.eml的文件里,用鼠標雙擊就可以看到內容,當然看到的是解碼后的,是outlook幫你解碼了。

看看email模塊怎么處理這個郵件,假設信件已經存為xxx.eml。

#-*- encoding: gb2312 -*-importemail

fp=open("xxx.eml","r")

msg=email.message_from_file(fp)#直接文件創建message對象,這個時候也會做初步的解碼subject=msg.get("subject")#取信件頭里的subject, 也就是主題#下面的三行代碼只是為了解碼象=?gbk?Q?=CF=E0=C6=AC?=這樣的subjecth=email.Header.Header(subject)

dh=email.Header.decode_header(h)

subject=dh[0][0]

print"subject:", subject

print"from:", email.utils.parseaddr(msg.get("from"))[1]#取fromprint"to:", email.utils.parseaddr(msg.get("to"))[1]#取tofp.close()

這段代碼可以把一封郵件中的主題、發件人、收件人解析出來。email.utils.parseaddr是用來專門解析郵件地址的,原因是郵件地址很多時候在原文里是這樣寫的:user1 , email.utils.parseaddr就可以把它解析為一個列表,第一項是user1, 第二項是xxxxxxxx@163.com, 這里只顯示了后面以部分。

前面那段代碼只是解析了信件頭,接著解析信件體吧。信體里可能有純文本的plain和html兩部分,也可能有附件。這里需要mime的知識,詳細介紹可以從網上搜搜。我這里就不說了,下面看看怎么解析的:

#-*- encoding: gb2312 -*-importemail

fp=open("xxx.eml","r")

msg=email.message_from_file(fp)

#循環信件中的每一個mime的數據塊forparinmsg.walk():

ifnotpar.is_multipart():#這里要判斷是否是multipart,是的話,里面的數據是無用的,至于為什么可以了解mime相關知識。name=par.get_param("name")#如果是附件,這里就會取出附件的文件名ifname:

#有附件#下面的三行代碼只是為了解碼象=?gbk?Q?=CF=E0=C6=AC.rar?=這樣的文件名h=email.Header.Header(name)

?dh=email.Header.decode_header(h)

?fname=dh[0][0]

print'附件名:', fname

?data=par.get_payload(decode=True)#解碼出附件數據,然后存儲到文件中try:

?f=open(fname,'wb')#注意一定要用wb來打開文件,因為附件一般都是二進制文件except:

print'附件名有非法字符,自動換一個'?f=open('aaaa','wb')

?f.write(data)

?f.close()

else:

#不是附件,是文本內容printpar.get_payload(decode=True)#解碼出文本內容,直接輸出來就可以了。print'+'*60#用來區別各個部分的輸出

簡單吧,并沒有多少代碼就可以實現復雜的解析郵件的功能!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爛泥:通過vsphere給esxi添加本地硬盤

公司ESXi服務器的硬盤空間不夠使用&#xff0c;現在新加了一塊硬盤在ESxi服務器上。在服務器上添加完硬盤后&#xff0c;在Vsphere上是看不到新加硬盤的。 下面我們來通過虛擬機模擬該情況&#xff0c;先添加一塊硬盤。如下圖&#xff1a; 在Esxi添加完硬盤后&#xff0c;現在通…

清華大學《操作系統》(九):進程和線程

進程 定義&#xff1a; 進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。 組成&#xff1a; 代碼數據狀態寄存器&#xff08;正在運行的一個程序的所有狀態信息&#xff09;&#xff1a;CPU狀態CP0、指令指針IP通用寄存器&#xff1a;AX、BX、CX…

開始Flask項目

1.新建Flask項目。2.設置調試模式。3.理解Flask項目主程序。4.使用裝飾器&#xff0c;設置路徑與函數之間的關系。5.使用Flask中render_template&#xff0c;用不同的路徑&#xff0c;返回首頁、登錄員、注冊頁。6.用視圖函數反轉得到URL&#xff0c;{{url_for(‘login’)}}&am…

gcc交叉編譯的實現

gcc支持多種不同的語言&#xff0c;也支持多種不同的CPU架構。在它的實現上&#xff0c;不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥:mysql數據庫使用的基本命令

1、連接數據庫的格式 mysql -h IP -u用戶名 -p密碼; 1.1連接遠程數據庫 mysql -h 192.168.1.214 -uroot -p123456 也可寫成&#xff1a; mysql -h 192.168.1.214 -u root -p 123456 1.2連接本地數據庫 mysql -uroot -p123456 也可寫成&#xff1a; mysql -u root -p 123456 2、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵&#xff0c;來自統計學習方法的PCA插圖又要考試了&#xff0c;推導一下方差最大化與均方差最小化&#xff0c;老師上課講了一些均方差最小化&#xff0c;推導的過程很詳細不過自己沒有記下來&#xff0c;復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…

《操作系統》OS學習(十):進程控制

進程切換&#xff08;上下文切換&#xff09;&#xff1a; 定義&#xff1a;暫停當前運行進程&#xff0c;從運行狀態變成其他狀態&#xff0c;調度另一個進程從就緒狀態變成運行狀態要求&#xff1a;切換前&#xff0c;保存進程上下文&#xff1b;切換后&#xff0c;恢復進程…

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則&#xff1a;error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

GCC 命令選項使用詳解

GCC 命令行詳解[轉帖] 1、gcc包含的c/c編譯器 gcc、cc、c、g gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2、gcc的基本用法 gcc test.c這樣將編譯出一個名為a.out的程序 gcc test.c -o test這樣將編譯出一個名為t…

mvn 打包_Spark源碼打包編譯的過程

前言上篇文章介紹了下 安裝sbt環境 啟動scala項目安裝SBT環境運行Scala項目為什么要弄這個 因為我本來是想對spark源碼編譯部署spark是用scala語言編譯的spark源碼https://gitee.com/pingfanrenbiji/sparkspark提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景&#xff1a;公司的審計日志經常出現不記錄命令的情況&#xff0c;但是又無法監控到審計功能是否正常。所以我們思路是&#xff0c;每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常&#xff0c;則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換&#xff08;上下文切換&#xff09;&#xff1a;切換CPU的當前任務&#xff0c;從一個進程/線程到另一個&#xff0c;保存當前在PCB/TCB中的執行上下文&#xff0c;讀取下一個的上下文 CPU調度&#xff1a;從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…

Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

該方法可以得到遠程主機的域名&#xff0c;也可以得到本機名。getHostName方法的定義如下&#xff1a; publicString getHostName() 下面是三種創建InetAddress對象的方式&#xff0c;在這三種方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿輔導python面試_猿輔導面試經歷—個人感受

今天參加了猿輔導的二面&#xff0c;無數槽點&#xff0c;不知道是不是很多公司都是這樣&#xff0c;但是我還是忍不住要逼逼叨。6月10號&#xff0c;我向猿輔導投了簡歷&#xff0c;想做招聘邀約專員這個崗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份簡歷之后通知我…

對稱加密與非對稱加密

&#xff08;一&#xff09;對稱加密&#xff08;Symmetric Cryptography&#xff09; 對稱加密是最快速、最簡單的一種加密方式&#xff0c;加密&#xff08;encryption&#xff09;與解密&#xff08;decryption&#xff09;用的是同樣的密鑰&#xff08;secret key&#xff…

清華大學《操作系統》(十二):臨界區與鎖

多進程并發運行&#xff0c;導致多個進程間有資源共享&#xff0c;比如CPU、內存&#xff0c;因此存在不確定性和不可重現&#xff0c;可能導致多次運行結果不一致。因此操作系統需要利用同步機制在并發執行的同時&#xff0c;保證一些操作是原子操作。 互斥是指一個進程占用了…

gcc生成靜態庫和動態庫

gcc生成靜態庫和動態庫一、庫文件簡介簡單地說&#xff0c;庫&#xff08;Library&#xff09;就是一組已經寫好了的函數和變量、經過編譯代碼&#xff0c;是為了能夠提高開發效率和運行效率而設計的。庫分為靜態庫&#xff08;Static Library&#xff09;和共享庫&#xff08;…

python 流式計算框架_流式計算的三種框架:Storm、Spark和Flink

我們知道&#xff0c;大數據的計算模式主要分為批量計算(batch computing)、流式計算(stream computing)、交互計算(interactive computing)、圖計算(graph computing)等。其中&#xff0c;流式計算和批量計算是兩種主要的大數據計算模式&#xff0c;分別適用于不同的大數據應用…