版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
還有在發(fā)送郵件的場(chǎng)景中,如果你發(fā)現(xiàn)周報(bào)、月報(bào)等郵件模版是可以通用的,那你可以利用Pyhon的字符串編寫來(lái)實(shí)現(xiàn)郵件內(nèi)容的自動(dòng)替換功能,讓你在使用郵件發(fā)送周報(bào)、月報(bào)工作約大量的時(shí)間。那么今天我就教你如何使用Python的yagmail、imaplib兩個(gè)庫(kù),分別實(shí)現(xiàn)郵件的自動(dòng)我們先從如何自動(dòng)收郵件開始學(xué)習(xí)。今天的案例是這樣的:我希望能每隔檢查一次收件箱,判斷收件箱中是否有30天內(nèi)未讀的郵件。并利用正則表達(dá)式根據(jù)郵件判斷其中是否包含“故障”這一關(guān)鍵字。如果包含的話,就通過釘釘?shù)燃磿r(shí)通訊工具通知到我,實(shí)現(xiàn)高優(yōu)先級(jí)郵件處理的功能。要想利用Python的正則表達(dá)式判斷郵件是否出現(xiàn)了“故障”關(guān)鍵字,你必須要讓Python實(shí)現(xiàn)郵件接收和功能。在Python中,pplb和imaplb庫(kù)都支持郵件的接收協(xié)議,可以讓我們登陸服務(wù)器接收郵件,從而實(shí)現(xiàn)郵件接收和。那這兩個(gè)庫(kù)該選擇哪一個(gè)呢?imalib庫(kù)支持IMAP協(xié)議,而polib庫(kù)支持POP3協(xié)議,IMAP協(xié)議在支持雙向操作的功能上更加強(qiáng)大,并且能把客戶端對(duì)郵件的刪除等操作同步到服務(wù)端,也能把服務(wù)端對(duì)郵件刪除的操作同步到客戶端。與POP3協(xié)議只能把服務(wù)端的操作單向同步給客戶端相比,會(huì)更加靈活。所以我在本講中,就以imalib庫(kù)為例,為你講解通過IMAP協(xié)議進(jìn)行郵件的自動(dòng)接收。我們?cè)诖_定采用IMAP協(xié)議接收郵件之后,接下來(lái)就要按照IMAP協(xié)議的要求,編寫一個(gè)從郵件服務(wù)器郵件并分析郵件的代碼。獲取郵件的代碼分為三個(gè)主要步驟,分別是指定郵件服務(wù)器的MAP地址和端口、驗(yàn)證用戶名和的正確性以及郵件到本地并解析郵件得到郵件。我們依次來(lái)學(xué)下。第一步是指定郵件服務(wù)器的IMAP地址和端口。大部分對(duì)郵件安全比較重視的公司,為了防止發(fā)現(xiàn)郵件服務(wù)器用戶的弱口令,默認(rèn)是將IMAP服務(wù)的功能關(guān)閉的。你IMAP我以QQ郵箱為例,打開IMAP服務(wù)的方法是在QQ郵箱的網(wǎng)頁(yè)端登陸成功后,通過設(shè)置-賬號(hào)-IMAP服務(wù),打開IMAP/SMTP服務(wù)。打開功能后,可以參考文檔將IMAP服務(wù)器的地址指定為:“ ”,“使用SSL”保證數(shù)據(jù)傳輸過程的安全,并將連接IMAP服務(wù)器的端口指定為“993”。打開IMAP服務(wù)的截圖和文檔的第二步是使用用戶名登錄。當(dāng)服務(wù)器允許你從使用IMAP協(xié)議登陸服務(wù)器接收郵件后,就可以使用Python的imaplib庫(kù)進(jìn)行連接和登陸了。imaplib庫(kù)是Python的內(nèi)置庫(kù),連接服務(wù)器可以使用IMAP4_SSL1234importconn=",port=在這段代碼中的第三行,你需要把“username和password碼,替換之后才能正常登陸。如果登陸成功,可以通過list函數(shù)查看郵箱中默認(rèn)包含了哪些文件夾,默認(rèn)的郵件都被放在“INBX”文件夾中,而“IBOX”就是我們經(jīng)常使用的收件箱。箱中的郵件進(jìn)行查詢,只能得到未讀郵件的唯一ID,我們稱它為“郵件ID”,你需要IMAP的fetch()命令將郵件ID對(duì)應(yīng)的郵件內(nèi)容本地后,才能進(jìn)行,后才能你還要注意的是,通過郵件ID的郵件內(nèi)容需要兩次,才能看到郵件的。這是因?yàn)槊恳环忄]件都采用了郵件的標(biāo)準(zhǔn)編碼方式MIME編碼,MIME編碼可以讓郵件在服務(wù)器和客戶端直接實(shí)現(xiàn)正常的傳輸,但是你無(wú)法查看使用了MIME編碼之后的郵件內(nèi)容,因此需要先對(duì)郵件的MIME編碼進(jìn)行。而第二次呢,是把MIME編碼的郵件后的內(nèi)容,轉(zhuǎn)換成符合你當(dāng)前操作系統(tǒng)的編總結(jié)來(lái)說(shuō),在Windows中,默認(rèn)的編碼為“GBK”編碼,mac為“UTF-8”編碼。你需要把內(nèi)容按照Python所在的操作系統(tǒng)再一次,這樣才能得到正確的郵件標(biāo)題,之后雖然獲得郵件的的步驟比較繁瑣,無(wú)法得到郵件,不過你不用擔(dān)心,因?yàn)槊總€(gè)處理步驟中只需要使用一個(gè)函數(shù)就可以搞定了。那么接下來(lái)我先把從進(jìn)入收件箱到取得的完整執(zhí)行過程的代碼提供給你,然后再為你具體講解每個(gè)函數(shù)的作用。代代123456789#默認(rèn)為#搜索郵件,ALL為全部,可以按照發(fā)件人使用FROM_,data=conn.search(None,formailidindata[0].decode().split():#取回每一封未讀郵件的內(nèi)容#data=[b'1234_maildataconn.fetch(str(mailid)'(RFC822)')#對(duì)每一封郵件的內(nèi)容進(jìn)行解析msg#subject_tmp=#sj_decodesubject=sj_decode.decode('utf-我來(lái)為你依次解釋一下imaplib是如何郵件并得到郵件的首先,我們需要從收件箱中找到30天內(nèi)未讀的郵件ID,通過郵件的ID才能從IMAP服我在代碼第4行,使用了select()函數(shù),指定要的文件夾為收件箱“INBOX”;再利用第6行的search()函數(shù)的“unseen”參數(shù),來(lái)取得30天內(nèi)未讀的郵件。這里的“INBOX和unseen”都是IMAP協(xié)議定義的關(guān)鍵字,Python會(huì)將它們轉(zhuǎn)譯為IMAP的語(yǔ)法,并發(fā)送給服務(wù)器,而服務(wù)器則會(huì)把30天以內(nèi)未讀郵件的ID以列表形式返回,并把ID以字節(jié)方式存放在data列表的第一個(gè)元素中,data列表的具體格式,你可以參考第10行注釋。接下來(lái),我們需要根據(jù)每個(gè)郵件ID得到郵件的。由于郵件ID為字節(jié)類型,因此我將它轉(zhuǎn)換為列表之后,使用for循環(huán)進(jìn)行遍歷,把每個(gè)郵件ID用mailid變量進(jìn)行了保存。同時(shí),我在第11行通過fetch()函數(shù),使用郵件ID向服務(wù)器發(fā)起請(qǐng)求,得到該郵件的所fetch()函數(shù)取得了郵件的內(nèi)容后,如果使用print()進(jìn)行輸出,會(huì)發(fā)現(xiàn)你無(wú)法看到郵件里原因就在于郵件采用的是MIME類型,這種類型是郵件的標(biāo)準(zhǔn)格式,需要專門的工具進(jìn)行內(nèi)容的解析。就像你無(wú)法通過記事本查看一張一樣,通過記事本只能看到中的數(shù)據(jù),無(wú)法得知上面的顏色和內(nèi)容。因此我需要再使用一個(gè)標(biāo)準(zhǔn)庫(kù) message_from_string()方法,對(duì)MIME類型進(jìn)行解析。解析之后,你就能夠得到、內(nèi)容、附件等郵件的不同部分了,由于我在當(dāng)前案例需要提取郵件的,所以使用第15行的get()函數(shù)通過參數(shù)“subject”取得了當(dāng)前郵件的頭部信息,并利用decode_header()取得了郵件的。為了能夠在Mac系統(tǒng)上也可以進(jìn)行處理,我將采用“utf-8”編碼進(jìn)行后,就能夠正常顯示漢字了。如果你想要判斷該是否包含“故障”關(guān)鍵字,可以使用我們多次使用到的正則表達(dá)式,使用re.search('故障',subject)進(jìn)行正則匹配,并且你還可以增加在學(xué)習(xí)了自動(dòng)接收郵件并對(duì)進(jìn)行判斷的功能之后,還有兩點(diǎn)需要你注意,這也是初次使用imaplib庫(kù)的同學(xué)最容易犯的兩個(gè)錯(cuò)。第一個(gè)是如果你沒有將在IMAP服務(wù)器上的郵件標(biāo)記為已讀,會(huì)導(dǎo)致自動(dòng)接收郵件程序重復(fù)處理該郵件。由于fech)函數(shù)的功能是從服務(wù)器郵件內(nèi)容,并對(duì)郵件進(jìn)行自動(dòng)化處理,所以服務(wù)器上的郵件狀態(tài)仍然為“未讀”狀態(tài)。這會(huì)導(dǎo)致你的程序陷入死循環(huán),對(duì)匹配的進(jìn)行無(wú)限重復(fù)的處理。'+FLAGS','\seenmailid另一個(gè)經(jīng)常出現(xiàn)的問題是,當(dāng)你的所有郵件都為已讀狀態(tài)時(shí),應(yīng)當(dāng)在遍歷郵件ID功能前增加對(duì)data變量的判斷,避免向服務(wù)器提交空ID,導(dǎo)致運(yùn)行到fetch()函數(shù)時(shí),服務(wù)器接收空ID報(bào)錯(cuò)。dataifNone”,如果為None,則本次執(zhí)行到此結(jié)束。如果有未讀郵件,則再將郵件ID通過fetch()提交到服務(wù)送郵件采用了SMTP協(xié)議,而且也需要指定服務(wù)器地址、用戶名、以及收件人、主SMTP一步,我們需要采用和imaplib不同的包實(shí)現(xiàn)。在標(biāo)準(zhǔn)庫(kù)中發(fā)送郵件的包叫做smtplib,由于smtplib需要配置較多的通用參數(shù),所以還有一個(gè)對(duì)它進(jìn)行了更高級(jí)的封裝的第庫(kù)yagmail庫(kù)。yagmail庫(kù)將大部分的默認(rèn)參數(shù)在底層實(shí)現(xiàn)了,發(fā)送郵件時(shí),你只需要關(guān)注必須填寫的服務(wù)器IP、用戶驗(yàn)證以及郵件的內(nèi)yagmail第庫(kù)的安裝包和它同名,那么你可以使用pip命令直接安裝,安裝成功后把它導(dǎo)入并連接服務(wù)器即可。連接SMTP服務(wù)器的代碼如下:conn= )8yagmail庫(kù)使用SMTP()函數(shù)與服務(wù)器建立連接,并在連接時(shí)指定用戶名、、主機(jī)地這里需要注意的是,SMTP()函數(shù)通過默認(rèn)參數(shù)“smtp_ssl=True”使用了SSL協(xié)議,如果你所使用的郵件服務(wù)器采用了不同版本的SSL傳輸加密協(xié)議,你需要先將默認(rèn)端口從465587。如果沒有提示連接異常,表明建立連接是成功的,接下來(lái)就可以為這封郵f-string字符串的形式來(lái)存放郵件的內(nèi)容。例如你f-stringf-string代代content="內(nèi)容填充body=f"模版當(dāng)你編寫好郵件的正文后,需要使用send()函數(shù)來(lái)發(fā)送郵件。send()函數(shù)一般會(huì)使用四個(gè)參數(shù),按照參數(shù)定義的順序,它們分別是收件人郵箱、、郵件正文和附件。我將這四個(gè)部分依次作為send()函數(shù)的參數(shù)后,就可以將郵件發(fā)送到SMTP服務(wù)器了。這里我有一個(gè)小的建議,我會(huì)建議你先把郵件發(fā)給自己,如果出現(xiàn)發(fā)送失敗,或發(fā)送內(nèi)容與自己期望不符時(shí),更方便對(duì)內(nèi)容進(jìn)行調(diào)整。我把發(fā)送命令和發(fā)送成功后的截圖貼在下面,供你參考。1", ",body, ","",body,這就是利用yagmail實(shí)現(xiàn)自動(dòng)發(fā)送郵件的完整過程,掌握之后,你可以把上節(jié)課學(xué)習(xí)的定時(shí)任務(wù),以及自動(dòng)生成圖形的matplotlib庫(kù)結(jié)合起來(lái)使用,將發(fā)送郵件功能定義為一個(gè)函最后,我來(lái)為你總結(jié)一下這一講的主要內(nèi)容。在本講,我使用了yagmail庫(kù)、imaplib庫(kù) 庫(kù)實(shí)現(xiàn)了郵件自動(dòng)收發(fā)的功能。與Foxmail和Outlook比起來(lái),使用Python實(shí)現(xiàn)的郵件客戶端,能夠在收取郵件后對(duì)等元素自行判斷,并與正則表達(dá)式、IM通知yagmailCeleryIMAP如果郵件接收或發(fā)送是你自動(dòng)化工作中主要優(yōu)化的工具,那么我建議你用的時(shí)間來(lái)掌握IMAP與SMTP協(xié)議規(guī)范。當(dāng)你掌握了IMAP協(xié)議能夠支持哪些操作以及不能支持哪些操作之后,才能更好地進(jìn)行郵件API的學(xué)習(xí)。對(duì)于IMAP支持的功能,你可以參考文檔,找到函數(shù)及其參數(shù),對(duì)于最后的最后,除了、釘釘外,郵件可以說(shuō)是我們職場(chǎng)中使用最廣泛的通訊工具了。并且也是我們工作中最正式的通訊工具。因此我建議你能夠多練習(xí)怎么通過Python更加熟按照慣例,我來(lái)為你留一道思考題,如果我希望每周六10點(diǎn)整,能夠自動(dòng)的將C盤上的一個(gè)作為郵件的附件發(fā)送
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025海爾地產(chǎn)合同管理制度
- 2025合同模板工程建設(shè)招標(biāo)投標(biāo)合同(履約銀行保證書)范本
- 2025醫(yī)療合同范本范文
- 挖掘機(jī)買賣合同
- 七年級(jí)上冊(cè)人教版歷史知識(shí)點(diǎn)總結(jié)
- 2025健身房教練聘用合同
- 課題申報(bào)參考:領(lǐng)導(dǎo)差錯(cuò)取向?qū)苿?chuàng)企業(yè)雙元綠色創(chuàng)新的跨層次傳導(dǎo)及干預(yù)機(jī)制研究
- 跨文化教育中的創(chuàng)新教學(xué)方法探討
- 2024年壓敏熱熔膠項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 2024年核電站用過濾氈項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 衛(wèi)生服務(wù)個(gè)人基本信息表
- 醫(yī)學(xué)脂質(zhì)的構(gòu)成功能及分析專題課件
- 高技能人才培養(yǎng)的策略創(chuàng)新與實(shí)踐路徑
- 廣東省湛江市廉江市2023-2024學(xué)年八年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 2024年湖北省知名中小學(xué)教聯(lián)體聯(lián)盟中考語(yǔ)文一模試卷
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 生物 含解析
- 燃?xì)庑袠I(yè)有限空間作業(yè)安全管理制度
- JB T 7946.1-2017鑄造鋁合金金相
- 包裝過程質(zhì)量控制
- 通用電子嘉賓禮薄
- 赤峰市海業(yè)礦產(chǎn)有限責(zé)任公司福合元礦區(qū)銅鉬礦2022年度礦山地質(zhì)環(huán)境治理與土地復(fù)墾方案
評(píng)論
0/150
提交評(píng)論