Python 發送郵件腳本
在一些場景中經常需要發送郵件, 像是持續集成和運維報警等. 而使用Python腳本能夠很快捷方便得實現發送各種郵件的需求.這里就通過Python基于SMTP(Simple Mail Transfer Protocol)實現一套可以群發,Html內容和附件的腳本.
既然是要發送各種類型的郵件, 首先需要有一個郵箱.這里就以騰訊企業郵箱為例.做完一下三個準備工作之后就可以開始寫腳本了.
準備
- 在設置中開啟所有SMTP相關服務.
- 記錄發送郵件服務器地址, 連接方式和端口
- 新增一個授權密碼并記錄起來.
連接郵件服務器并登陸
Python中有smtplib模塊可供使用, 將它導入進來. 在發送郵件服務器地址信息那里可以看到連接有兩種方式, 一種是普通連接, 一種是經過加密的連接. 在腳本中就根據需求去構建兩種不同的鏈接對象. 通過郵件服務器地址這里的server_host也就是smtp.exmail.qq.com和默認的服務器端口(SMTP方式默認使用25端口而SMTP_SSL就是默認使用465端口, 通常郵件服務器都是可以使用默認端口的)建立與郵件服務器之間的連接. 并通過郵箱賬戶和上面第三步中設置的授權密碼登錄郵箱服務器. 沒有異常信息的話就連接郵件服務器并登錄成功了.
發送文本郵件
發送郵件之前先驗證一下當前是否已經登錄到郵件服務器. 再通過email模塊中的MIMEText構建出包含發件人, 收件人列表, 郵件標題和郵件內容的消息體.因為這里是發送文本內容的郵件, 所以content_type是plain.
構建完消息體之后就可以直接調用SMTP的sendmail方法, 將消息體從發件方發送到收件列表中的收件郵箱中去.
發送Html郵件
如果發送普通文本郵件成功了, 那么想要發送html內容的郵件就很簡單了, 稍微改一下上面的代碼給content_type多一種html的選擇就可以了. 通過外部的參數控制構建消息體是純文件內容還是html內容. 這樣就可以使用一些html模板來發送固定格式的郵件.
發送附件
首先從email模塊中引入MIMEMultipart. 從這個MIME擴展類的名字也可以看出它的作用是可以構建多個MIME的消息體, 并將它們裝配起來.繼續修改前面的代碼. 根據發件人, 收件人列表和郵箱標題構建出多MIME實例.
接著根據參數決定構建純文本還是Html內容的消息體, 將該包含郵件內容的消息體裝載進上面初始化過的multi_msg中. 完成郵件內容部分的填充.
完成代碼改造之后就要加入對附件的支持, 遍歷外部傳入的文件列表, 并根據文件構建出包含附件的消息體, 將其依次裝載進multi_msg中.
打開遍歷文件列表時拿到附件, 將其初始化為MIME消息體, 并且設置附件的文件屬性和附件的名字.
匯總
功能代碼完成之后再通過getopt構建出來外部參數指令, 方便外部調用腳本.
執行腳本
收到群發帶附件的郵件
Issue
通常我們都是在公司使用自動發郵件腳本, 肯定都會發送一些內容到企業郵箱. 在向企業郵箱群發郵件的時候會出現企業退信的情況, 返回一個代碼和簡單的描述代表這次發送失敗. 我在用163的郵箱給騰訊企業郵箱發送群發郵件時就出現過這個問題. 這時可以參考一下退信代碼說明, 根據里面的說明fix問題.
————金三銀四課程特惠————
馬哥教育精英線下Linux班鄭州校區開班倒計時,優惠四重享,贈送高達4000元的學習大禮包:
第一重:4月30日前報名,立減400元,名額有限搶完為止;
第二重:4月30日前報名,贈送馬哥教育內部Linux知識精講教材一本(價值666元);
第三重:4月30日前報名,贈送馬哥教育實體服務器使用資格(價值1666元);
第四重:4月30日前報名,贈送馬哥教育云學堂學習權限1個(價值1999元);