最全總結(jié)!聊聊 Python 發(fā)送郵件的幾種方式

1. 前言
郵件,作為最正式規(guī)范的溝通方式,在日常辦公過程中經(jīng)常被用到
我們都知道 Python內(nèi)置了對 SMTP 的支持,可以發(fā)送純文本、富文本、HTML 等格式的郵件
本文將聊聊利用?Python 發(fā)送郵件的?3?種方式
2. 準(zhǔn)備
以 126 郵箱為例,在編碼之前,我們需要開啟 SMTP 服務(wù)

然后,手動新增一個授權(quán)碼
其中,賬號、授權(quán)碼和服務(wù)器地址用于連接登錄郵箱服務(wù)器
3. 方式一:smtplib
def?__init__(self):
????#?初始化
????self.smtp?=?smtplib.SMTP()
????#?連接郵箱服務(wù)器地址
????self.smtp.connect( smtp.126.com )
????#?加入主題和附件,郵件體
????self.email_body?=?MIMEMultipart( mixed )
????#?發(fā)件人地址及授權(quán)碼
????self.email_from_username?=? **@126.com
????self.email_from_password?=? 授權(quán)碼
#?登錄
self.smtp.login(self.email_from_username,?self.email_from_password)def?generate_email_body(self,?email_to_list,?email_title,?email_content,?attchment_path,?files):
????"""
????組成郵件體
????:param?email_to_list:收件人列表
????:param?email_title:郵件標(biāo)題
????:param?email_content:郵件正文內(nèi)容
????:param?attchment_path:附件的路徑
????:param?files:附件文件名列表
????:return:
????"""
????self.email_body[ Subject ]?=?email_title
????self.email_body[ From ]?=?self.email_from_username
????self.email_body[ To ]?=?",".join(email_to_list)
????for?file?in?files:
????????file_path?=?attchment_path?+? / ?+?file
????????if?os.path.isfile(file_path):
????????????#?構(gòu)建一個附件對象
????????????att?=?MIMEText(open(file_path,? rb ).read(),? base64 ,? utf-8 )
????????????att["Content-Type"]?=? application/octet-stream
????????????att.add_header("Content-Disposition",?"attachment",?filename=("gbk",?"",?file))
????????????self.email_body.attach(att)
????text_plain?=?MIMEText(email_content,? plain ,? utf-8 )
????self.email_body.attach(text_plain)
?#?收件人列表
email_to_list?=?[ 收件人1地址 , 收件人2地址 ]
#?發(fā)送郵件
#?注意:此處必須同時指定發(fā)件人與收件人,否則會當(dāng)作垃圾郵件處理掉
self.smtp.sendmail(self.email_from_username,?email_to_list,?self.email_body.as_string())
def?exit(self):
????"""
????退出服務(wù)
????:return:
????"""
????self.smtp.quit()4. 方式二:zmail
Zmail 項目創(chuàng)建目的是,使郵件處理變得更簡單#?安裝依賴庫
pip3?install?zmail然后,使用郵箱賬號、授權(quán)碼創(chuàng)建一個郵箱服務(wù)對象
class?ZMailObject(object):
????def?__init__(self):
????????#?郵箱賬號
????????self.username?=? **@126.com
????????#?郵箱授權(quán)碼
????????self.authorization_code?=? 授權(quán)碼
????????#?構(gòu)建一個郵箱服務(wù)對象
????????self.server?=?zmail.server(self.username,?self.authorization_code)
接著,將郵件主題、郵件內(nèi)容、包含的附件路徑加入到一個字典中,組成郵件主體
#?郵件主體
mail_body?=?{
???????? subject :? 測試報告 ,
???????? content_text :? 這是一個測試報告 ,??#?純文本或者HTML內(nèi)容
???????? attachments :?[ ./attachments/report.png ],
}最后,將調(diào)用send_mail()函數(shù),將郵件發(fā)送出去即可
#?收件人
#?可以指定一個人,字符串;也可以是多個人,列表
mail_to?=?"收件人1"
#?發(fā)送郵件
self.server.send_mail(mail_to,?mail_body)5. 方式三:yagmail
yagmail?只需要幾行代碼,就能實現(xiàn)發(fā)送郵件的功能
相比?zmail,yagmail 實現(xiàn)發(fā)送郵件的方式更加簡潔優(yōu)雅
首先,安裝依賴庫
#?安裝依賴庫
pip3?install?yagmail
然后,通過賬號、授權(quán)碼和服務(wù)器地址連接郵箱服務(wù)器,返回一個服務(wù)對象
import?yagmail
#?連接服務(wù)器
#?用戶名、授權(quán)碼、服務(wù)器地址
yag_server?=?yagmail.SMTP(user= **@126.com ,?password= 授權(quán)碼 ,?host= smtp.126.com )
接著,通過 send() 函數(shù),將郵件發(fā)送出去
#?發(fā)送對象列表
email_to?=?[ **@qq.com ,?]
email_title?=? 測試報告
email_content?=?"這是測試報告的具體內(nèi)容"
#?附件列表
email_attachments?=?[ ./attachments/report.png ,?]
#?發(fā)送郵件
yag_server.send(email_to,?email_title,?email_content,?email_attachments)
郵件發(fā)送完畢之后,關(guān)閉連接即可
#?關(guān)閉連接
yag_server.close()6. 最后
上面總結(jié)了 Python 發(fā)送郵件的 3 種方式,實際項目中,更推薦使用后兩種方式。

菜鳥編程大本營,已經(jīng)正式上線
專注于分享趣味的編程技巧,不限于Java, Python ,Go, Javascript等語言,讓菜鳥愛上編程,進階成為高手,歡迎關(guān)注。
菜鳥編程本營,從菜鳥進階高手
爆款文案
點這里,獲取新手福利
評論
圖片
表情

