python 接收邮件服务器地址_Python 用IMAP接收邮件
一、簡(jiǎn)介
IMAP(Internet Message Access Protocol),這個(gè)協(xié)議與POP一樣,也是從郵件服務(wù)器上下載郵件到本機(jī),不過(guò)IMAP比POP的功能要更加強(qiáng)大些,IMAP除支持POP所有功能外,還支持以下功能:
多個(gè)郵件文件夾(收件箱、發(fā)件箱、垃圾郵件...)
IMAP服務(wù)器上進(jìn)行標(biāo)記如:Seen, Replied, Read, Deleted
在服務(wù)器端的文件夾之間拷貝和移動(dòng)郵件
...
在IMAP的各版本中,最流行的是IMAP4。我們就使用IMAP4
由于,我需要搜索是否有未讀郵件,也就是利用郵件服務(wù)器的Flag,所以IMAP是非常適合的,我的程序就利用的是IMAP。
在Python的標(biāo)準(zhǔn)庫(kù)包含一個(gè)imaplib模塊,可以利用這個(gè)模塊。但是,這個(gè)模塊的缺陷就是把大量解析的工作留給客戶端程序員。
二、IMAPClient
IMAPClient是一個(gè)非常受歡迎的IMAPCLient包,這個(gè)模塊不在標(biāo)準(zhǔn)Python庫(kù)中。IMAPClient包是由一名叫做Menno Smits的Python程序員編寫的。官網(wǎng)網(wǎng)址:http://imapclient.freshfoo.com/。可以在這里查看手冊(cè)文檔。這個(gè)包是基于標(biāo)準(zhǔn)庫(kù)imaplib,不過(guò)要更強(qiáng)大。下面我們來(lái)介紹下怎樣安裝。
1. virtualenv
說(shuō)實(shí)話,我本人對(duì)virtualenv的理解也不透徹,以字面上來(lái)理解為虛擬環(huán)境。可以把一些模塊、包安裝在特定的virtualenv里,一旦安裝了virtualenv,你就創(chuàng)建任意多個(gè)自組織的虛擬python環(huán)境,在這個(gè)環(huán)境里,可以安裝、下載包。
好吧,廢話就不多說(shuō),直接說(shuō)方法。
這里是virtualenv的詳細(xì)說(shuō)明,上面介紹了非常詳細(xì)的安裝方法,按照我自己的經(jīng)驗(yàn),可以簡(jiǎn)化為以下步驟:
$ [sudo] pip install virtualenv
$ [sudo] pip install https://github.com/pypa/virtualenv/tarball/develop
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/ virtualenv-X.X.tar.gz
$ tar xvfz virtualenv-X.X.tar.gz
$ cd virtualenv-X.X
$ [sudo] python setup.py install
注意,上面下載的 virtualenv-X.X.tar.gz 中的X是型號(hào),需要把它改成數(shù)字,詳細(xì)版本類型可以參考:https://pypi.python.org/packages/source/v/virtualenv/
這樣,virtualenv已經(jīng)安裝好。下面需要?jiǎng)?chuàng)建虛擬環(huán)境實(shí)例,步驟如下:
$ virtualenv --no-site-packages myenv
$ cd myenv
2. 安裝IMAPClient
myenv 為自己定義的虛擬環(huán)境的名字。這樣,我們已經(jīng)在myenv里面,接下來(lái)就可一安裝IMAPClient包了。步驟如下:
$ sudo pip install imapclient
$ python -c 'import imapclient'
此時(shí),可以在python下使用imapclient模塊,但是不能在python3下使用,在網(wǎng)上查了一些資料,尤其是看了上面的那個(gè)介紹virtualenv的網(wǎng)頁(yè),沒找到有用的,但是,回頭發(fā)現(xiàn),這個(gè)imapclient是好使的了,不用進(jìn)入gmapenv,直接使用即可,got it!
注意,上面用到了pip工具,如果沒有的話一定要安裝啊。
$ sudo apt-get install pip
三、開始正式學(xué)習(xí)IMAP1. 因?yàn)榭赡軙?huì)出現(xiàn)中文,因此在程序的最上面,必須加上如下代碼:
#-*- encoding: utf-8 -*-#-*- encoding: gbk -*-
2. 所需模塊
importgetpass, email, sysfrom imapclient import IMAPClient
3. 連接服務(wù)、登錄賬戶
這一步也沒什么好講的。代碼如下:
#通過(guò)以下方式連接smtp服務(wù)器,沒有考慮異常情況,詳細(xì)請(qǐng)參考官方文檔
c = IMAPClient(hostname = 'imap.gmail.com', ssl=True)try:
c.login(username, passwd)#登錄個(gè)人帳號(hào)
exceptc.Error:print('Could not log in')
sys.exit(1)
4. 進(jìn)入收件箱,查看未讀郵件
c.select_folder('INBOX', readonly =True)
result= c.search('UNSEEN')
利用select_folder()函數(shù)進(jìn)行文件夾,'INBOX'為收件箱,readonly = True 表明只讀并不修改任何信息
利用search()函數(shù)選擇想要的郵件,'UNSEEN'是郵件的flag,關(guān)于郵件的flag就不特別說(shuō)明了,返回郵件的message-id
5. 有了未讀郵件的ID(result),下面利用fetch()函數(shù)將郵件取來(lái)(下載到本機(jī))
msgdict = c.fetch(result, ['BODY.PEEK[]'] )
通過(guò)fetch()函數(shù)取得郵件內(nèi)容,fetch()的詳細(xì)介紹請(qǐng)見這里
fetch(self, message, data) 其中self參數(shù)可忽略,message為message_id, data 的作用是抓取message中的哪些部分。 官方文檔中沒有給出data的其他可選的參數(shù),我一開始怎么都不找到,最終在stackoverflow中進(jìn)行提問(wèn),一位大哥把這個(gè)文檔介紹給我,在 6.4.5 FETCH Command 。這里面非常詳細(xì)的介紹了各個(gè)函數(shù)的各種細(xì)節(jié),當(dāng)然也可以查到data其他可選的參數(shù) 6.4.5 表示的是原書的節(jié)。特別感謝這位哥們,人類的力量是無(wú)窮的啊!
我們只需要'BODY.PEEK[]'即可。
6. 已經(jīng)把郵件取出,下面開始解析郵件
for message_id, message inmsgdict.items():
e= email.message_from_string(message['BODY[]']) #生成Message類型
7. 得到的 e 即為Message類型的郵件,先面開始將又將中解析出'From', 'Subject'
還記得上面在POP講解中,我們遇到的不能顯示中文的問(wèn)題嗎?在IMAP中仍會(huì)出現(xiàn),下面就講解解決辦法
由于'From', 'Subject' header有可能有中文,必須把它轉(zhuǎn)化為中文,在這個(gè)點(diǎn)上,耽誤了我很長(zhǎng)時(shí)間,最終在網(wǎng)上查到了一個(gè)方法:http://blog.csdn.net/bonnshore/article/details/8729984?雖然不是很明白,但是能把問(wèn)題解決就是王道。代碼如下:
subject = email.header.make_header(email.header.decode_header(e['SUBJECT'])) #必須保證包含subject
mail_from = email.header.make_header(email.header.decode_header(e['From']))
8. 從Message e中解析出content正文
同上一篇的POP一樣,根據(jù)get_payload()返回的不同類型,選擇解析方法,代碼如下:
maintype =e.get_content_maintype()if maintype == 'multipart':for part ine.get_payload():if part.get_content_maintype() == 'text':
mail_content= part.get_payload(decode=True).strip()elif maintype == 'text':
mail_content= e.get_payload(decode=True).strip()#此時(shí),需要把content轉(zhuǎn)化成中文,利用如下方法:
try:
mail_content= mail_content.decode('gbk')exceptUnicodeDecodeError:print('decode error')
sys.exit(1)
9. 至此,我們已經(jīng)完成了查看是否有未讀郵件。如果有的話將未讀郵件的'From', 'Subject', content解析出來(lái)。正如上面完成的 mail_from, subject, mail_content一樣,現(xiàn)在可以完美的顯示,即使有中文!
四、完整代碼
#-*- encoding: utf-8 -*-#-*- encoding: gbk -*-
#因?yàn)榭赡軙?huì)用到中文,所以必須有上面的這兩句話
#引入模塊及IMAPClient類
importgetpass, email, sysfrom imapclient importIMAPClient
hostname= 'imap.gmail.com' #gmail的smtp服務(wù)器網(wǎng)址
username = 'myUserName@gmail.com'passwd= '***'c= IMAPClient(hostname, ssl= True) #通過(guò)一下方式連接smtp服務(wù)器,沒有考慮異常情況,詳細(xì)請(qǐng)參考官方文檔
try:
c.login(username, passwd)#登錄個(gè)人帳號(hào)
exceptc.Error:print('Could not log in')
sys.exit(1)else:
c.select_folder('INBOX', readonly = True)
#利用select_folder()函數(shù)進(jìn)行文件夾,'INBOX'為收件箱,readonly = True 表明只讀并不修改任何信息
result = c.search('UNSEEN')
msgdict = c.fetch(result, ['BODY.PEEK[]'] )
#現(xiàn)在已經(jīng)把郵件取出來(lái)了,下面開始解析郵件
for message_id, message inmsgdict.items():
e= email.message_from_string(message['BODY[]']) #生成Message類型#由于'From', 'Subject' header有可能有中文,必須把它轉(zhuǎn)化為中文
subject = email.header.make_header(email.header.decode_header(e['SUBJECT']))
mail_from= email.header.make_header(email.header.decode_header(e['From']))#解析郵件正文
maintype =e.get_content_maintype()if maintype == 'multipart':for part ine.get_payload():if part.get_content_maintype() == 'text':
mail_content= part.get_payload(decode=True).strip()elif maintype == 'text':
mail_content= e.get_payload(decode=True).strip()#此時(shí),需要把content轉(zhuǎn)化成中文,利用如下方法:
try:
mail_content= mail_content.decode('gbk')exceptUnicodeDecodeError:print('decode error')
sys.exit(1)else:print('new message')print('From:', mail_from)print('Subject:', subject)
getstr= input('if you wanna read it, input y:')if getstr.startswith('y'):print('-'*10, 'mail content', '-'*10)print(mail_content.replace('
', '\n'))print('-'*10, 'mail content', '-'*10)
finally:
c.logout()
五、總結(jié)
至此,我們已經(jīng)學(xué)習(xí)了利用Python編寫郵件服務(wù)的所有非常基本的內(nèi)容,由于我的需求不是很高,目標(biāo)不是做成一個(gè)功能強(qiáng)大的郵箱客戶端,所以諸如:MIME、附件、圖片等功能都沒有學(xué)習(xí),當(dāng)然也沒有介紹。
因?yàn)槲覀儸F(xiàn)在接收的郵件,大多數(shù)都是MIME格式的,不過(guò)上文的包含了點(diǎn)解析MIME格式郵件的代碼。詳細(xì)請(qǐng)參考《Foundations of Python3 Network Programming. 2nd Edition》Chaper E-mail Composition and Decoding。
總結(jié)
以上是生活随笔為你收集整理的python 接收邮件服务器地址_Python 用IMAP接收邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: aoc电脑显示器质量太差(aoc显示器不
- 下一篇: ln函数怎么看奇偶性_Python中函数