自動發送郵件能應用于許多場景,比如我想要知道股票策略中的股票池是否有實時的更新,這時候如果再拉一遍數據,跑一遍腳本,實在是太浪費時間了。為什么不把這一套流程放到服務器上,然后到點自動運行并發送郵件呢?
類似的應用場景還有很多,不僅僅是在股票策略提醒上,比如定時向某些人發送郵件;網站宕機了,實時發送郵件提醒;網站負載過高,發送郵件提醒......等等。
下面就來講講怎么用Python構建一個自動發送郵件的腳本。
1.開啟SMTP服務
為了實現自動發送郵件的目的,我們需要在郵箱中開啟SMTP服務:
這點很關鍵,別忘了去開啟SMTP,否則郵件是無法發送成功的。然后你還需要點擊下面生成授權碼,這個授權碼才是使用Python發送郵件時的真正密碼。
郵箱設定成功后,就可以開始腳本開發了。
2.準備
開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。
(可選1) 如果你用Python的目的是數據分析,可以直接安裝Anaconda:Python數據分析與挖掘好幫手—Anaconda,它內置了Python和pip.
(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優點:Python 編程的最好搭檔—VSCode 詳細指南。
請選擇以下任一種方式輸入命令安裝依賴 :
- Windows 環境 打開 Cmd (開始-運行-CMD)。
- MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
- 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install yagmail
看到 Successfully installed xxx 則說明安裝成功。本文全部源代碼可在后臺回復:自動發送郵件 獲得。
3.編寫腳本
今天需要用到的模塊是yagmail,一個非常方便的Python郵件發送模塊,用這個模塊,你甚至能一行命令發送郵件:
yag = yagmail.SMTP(
host='smtp.qq.com', user='你的郵箱',
password='你的鑒權碼', smtp_ssl=True
).send(["發送對象"], "主題", "內容")
為了讓這個發送郵件的方法更加具備可用性,我們將其封裝到一個類中:
import time
import yagmail
class Mail:
"""
郵件相關類
"""
def sendmail(self, msg, title, receivers):
"""
發送郵件
Arguments:
msg {str} -- 郵件正文
title {str} -- 郵件標題
receivers {list} -- 郵件接收者,數組
"""
yag = yagmail.SMTP(
host='smtp.qq.com', user='你的郵箱',
password='你的鑒權碼', smtp_ssl=True
)
try:
yag.send(receivers, title, msg)
print("郵件發送成功")
except BaseException as e:
print(e)
print("Error: 無法發送郵件")
這個類里還可以封裝很多其他東西,比如log函數,用于顯示時間:
import time
import yagmail
class Mail:
"""
郵件相關類
"""
def log(self, content):
now_time = time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime()
)
print(f'{now_time}: {content}')
這樣,需要顯示時間的時候只需要調用self.log即可,優化后的完整代碼如下:
import time
import yagmail
class Mail:
"""
郵件相關類
"""
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):
"""
發送郵件
Arguments:
msg {str} -- 郵件正文
title {str} -- 郵件標題
receivers {list} -- 郵件接收者,數組
"""
yag = yagmail.SMTP(
host='smtp.qq.com', user='你的郵箱',
password='你的鑒權碼', smtp_ssl=True
)
try:
yag.send(receivers, title, msg)
self.log("郵件發送成功")
except BaseException as e:
print (e)
self.log("Error: 無法發送郵件")
發送成功時顯示:
# PS D:CODEstockapi > python .sendmail_yagmail.py
2021-06-21 00:00:00: 郵件發送成功
4.小例子
將剛剛編寫完的類保存為sendmail.py,接下來就可以嘗試一個小例子。我們用一個自動監控網站是否宕機的小腳本做示例:
import time
import requests
from sendmail import Mail
while True:
response = requests.get('https://pythondict.com')
# 根據狀態碼判斷網站是否正常
if response.status_code != 200:
Mail().sendmail(
'哥, pythondict掛了', 'Python實用寶典網站異常監控', ['你的郵箱']
)
time.sleep(600)
通過** requests.get
請求網站,使用response.status_code
**得到狀態碼,200 為正常,其他情況均為異常。這個檢測每十分鐘運行一次,因此 time.sleep(600)
.
就這樣,我們構建起了一個非常簡單的網站異常監控腳本,如果你真的要在服務器上運行這個腳本,請記得使用** nohup
**讓其在后臺運行:
nohup python test.py &
-
服務器
+關注
關注
12文章
9308瀏覽量
86071 -
郵件
+關注
關注
0文章
32瀏覽量
18823 -
python
+關注
關注
56文章
4807瀏覽量
85040 -
腳本
+關注
關注
1文章
392瀏覽量
14938
發布評論請先 登錄
相關推薦
評論