使用第三方庫 yagmail
更新: 第三種方式的隱藏用戶名和密碼的方式,目前不再支持
簡單介紹
目標是盡可能簡單,無痛地發(fā)送電子郵件锌钮。
最終的代碼如下:
import yagmail
yag = yagmail.SMTP()
contents = ['This is the body, and here is just text http://somedomain/image.png',
'You can find an audio file attached.', '/local/path/song.mp3']
yag.send('to@someone.com', '郵件標題', contents)
或者在一行中實現(xiàn):
yagmail.SMTP('mygmailusername').send('to@someone.com', 'subject', 'This is the body')
當然, 以上操作需要從你自己系統(tǒng)的密鑰環(huán)中讀取你的郵箱賬戶和對應的密碼。關于密鑰環(huán)稍后會提到如何實現(xiàn)。
安裝模塊
pip3 install yagmail # linux / Mac
pip install yagmail # windows
這樣會安裝最新的版本模叙,并且會支持所有最新功能,主要是支持從密鑰環(huán)中獲取到郵箱的賬戶和密碼鞋屈。
關于賬戶和密碼
開通自己郵箱的 SMTP
功能范咨,并獲取到授權碼
這個賬戶是你要使用此郵箱發(fā)送郵件的賬戶,密碼不是平時登錄郵箱的密碼厂庇,而是開通 POP3/SMTP
功能后設置的客戶端授權密碼渠啊。
這里以 126
郵箱為例:
方式一:不使用系統(tǒng)的密鑰環(huán)
不使用系統(tǒng)的密鑰環(huán),可以直接暴露賬戶和密碼在腳本里
import yagmail
yag = yagmail.SMTP(
user='自己的賬號',
password='賬號的授權碼',
host='smtp.qq.com', # 郵局的 smtp 地址
port='端口號', # 郵局的 smtp 端口
smtp_ssl=False)
yag.send(to='收件箱賬號',
subject='郵件主題',
contents='郵件內(nèi)容')
方式二: 使用系統(tǒng)的密鑰環(huán)管理賬戶和授權碼
模塊支持從當前系統(tǒng)環(huán)境中的密鑰環(huán)中獲取賬戶和密碼宋列,要想實現(xiàn)這個功能昭抒,需要依賴模塊 keyring
。之后把賬戶和密碼注冊到系統(tǒng)的密鑰環(huán)中即可實現(xiàn)炼杖。
1. 安裝依賴模塊
pip3 install keyring
# CentOS7.3 還需要安裝下面的模塊
pip3 install keyrings.alt
2. 開始向密鑰環(huán)注冊
import yagmail
yagmail.register('你的賬號', '你的授權密碼')
注冊賬戶和密碼灭返,只需要執(zhí)行一次即可。
3. 發(fā)送郵件
import yagmail
yag = yagmail.SMTP('自己的賬號',
host='smtp.qq.com', # 郵局的 smtp 地址
port='端口號', # 郵局的 smtp 端口
smtp_ssl=False # 不使用加密傳輸
)
yag.send(
to='收件箱賬號',
subject='郵件主題',
contents='郵件內(nèi)容')
示例展示
下面是以我的 126 郵箱為例, 使用系統(tǒng)密鑰環(huán)的方式坤邪,向我的 163郵箱發(fā)送了一封郵件熙含。
import yagmail
yag = yagmail.SMTP(user='shark@126.com',
host='smtp.126.com',
port=25,
smtp_ssl=False)
yag.send(to='docker@163.com',
subject='from shark',
contents='test')
這樣就愉快的發(fā)送了一封測試郵件到 docker@163.com
的郵箱。
當然前提是:
- 126 郵箱開通了
SMTP
功能艇纺。 - 把 126 郵箱的賬號和密碼已經(jīng)注冊到自己系統(tǒng)的密鑰環(huán)中怎静。
發(fā)送附件
發(fā)送
發(fā)送附件只需要給 send
方法傳遞 attachments
關鍵字參數(shù)
比如我在系統(tǒng)的某一個目錄下有一張圖片,需要發(fā)送給 docker@163.com
import yagmail
yag = yagmail.SMTP(user='shark@126.com',
host='smtp.126.com',
port=25,
smtp_ssl=False)
yag.send(to='docker@163.com',
subject='from shark',
contents='test',
attachments='./松鼠.jpeg')
收到的郵件和附件
使用 ssl
發(fā)送加密郵件
要發(fā)送加密郵件黔衡,只需要把 smtp_ssl
關鍵字參數(shù)去掉即可蚓聘,因為默認就是采用的加密方式 smtp_ssl=True
。
不傳遞 stmp_ssl
關鍵字參數(shù)的同時盟劫,需要設置端口為郵箱服務提供商的加密端口夜牡,這里還是以 126 郵箱為例,端口是 465
侣签。
import yagmail
yag = yagmail.SMTP(user='shark@126.com',
host='smtp.126.com',
port=465)
yag.send(to='docker@163.com',
subject='from sharkyunops',
contents='test',
attachments='./松鼠.jpeg')
發(fā)送 帶 html 標記語言的郵件內(nèi)容
在實際的生產(chǎn)環(huán)境中塘装,經(jīng)常會發(fā)送郵件溝通相關事宜,往往會有表格之類的內(nèi)容影所,但是又不想以附件的形式發(fā)送蹦肴,就可以利用 html 標記語言的方式組織數(shù)據(jù)。
import yagmail
yag = yagmail.SMTP(user='shark@126.com',
host='smtp.126.com',
port=465)
html="""<table border="1">
<thead>
<tr>
<th>姓名</th>
<th>年齡</th>
</tr>
</thead>
<tbody>
<tr>
<td>shak</td>
<td>18</td>
</tr>
<tr>
<td>西瓜甜</td>
<td>28</td>
</tr>
</tbody>
</table>
"""
yag.send(to='docker@163.com',
subject='from sharkyunops',
contents=['test',html])
更多
如果不指定to
參數(shù)猴娩,則發(fā)送給自己
如果to
參數(shù)是一個列表阴幌,則將該郵件發(fā)送給列表中的所有用戶
attachments
參數(shù)的值可以是列表勺阐,表示發(fā)送多個附件