Python實(shí)戰(zhàn)之自動(dòng)發(fā)送郵件的實(shí)現(xiàn)
自動(dòng)發(fā)送郵件能應(yīng)用于許多場(chǎng)景,比如我想要知道股票策略中的股票池是否有實(shí)時(shí)的更新,這時(shí)候如果再拉一遍數(shù)據(jù),跑一遍腳本,實(shí)在是太浪費(fèi)時(shí)間了。為什么不把這一套流程放到服務(wù)器上,然后到點(diǎn)自動(dòng)運(yùn)行并發(fā)送郵件呢?
類(lèi)似的應(yīng)用場(chǎng)景還有很多,不僅僅是在股票策略提醒上,比如定時(shí)向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實(shí)時(shí)發(fā)送郵件提醒;網(wǎng)站負(fù)載過(guò)高,發(fā)送郵件提醒......等等。
下面就來(lái)講講怎么用Python構(gòu)建一個(gè)自動(dòng)發(fā)送郵件的腳本。
1.開(kāi)啟SMTP服務(wù)
為了實(shí)現(xiàn)自動(dòng)發(fā)送郵件的目的,我們需要在郵箱中開(kāi)啟SMTP服務(wù):
這點(diǎn)很關(guān)鍵,別忘了去開(kāi)啟SMTP,否則郵件是無(wú)法發(fā)送成功的。然后你還需要點(diǎn)擊下面生成授權(quán)碼,這個(gè)授權(quán)碼才是使用Python發(fā)送郵件時(shí)的真正密碼。
郵箱設(shè)定成功后,就可以開(kāi)始腳本開(kāi)發(fā)了。
2.準(zhǔn)備
開(kāi)始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。
(可選1) 如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda,它內(nèi)置了Python和pip.
(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn)
請(qǐng)選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
2. MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip?install?yagmail
看到 Successfully installed xxx 則說(shuō)明安裝成功。本文全部源代碼可在后臺(tái)回復(fù):自動(dòng)發(fā)送郵件 獲得。
3.編寫(xiě)腳本
今天需要用到的模塊是yagmail,一個(gè)非常方便的Python郵件發(fā)送模塊,用這個(gè)模塊,你甚至能一行命令發(fā)送郵件:
yag = yagmail.SMTP( ????host='smtp.qq.com', user='你的郵箱', ????password='你的鑒權(quán)碼', smtp_ssl=True ).send(["發(fā)送對(duì)象"],?"主題",?"內(nèi)容")
為了讓這個(gè)發(fā)送郵件的方法更加具備可用性,我們將其封裝到一個(gè)類(lèi)中:
import?time import?yagmail class?Mail: ????""" ????郵件相關(guān)類(lèi) ????""" ????def?sendmail(self, msg, title, receivers): ????????""" ????????發(fā)送郵件 ???????? ????????Arguments: ????????????msg {str} -- 郵件正文 ????????????title {str} -- 郵件標(biāo)題 ????????????receivers {list} -- 郵件接收者,數(shù)組 ????????""" ????????yag = yagmail.SMTP( ????????????host='smtp.qq.com', user='你的郵箱', ????????????password='你的鑒權(quán)碼', smtp_ssl=True ????????) ????????try: ????????????yag.send(receivers, title, msg) ????????????print("郵件發(fā)送成功") ????????except?BaseException?as?e: ????????????print(e) ????????????print("Error: 無(wú)法發(fā)送郵件")
這個(gè)類(lèi)里還可以封裝很多其他東西,比如log函數(shù),用于顯示時(shí)間:
import?time import?yagmail class?Mail: ????""" ????郵件相關(guān)類(lèi) ????""" ????def?log(self, content): ????????now_time = time.strftime( ????????????"%Y-%m-%d %H:%M:%S", time.localtime() ????????) ????????print(f'{now_time}:?{content}')
這樣,需要顯示時(shí)間的時(shí)候只需要調(diào)用self.log即可,優(yōu)化后的完整代碼如下:
import?time import?yagmail class?Mail: ????""" ????郵件相關(guān)類(lèi) ????""" ????def?log(self, content): ????????now_time = time.strftime( ????????????"%Y-%m-%d %H:%M:%S", time.localtime() ????????) ????????print(f'{now_time}:?{content}') ????def?sendmail(self, msg, title, receivers): ????????""" ????????發(fā)送郵件 ???????? ????????Arguments: ????????????msg {str} -- 郵件正文 ????????????title {str} -- 郵件標(biāo)題 ????????????receivers {list} -- 郵件接收者,數(shù)組 ????????""" ????????yag = yagmail.SMTP( ????????????host='smtp.qq.com', user='你的郵箱', ????????????password='你的鑒權(quán)碼', smtp_ssl=True ????????) ????????try: ????????????yag.send(receivers, title, msg) ????????????self.log("郵件發(fā)送成功") ????????except?BaseException?as?e: ????????????print?(e) ????????????self.log("Error: 無(wú)法發(fā)送郵件")
發(fā)送成功時(shí)顯示:
# PS D:\CODE\stock\api> python .\sendmail_yagmail.py 2021-06-21 00:00:00: 郵件發(fā)送成功
4.小例子
將剛剛編寫(xiě)完的類(lèi)保存為sendmail.py,接下來(lái)就可以嘗試一個(gè)小例子。我們用一個(gè)自動(dòng)監(jiān)控網(wǎng)站是否宕機(jī)的小腳本做示例:
import?time import?requests from?sendmail?import?Mail while?True: ????response = requests.get('https://pythondict.com') ????# 根據(jù)狀態(tài)碼判斷網(wǎng)站是否正常 ????if?response.status_code !=?200: ????????Mail().sendmail( ????????????'哥, pythondict掛了',?'Python實(shí)用寶典網(wǎng)站異常監(jiān)控', ['你的郵箱'] ????????) ????time.sleep(600)
通過(guò) requests.get 請(qǐng)求網(wǎng)站,使用 response.status_code 得到狀態(tài)碼,200 為正常,其他情況均為異常。這個(gè)檢測(cè)每十分鐘運(yùn)行一次,因此 time.sleep(600) .
就這樣,我們構(gòu)建起了一個(gè)非常簡(jiǎn)單的網(wǎng)站異常監(jiān)控腳本,如果你真的要在服務(wù)器上運(yùn)行這個(gè)腳本,請(qǐng)記得使用 nohup 讓其在后臺(tái)運(yùn)行:
nohup python test.py &
到此這篇關(guān)于Python實(shí)戰(zhàn)之自動(dòng)發(fā)送郵件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python自動(dòng)發(fā)送郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)Python3+gdal 讀取tiff格式數(shù)據(jù)的實(shí)例講解
今天小編就為大家分享一篇對(duì)Python3+gdal 讀取tiff格式數(shù)據(jù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python在回調(diào)函數(shù)中獲取返回值的方法
今天小編就為大家分享一篇python在回調(diào)函數(shù)中獲取返回值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02如何利用?Python?繪制動(dòng)態(tài)可視化圖表
這篇文章主要介紹了如何利用?Python?繪制動(dòng)態(tài)可視化圖表,主要介紹介紹如何進(jìn)行保存gif格式的文件。那么我們就開(kāi)始進(jìn)入主題,來(lái)談一下Python當(dāng)中的gif模塊,需要的朋友可以參考一下2022-02-02pyinstaller打包單文件時(shí)--uac-admin選項(xiàng)不起作用怎么辦
這篇文章主要介紹了pyinstaller打包單文件時(shí)--uac-admin選項(xiàng)不起作用怎么辦,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04解決pycharm不能自動(dòng)保存在遠(yuǎn)程linux中的問(wèn)題
這篇文章主要介紹了解決pycharm不能自動(dòng)保存在遠(yuǎn)程linux中的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層
這篇文章主要介紹了Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06