E-mail主要由郵件頭和郵件體兩部分組成。
郵件頭中的內(nèi)容和我們寄信時(shí)寫(xiě)在信封上的內(nèi)容大同小意,當(dāng)然這里也包含了很多路過(guò)的“郵局”的信息了。
郵件體中的內(nèi)容就是我們寫(xiě)的信或者包裹。
python自身包含了email模塊處理可以快速的處理E-mail中的信息
import email
#打開(kāi)一個(gè)文件
fp = open('email.eml', 'r')
#創(chuàng)建email實(shí)例
msg = email.message_from_file(fp)
#現(xiàn)在我們就可以很簡(jiǎn)單的取出我們想要的郵件頭信息
subject = msg.get('subject')
from = msg.get('from')
to = msg.get('to')
現(xiàn)在我們已經(jīng)得到了郵件的主題,發(fā)件人和郵件人的信息
可是我們?cè)趺慈〉绵]件中正文信息和附件信息呢?
這些信息我們就需要遍歷郵件內(nèi)容來(lái)獲取了。
for part in msg.walk():
if part.is_multipart():
continue
#獲取內(nèi)容類(lèi)型
content_type = part.get_content_type()
#text/plain類(lèi)型說(shuō)明是文本,有時(shí)郵件格式不規(guī)范會(huì)寫(xiě)為text
if ('text/plain' == content_type
or 'text' == content_type):
content = part.get_payload()
#application/octet-stream說(shuō)明是附件,這里假設(shè)郵件里只包含一個(gè)附件
if ('application/octet-stream' == content_type):
file = part.get_payload()
現(xiàn)在我們已經(jīng)把郵件中的主要信息取出來(lái)了。
但是為什么取出來(lái)的信息都看不明白呢?
例如
To: "=?gb2312?B?uu/X0w==?=" <ape@ape.com>
這是因?yàn)猷]件在傳送過(guò)程中使用base64進(jìn)行了編碼操作
“=?gb2312?B?uu/X0w==?=”這段字符串是使用bae64進(jìn)行編碼后的gb2312字符集的字符串
現(xiàn)在我們看看怎么解析這些數(shù)據(jù)
str = '=?gb2312?B?uu/X0w==?='
list = email.header.decode_header(str)
#這時(shí)list內(nèi)容為[[('\xba\xef\xd7\xd3', 'gb2312')]]
to = list[0][0].decode(list[0][1])
#這時(shí)to里的內(nèi)容為u'\u7334\u5b50'即utf-8字符集中的’猴子’兩字
有時(shí)解碼時(shí)會(huì)遇到不能解析的字符,這時(shí)就要給decode函數(shù)增加一個(gè)參數(shù)了
to = list[0][0].decode(list[0][1], 'ignore')
這時(shí)無(wú)法解析的字符將被忽略
現(xiàn)在我們已經(jīng)可以得到信息中的中文信息。
但是有些信件不存儲(chǔ)字符集怎么辦呢?
現(xiàn)在我們用http://chardet.feedparser.org/里面的chardet庫(kù)提供的功能對(duì)編碼進(jìn)行探測(cè)
import chardet
str = '\xba\xef\xd7\xd3'
chardet.detect(str)
#返回的結(jié)果
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
經(jīng)過(guò)以上的步驟我們就可以比較正確的獲取一封信件的內(nèi)容了。
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇