使用Python第三方庫發(fā)送電子郵件的示例代碼
Python 作為當(dāng)前最熱門的編程語言之一,不僅僅是因?yàn)樗膶W(xué)習(xí)成本低、入門容易,還因?yàn)樗哂胸S富的生態(tài)環(huán)境,包括內(nèi)置的模塊以及第三方的庫,使用它能夠做很多事情。例如,辦公自動(dòng)化也是 Python 涉及的領(lǐng)域之一,如果能夠用好 Python, 能夠顯著提高我們的工作效率。
今天我們就來學(xué)習(xí),如何使用 Python 發(fā)送電子郵件。
1. 安裝 yagmail 第三方庫
首先,我們來安裝一個(gè)第三方庫,yagmail 模塊。這個(gè)庫實(shí)現(xiàn)了發(fā)送電子郵件的功能,因此,我們需要進(jìn)行安裝??梢酝ㄟ^ pip 命令進(jìn)行安裝,命令如下:
pip install yagmail -i https://mirrors.aliyun.com/pypi/simple/
2. 開啟 POP3、IMAP 和 SMTP 服務(wù)
那么在安裝完模塊之后,我們還需要在郵箱平臺(tái)進(jìn)行相應(yīng)地設(shè)置,那為什么要設(shè)置呢?大家想一下,我們平時(shí)發(fā)送郵件都是在郵箱平臺(tái)編輯發(fā)送的,那么現(xiàn)在我們要使用 Python 的第三方模塊操控我們的郵箱,進(jìn)行發(fā)送郵件。這個(gè)時(shí)候就需要郵箱平臺(tái)給予 Python 的第三方模塊權(quán)限了啊,讓它代替郵箱平臺(tái)進(jìn)行發(fā)送郵件。
因此,我們需要在郵箱平臺(tái)上進(jìn)行設(shè)置,開啟對(duì)應(yīng)的協(xié)議以及第三方授權(quán)(需要手機(jī)短信驗(yàn)證、QQ 安全驗(yàn)證中心等等)。所以,下面我們需要對(duì)開啟的協(xié)議做一個(gè)簡單的介紹,之后再帶著大家開啟協(xié)議以及第三方授權(quán)。
2.1 POP3、IMAP 和 SMTP 簡介
POP3: 即 Post Office Protocol3,意思就是郵局協(xié)議第三個(gè)版本。這個(gè)協(xié)議規(guī)定了將個(gè)人計(jì)算機(jī)連接到 Internet 的郵件服務(wù)器和下載電子郵件的電子協(xié)議,幫助用戶登錄、取郵件和刪除郵件等。
IMAP: 即 Internet Message Access Protocol, 意思就是郵件訪問協(xié)議。它和 POP3 都是郵件訪問最為普遍的 Internet 標(biāo)準(zhǔn)協(xié)議。它與 POP3 協(xié)議的主要區(qū)別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對(duì)服務(wù)器上的郵件進(jìn)行操作。
SMTP: 即 Simple Mail Transfer Protocol, 意思就是簡單郵件傳輸協(xié)議。它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式,幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地址。
2.2 開啟 POP3、IMAP、和 SMTP 協(xié)議
了解了 POP3、IMAP 和 SMTP 協(xié)議之后,接下來我們就要開啟郵箱的 POP3、IMAP 和 SMTP 協(xié)議了。下面我以網(wǎng)易 163 郵箱為例進(jìn)行演示,步驟如下:
登錄 163 郵箱平臺(tái) -> 點(diǎn)擊設(shè)置 -> 開啟服務(wù) -> 開啟 IMAP/SMTP 服務(wù) -> 開啟 POP3/SMTP 服務(wù)。
當(dāng)然,在操作的過程中會(huì)涉及到發(fā)送短信驗(yàn)證碼,大家只要跟著提示一步一步操作就行,使用微信掃描二維碼就可以自動(dòng)編輯信息,然后選擇發(fā)送即可。
下面,給出具體清晰的圖文教程:
第一步,點(diǎn)擊設(shè)置 -> POP3/SMTP/IMAP

第二步,開啟服務(wù) -> 開啟 IMAP/SMTP 服務(wù)

點(diǎn)擊 “繼續(xù)開啟”

使用微信掃描二維碼,發(fā)送短信之后,再點(diǎn)擊 “我已發(fā)送”

復(fù)制并記住授權(quán)密碼,這個(gè)后面登錄郵箱要用到,之后點(diǎn)擊 “確定”

第三步,開啟服務(wù) -> 開啟 POP3/SMTP 服務(wù)

點(diǎn)擊 “確定” 即可

最后,經(jīng)過一系列的操作之后,我們就將 POP3、IMAP 和 SMTP 服務(wù)成功打開了,下面就準(zhǔn)備進(jìn)入到寫 Python 代碼的環(huán)節(jié)!
3. 發(fā)送郵件
3.1 發(fā)送第一封電子郵件
發(fā)送一封電子郵件的過程,需要發(fā)送方的賬號(hào)、密碼以及 SMTP 服務(wù)器域名,收件人的賬號(hào)、郵件標(biāo)題、郵件內(nèi)容以及附件等等。值得注意的是,這里提到的發(fā)件人密碼并不是我們平時(shí)登錄郵箱平臺(tái)的密碼哦,而是我們?cè)?2.2 小節(jié)中開啟 IMAP/SMTP 服務(wù)時(shí),得到的授權(quán)密碼,我之前說過要復(fù)制存儲(chǔ)下來的,就是在這個(gè)時(shí)候要用到啦!
OK 廢話不多說了, 下面直接給出一段發(fā)送第一封郵件的具體代碼:
import yagmail
# yagmail.SMTP(user='發(fā)件人郵箱賬號(hào)', password='授權(quán)碼', host='SMTP 服務(wù)器域名')
yag = yagmail.SMTP(user='xxx@163.com', password='xxxxxx', host='smtp.163.com')
contents = 'hello, this is the first email' # 郵件內(nèi)容
subject = '第一封郵件' # 郵件主題
receiver = 'xxx@qq.com' # 接收方郵箱賬號(hào)
yag.send(receiver, subject, contents)
yag.close()
print('發(fā)送成功')
代碼解析:
- 使用 yagmail 第三方模塊發(fā)送郵件非常簡單。首先,調(diào)用 yagmail.SMTP() 方法指定發(fā)送方賬號(hào)、授權(quán)碼 和 SMTP 服務(wù)器域名, 登錄到郵箱系統(tǒng)中。之后,使用 yag.send() 方法將接收方,主題和內(nèi)容分別傳送到對(duì)應(yīng)的參數(shù)位置即可。
- 發(fā)送完成之后,記得使用 yag.close() 退出登錄狀態(tài),釋放資源。
- password 一定要小心存放,不要泄露,否則別人就相當(dāng)于拿到了你的郵箱密碼。
那么,我們可以運(yùn)行這段代碼。運(yùn)行完成之后,看一下我的郵箱確實(shí)收到了剛才的郵件,截圖如下所示:

大家可以看到,確實(shí)收到了郵件,這表明發(fā)送第一封郵件成功啦!
補(bǔ)充:
剛才我們說了授權(quán)密碼一定要小心存放。那如何做才算“小心”呢?最好是授權(quán)密碼不要出現(xiàn)在代碼中,因此,我們可以將授權(quán)密碼存儲(chǔ)在系統(tǒng)中,每次登錄時(shí)能夠不用顯式填寫授權(quán)密碼。操作過程如下:
首先,打開 Python 交互式環(huán)境,例如 IDLE 或者 Anaconda,如果使用的是 PyCharm,那么可以調(diào)出 Python Console:

然后,在命令行分別輸入如下命令:
import yagmail
# yagmail.register(郵箱賬號(hào), 授權(quán)密碼)
yagmail.register('xxx@126.com', 'xxx')
這樣,就可以將授權(quán)密碼存儲(chǔ)在系統(tǒng)中,一定程度上保證了授權(quán)密碼的安全性。在之后的代碼中,我就可以不用將 password 傳入到 yagmail.SMTP() 方法的參數(shù)中。
3.2 群發(fā)郵件
那么通過上一小節(jié)的學(xué)習(xí),我們掌握了如何發(fā)送第一封電子郵件。但是,在日常使用中,我們常常需要發(fā)送通知之類的郵件,這類郵件往往接收方是多個(gè)的,不止一個(gè)接收方。下面我們?cè)賮砜匆幌拢?dāng)我需要群發(fā)郵件的時(shí)候,是如何做的。
老規(guī)矩,直接貼代碼:
import yagmail
# yagmail.SMTP(user='發(fā)件人郵箱賬號(hào)', host='SMTP 服務(wù)器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
contents = 'Happy New Year' # 郵件內(nèi)容
subject = '新年快樂' # 郵件主題
receivers = ['xxx@qq.com', 'xxx@126.com', 'xxx@163.com'] # 接收方們的郵箱賬號(hào)
yag.send(receivers, subject, contents)
yag.close()
print('發(fā)送成功')
代碼解析:
大家可以看到,群發(fā)郵件的代碼和上一小節(jié)的代碼,不同的地方就是接收方。群發(fā)郵件肯定意味著有一個(gè)或多個(gè)收件人,因此我只需要定義一個(gè)接收方列表 receivers, 將多個(gè)接收方的賬號(hào)放在列表里,隨便你放多少個(gè)都可以。之后再將這個(gè)列表作為參數(shù)放到 yag.send() 方法中,就可以實(shí)現(xiàn)群發(fā)郵件的目的了,就是這么簡單!
3.3 給郵件添加附件
在發(fā)送郵件時(shí),我們經(jīng)常需要用到附件。例如,我們上交方案給公司領(lǐng)導(dǎo)時(shí),將方案作為郵件的附件發(fā)送給領(lǐng)導(dǎo)審查,領(lǐng)導(dǎo)收到郵件后打開附件進(jìn)行預(yù)覽或下載。具體的代碼如下所示:
import yagmail
# yagmail.SMTP(user='發(fā)件人郵箱賬號(hào)', password='授權(quán)碼', host='SMTP 服務(wù)器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
contents = 'Happy New Year' # 郵件內(nèi)容
subject = '新年快樂' # 郵件主題
receivers = ['xxx@qq.com', 'xxx@126.com', 'xxx@163.com'] # 接收方們的郵箱賬號(hào)
attachments = [r'C:\Users\Desktop\設(shè)計(jì)方案一.docx', r'C:\Users\Desktop\設(shè)計(jì)方案二.docx', r'C:\users\Desktop\匯報(bào).pptx']
# yag.send(接收方,主題,內(nèi)容,附件)
yag.send(receivers, subject, contents, attachments)
yag.close()
print('發(fā)送成功')
代碼解析:
在上面的代碼中,相比之前兩個(gè)小節(jié)的代碼,我們?cè)黾恿艘粋€(gè) attachments 變量,這是一個(gè)列表類型的變量,存放著附件在我們計(jì)算機(jī)上的位置以及名稱。當(dāng)有多個(gè)附件時(shí),我們可以將多個(gè)附件的名稱統(tǒng)統(tǒng)存放到列表中。之后,使用 yag.send() 方法,可以看到 attachments 放在最后一個(gè)參數(shù)的位置。
3.4 設(shè)置定時(shí)器
下面我們?cè)龠M(jìn)階一下,對(duì)我們的郵件發(fā)送設(shè)置定時(shí)器,使得可以定時(shí)發(fā)送郵件。這里關(guān)鍵就是定時(shí)器功能的調(diào)用,需要我們安裝 schedule 模塊,這個(gè)模塊含有很多關(guān)于調(diào)度以及定時(shí)相關(guān)的方法。安裝命令如下
pip install schedule -i https://mirrors.aliyun.com/pypi/simple/
定時(shí)器和鬧鐘一樣,你可以設(shè)置 day、week、hour、mintues、second, 設(shè)定定時(shí)觸發(fā)函數(shù)執(zhí)行任務(wù)。在這里就是定時(shí)觸發(fā)函數(shù),定時(shí)發(fā)送郵件。具體代碼如下所示:
import time
import yagmail
import schedule
# yagmail.SMTP(user='發(fā)件人郵箱賬號(hào)', password='授權(quán)碼', host='SMTP 服務(wù)器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
def message():
contents = '早安朋友,新的一周開始啦!' # 郵件內(nèi)容
subject = '早安' # 郵件主題
receivers = ['xxx@qq.com', 'xxx@126.com'] # 接收方們的郵箱賬號(hào)
attachments = [r'C:\Users\\Desktop\早安.jpg', r'C:\Users\Desktop\早安.png']
yag.send(receivers, subject, contents, attachments)
print('發(fā)送成功')
# 設(shè)定時(shí)間:每周星期一早上7點(diǎn)鐘發(fā)送郵件
schedule.every().monday.at('07:00').do(message)
while True:
schedule.run_pending()
time.sleep(3)
yag.close()
代碼解析:
定義 message() 函數(shù),實(shí)現(xiàn)指定發(fā)送郵件的內(nèi)容、主題、附件、接收方。
schedule.every() 后面可以是 day、hour、week、monday、tuesday、wednesday 等等,在上面的代碼中,意思就是每周星期一早上7點(diǎn)發(fā)送郵件。例如,如果想要實(shí)現(xiàn)每隔 30 秒發(fā)送郵件,可以寫成 schedule.every().minute.at(":30").do(message)
while True 表示一個(gè)死循環(huán),因?yàn)槲覀円竺恐芤话l(fā)送郵件,所以一直處于一個(gè)監(jiān)控的狀態(tài),時(shí)間一到就執(zhí)行任務(wù)。schedule.run_pending() 表示運(yùn)行所有任務(wù)。
4. 總結(jié)
以上就是關(guān)于使用 Python 第三方庫發(fā)送電子郵件的一個(gè)入門的教程,是不是很簡單呢?如果想要實(shí)現(xiàn)更加復(fù)雜的功能,還需要到官網(wǎng)了解第三方庫的更多教程,學(xué)無止境,這只是一個(gè)入門示范的教程!
總之,Python 可以用更少的代碼做更多的事情!
到此這篇關(guān)于使用 Python 第三方庫發(fā)送電子郵件的文章就介紹到這了,更多相關(guān)使用 Python 第三方庫發(fā)送電子郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用PyTorch實(shí)現(xiàn)MNIST手寫體識(shí)別代碼
今天小編就為大家分享一篇使用PyTorch實(shí)現(xiàn)MNIST手寫體識(shí)別代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python環(huán)境下安裝PyGame和PyOpenGL的方法
這篇文章主要介紹了Python環(huán)境下安裝PyGame和PyOpenGL的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python實(shí)現(xiàn)人工蜂群算法的示例代碼
ABC,即人工蜂群算法(Artificial?Bee?Colony?Algorithm),由Karaboga等人提出,這篇文章主要介紹了人工蜂群算法的概念與Python實(shí)現(xiàn),感興趣的可以了解一下2023-08-08
Linux添加Python?path方法及修改環(huán)境變量的三種方法
這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設(shè)置環(huán)境變量有三種方法,一種用于當(dāng)前終端,一種用于當(dāng)前用戶,一種用于所有用戶,本文對(duì)每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
python爬蟲Scrapy框架:媒體管道原理學(xué)習(xí)分析
這篇文章主要介紹了python爬蟲Scrapy框架:媒體管道原理學(xué)習(xí)分析,有需要的朋友可以借鑒參考,希望可以對(duì)廣大一同學(xué)習(xí)的讀者朋友有所幫助2021-09-09
Python實(shí)現(xiàn)提取谷歌音樂搜索結(jié)果的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取谷歌音樂搜索結(jié)果的方法,涉及Python針對(duì)谷歌音樂相關(guān)信息的獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

