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

然后,手動(dòng)新增一個(gè)授權(quán)碼
其中,賬號(hào)、授權(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)建一個(gè)附件對(duì)象
????????????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ā)送郵件
#?注意:此處必須同時(shí)指定發(fā)件人與收件人,否則會(huì)當(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 項(xiàng)目創(chuàng)建目的是,使郵件處理變得更簡(jiǎn)單#?安裝依賴庫(kù)
pip3?install?zmail然后,使用郵箱賬號(hào)、授權(quán)碼創(chuàng)建一個(gè)郵箱服務(wù)對(duì)象
class?ZMailObject(object):
????def?__init__(self):
????????#?郵箱賬號(hào)
????????self.username?=?'**@126.com'
????????#?郵箱授權(quán)碼
????????self.authorization_code?=?'授權(quán)碼'
????????#?構(gòu)建一個(gè)郵箱服務(wù)對(duì)象
????????self.server?=?zmail.server(self.username,?self.authorization_code)
接著,將郵件主題、郵件內(nèi)容、包含的附件路徑加入到一個(gè)字典中,組成郵件主體
#?郵件主體
mail_body?=?{
????????'subject':?'測(cè)試報(bào)告',
????????'content_text':?'這是一個(gè)測(cè)試報(bào)告',??#?純文本或者HTML內(nèi)容
????????'attachments':?['./attachments/report.png'],
}
最后,將調(diào)用send_mail()函數(shù),將郵件發(fā)送出去即可
#?收件人
#?可以指定一個(gè)人,字符串;也可以是多個(gè)人,列表
mail_to?=?"收件人1"
#?發(fā)送郵件
self.server.send_mail(mail_to,?mail_body)5. 方式三:yagmail
yagmail?只需要幾行代碼,就能實(shí)現(xiàn)發(fā)送郵件的功能
相比?zmail,yagmail 實(shí)現(xiàn)發(fā)送郵件的方式更加簡(jiǎn)潔優(yōu)雅
首先,安裝依賴庫(kù)
#?安裝依賴庫(kù)
pip3?install?yagmail
然后,通過(guò)賬號(hào)、授權(quán)碼和服務(wù)器地址連接郵箱服務(wù)器,返回一個(gè)服務(wù)對(duì)象
import?yagmail
#?連接服務(wù)器
#?用戶名、授權(quán)碼、服務(wù)器地址
yag_server?=?yagmail.SMTP(user='**@126.com',?password='授權(quán)碼',?host='smtp.126.com')
接著,通過(guò) send() 函數(shù),將郵件發(fā)送出去
#?發(fā)送對(duì)象列表
email_to?=?['**@qq.com',?]
email_title?=?'測(cè)試報(bào)告'
email_content?=?"這是測(cè)試報(bào)告的具體內(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 種方式,實(shí)際項(xiàng)目中,更推薦使用后兩種方式
推薦閱讀
1
2
3
4
崔慶才
靜覓博客博主,《Python3網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)實(shí)戰(zhàn)》作者
隱形字
個(gè)人公眾號(hào):進(jìn)擊的Coder
長(zhǎng)按識(shí)別二維碼關(guān)注


