使用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)的密碼哦,而是我們在 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è)接收方。下面我們再來看一下,當(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é)的代碼,我們增加了一個(gè) attachments 變量,這是一個(gè)列表類型的變量,存放著附件在我們計(jì)算機(jī)上的位置以及名稱。當(dāng)有多個(gè)附件時(shí),我們可以將多個(gè)附件的名稱統(tǒng)統(tǒng)存放到列表中。之后,使用 yag.send() 方法,可以看到 attachments 放在最后一個(gè)參數(shù)的位置。
3.4 設(shè)置定時(shí)器
下面我們再進(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas系列之DataFrame 行列數(shù)據(jù)篩選實(shí)例
下面小編就為大家分享一篇pandas系列之DataFrame 行列數(shù)據(jù)篩選實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python 之pandas庫的安裝及庫安裝方法小結(jié)
Pandas 是一種開源的、易于使用的數(shù)據(jù)結(jié)構(gòu)和Python編程語言的數(shù)據(jù)分析工具,它與 Scikit-learn 兩個(gè)模塊幾乎提供了數(shù)據(jù)科學(xué)家所需的全部工具,今天通過本文給大家介紹Python 之pandas庫的安裝及庫安裝方法小結(jié),感興趣的朋友跟隨小編一起看看吧2022-11-11Numpy對(duì)數(shù)組的操作:創(chuàng)建、變形(升降維等)、計(jì)算、取值、復(fù)制、分割、合并
這篇文章主要介紹了Numpy對(duì)數(shù)組的操作:創(chuàng)建、變形(升降維等)、計(jì)算、取值、復(fù)制、分割、合并,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python?reshape和transpose的區(qū)別小結(jié)
reshape()?和?transpose()?是用于改變數(shù)組或張量形狀的兩種不同方法,本文主要介紹了python?reshape和transpose的區(qū)別小結(jié),具有一定參考價(jià)值,感興趣的可以了解一下2024-02-02python中的iterator和"lazy?iterator"區(qū)別介紹
這篇文章主要介紹了python中的iterator和?“l(fā)azy?iterator“之間有什么區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04