一、相關(guān)庫介紹
1)yagmail
- Yet Another GMAIL/SMTP client;
- 非常方便的SMTP包,超簡(jiǎn)單的Python發(fā)郵件模塊;
- 需要單獨(dú)安裝,不包含在Python標(biāo)準(zhǔn)模塊里;
- yagmail官網(wǎng)鏈接
2)keyring
- 從Python訪問系統(tǒng)密鑰環(huán)服務(wù)(即密碼不用直接寫在代碼里);
- 方便、安全地儲(chǔ)存你的密碼;
- 需要單獨(dú)安裝,不包含在Python標(biāo)準(zhǔn)模塊里;
- keyring官網(wǎng)鏈接
3)schedule
- 超容易理解的定時(shí)任務(wù)執(zhí)行器;
- 需要單獨(dú)安裝,不包含在Python標(biāo)準(zhǔn)模塊里;
- schedule官網(wǎng)鏈接
4)imbox
- 簡(jiǎn)易的Python IMAP包;
- 進(jìn)行IMAP相關(guān)的操作;
- 需要單獨(dú)安裝,不包含在Python標(biāo)準(zhǔn)模塊里;
- imbox官網(wǎng)鏈接
5)上述庫安裝
pip install yagmail keyring schedule imbox
二、利用python發(fā)送郵件
1)郵件相關(guān)基礎(chǔ)知識(shí)
- POP3:Post Office Protocol3的簡(jiǎn)稱,即郵局協(xié)議的第3個(gè)版本,它規(guī)定怎樣將個(gè)人計(jì)算機(jī)連接到Internet的郵件服務(wù)器和下載電子郵件的電子協(xié)議。
- SMTP:Simple Mail Transfer Protocol,即簡(jiǎn)單郵件傳輸協(xié)議。
- IMAP:Internet Mail Access Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似郵件訪問標(biāo)準(zhǔn)協(xié)議之一。
- 注意:寫代碼發(fā)郵件時(shí)一定要注意不能頻繁發(fā)送!容易被當(dāng)做垃圾郵件被屏蔽??!
2)python發(fā)送郵件流程(以“QQ郵箱”為例,進(jìn)行說明)
① 注冊(cè)一個(gè)QQ郵箱,開通POP3/SMTP/IMAP
點(diǎn)擊設(shè)置--》賬戶--》開啟如下服務(wù)

注意:開啟過程中,需要發(fā)送短信驗(yàn)證,此時(shí)會(huì)出現(xiàn)一個(gè)第三方密碼,這個(gè)第三方密碼在使用第三方軟件登陸的時(shí)候,用該密碼代替你的扣扣登陸密碼。

② 找到SMTP和IMAP服務(wù)器的地址

③ 發(fā)送郵件之前,先使用yagmail存儲(chǔ)你的郵件地址和密碼

注意:這兩行代碼,是用于存儲(chǔ)你的郵件地址和密碼,當(dāng)你執(zhí)行這行代碼后。你后面發(fā)送郵件的時(shí)候,就只需要顯示給出你賬號(hào)即可,而不用再把密碼顯示出來。
④ 發(fā)送第一封測(cè)試郵件
import yagmail
# 這里的user填寫的是你的扣扣郵箱賬號(hào),可以看出這里并沒有寫我們的“密碼”
yag = yagmail.SMTP(user="××××××××××@qq.com",host="smtp.qq.com")
contents = ["這是第一段正文內(nèi)容","這是第二段正文內(nèi)容"]
# 這里填寫的是你要發(fā)送的人的扣扣郵箱
yag.send("××××××××××@qq.com","這是一封郵件",contents)
"""
特別備注一下:
這里可以看到,我們發(fā)送郵件的時(shí)候,此時(shí)就沒有顯示給出密碼了。
這樣做相對(duì)來說較為安全,這就是yagmail庫的好處。
"""
結(jié)果如下:

⑤ 發(fā)送帶HTML樣式的郵件
import yagmail
yag = yagmail.SMTP(user="××××××××××@qq.com",host="smtp.qq.com")
contents = [
'這是第一段正文內(nèi)容',
'這是第二段正文內(nèi)容',
'百度網(wǎng)站'
]
yag.send("××××××××××@qq.com","這是一封郵件",contents)
結(jié)果如下:

⑥ 發(fā)送帶附件的郵件
import yagmail
yag = yagmail.SMTP(user="××××××××××@qq.com",host="smtp.qq.com")
contents = [
'這是第一段正文內(nèi)容',
'這是第二段正文內(nèi)容',
'百度網(wǎng)站',
'G:\\6Tipdm\\7python辦公自動(dòng)化\\我創(chuàng)建的壓縮包.zip'
]
yag.send("××××××××××@qq.com","這是一封郵件",contents)
結(jié)果如下:

⑦ 發(fā)送帶嵌入圖片的郵件
import yagmail
yag = yagmail.SMTP(user="××××××××××@qq.com",host="smtp.qq.com")
contents = [
'親愛的××老婆',
'我愛你',
yagmail.inline('G:\\6Tipdm\\7python辦公自動(dòng)化\\老婆.png')
]
yag.send("××××××××××@qq.com","這是一封郵件",contents)
⑧ 群發(fā)郵件
import yagmail
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com")
contents = [
'這是第一段正文內(nèi)容',
'這是第二段正文內(nèi)容',
'百度網(wǎng)站',
'G:\\6Tipdm\\7python辦公自動(dòng)化\\我創(chuàng)建的壓縮包.zip']
# 定義一個(gè)收件人列表
shoujian_ren = [
"×1×@qq.com",
"×2×@qq.com",
"×3×@qq.com"
]
yag.send(shoujian_ren,"這是一封郵件",contents)
⑨ 定時(shí)發(fā)送郵件
利用這個(gè)功能,你可以定時(shí)給你女朋友發(fā)送郵件,表達(dá)你的關(guān)心,以免自給由于工作忙,而忽略了自己的女朋友。
import timeimport schedule
import yagmail
import datetime
def morning():
content = ["親愛的,記得吃早飯哦!"]
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com")
yag.send("1127421544@qq.com","這是一封郵件",content)
def afternoon():
content = ["親愛的,記得吃中飯哦!"]
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com")
yag.send("1127421544@qq.com","這是一封郵件",content)
def evering():
content = ["親愛的,記得吃晚飯哦!"]
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com")
yag.send("1127421544@qq.com","這是一封郵件",content)
schedule.every().day.at("07:30").do(morning)
schedule.every().day.at("11:30").do(afternoon)
schedule.every().day.at("17:30").do(evering)
while True:
# 當(dāng)代碼完成了這一天的任務(wù)以后,自動(dòng)結(jié)束任務(wù)
if datetime.datetime.now().strftime("%H:%M") == "17:31":
break
schedule.run_pending()
time.sleep(1)
"""
# 每十分鐘,執(zhí)行一次任務(wù)
schedule.every(10).minutes.do(job)
# 每小時(shí),執(zhí)行一次任務(wù)
schedule.every().hour.do(job)
# 每天上午十點(diǎn)半,執(zhí)行一次任務(wù)
schedule.every().day.at("10:30").do(job)
# 每5-10鐘,執(zhí)行一次任務(wù)
schedule.every(5).to(10).minutes.do(job)
# 每周一,執(zhí)行一次任務(wù)
schedule.every().monday.do(job)
# 每周三下午一點(diǎn)十五分,執(zhí)行一次任務(wù)
schedule.every().wednesday.at("13:15").do(job)
# 每分鐘的第十七秒,執(zhí)行一次任務(wù)
schedule.every().minute.at(":17").do(job)
"""
三、利用python讀取郵件

代碼如下:
from imbox import Imbox
import keyring
# "1127421544@qq.com"是你的郵箱賬號(hào)
pwd = keyring.get_password("yagmail", "1127421544@qq.com")
# "imap.qq.com"是你的IMAP郵箱服務(wù)器地址
with Imbox("imap.qq.com","1127421544@qq.com",pwd,ssl=True) as imbox:
all_inbox_messages = imbox.messages()
for uid, message in all_inbox_messages:
print(message.subject)
print(message.body["plain"])
如何讀取未讀郵件,只需要添加一個(gè)參數(shù):

如果只想看紅旗標(biāo)記的郵件,應(yīng)該怎么辦:

如果只想看來自某個(gè)人的郵件,應(yīng)該怎么做:

如何按照日期篩選郵件:

設(shè)置標(biāo)記已讀和刪除郵件:
