實用小腳本,教你 Python 自動化備份郵箱
本文將進一步講解如何利用Python備份郵件,主要將涉及三種不同的形式
“”
備份郵箱全部郵件 備份指定用戶郵件 備份指定內(nèi)容郵件
之前的文章中我們也提到,基礎(chǔ)配置需要打開 POP3/SMTP/IMAP,針對不同郵箱有不同的操作,并以網(wǎng)易 163 郵箱和 QQ 郵箱 舉例說明,其他郵箱設(shè)置基本類似。詳情可以查看我之前的Python辦公自動化系列文章。
如果你來不及看,至少需要了解下面幾個概念
為了體現(xiàn)通用性,這次我們再換一個郵箱講解,下面的案例均以 88 完美郵箱 為例示范,本文主要將分為下面兩個部分介紹
imbox收取郵件openpyxl寫入 Excel 文件
01
自動備份全部郵件至Excel
首先來看一個最通用的,將郵箱中的全部郵件備份至本地。
要解決這個需求,首先我們利用 keyring 庫,通過系統(tǒng)密鑰環(huán)將開啟 IMAP/SMTP服務(wù)后獲得的密碼(授權(quán)碼)預(yù)先在本地存儲好。首先打開命令行輸入python后輸入:
import keyring
keyring.set_password("88mail", "[email protected]", "password")
這樣 password 在本地存儲好了,后面只需要 keyring.get_password 獲取作為變量即可:
import keyring
password = keyring.get_password('88mail', '[email protected]')
打開 88 郵箱的網(wǎng)頁版,進一步確認是否配置是否完成,以及服務(wù)器郵箱:

用 imbox 讀取郵件的代碼如下:
import keyring
from imbox import Imbox
password = keyring.get_password('88mail', '[email protected]')
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
# 獲取全部郵件
all_inbox_messages = imbox.messages() # 獲取全部郵件
for uid, message in all_inbox_messages:
print(uid) # 郵件編號
print(message.sent_from) # 發(fā)件人
print(message.subject) # 郵件主題
print(message.date) # 日期
print(message.body['plain']) # 郵件文本格式正文
print(message.attachments) # 附件
關(guān)于上面的代碼有幾個地方需要注意一下:
Imbox('imap.qq.com', '[email protected]', password, ssl=True)這行代碼中需要填寫服務(wù)器、用戶名郵箱、密碼、SSL加密循環(huán)體中 uid參數(shù)是每封郵件的編號,郵件編號十分重要,可以用于郵件的標(biāo)記和刪除message.sent_from返回一個包裹字典的列表,這個字典有兩個鍵:name和email,name即用戶名(或昵稱),email是發(fā)件人的郵箱message.date獲取的字符串內(nèi)容如 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)' ,一個 GMT 格式的時間,我們需要將它轉(zhuǎn)化為正常的日期(年月日)+時間(時分秒),也就是將 GMT 時間格式的字符串轉(zhuǎn)換成datetime 類型,可以通過下面的代碼:
import datetime
date = 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)'
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
print(datetime.datetime.strptime(date, GMT_FORMAT))
# 2020-11-03 08:08:16
同樣需要注意的是
message.body['plain']正文以字符串列表形式返回message.attachments輸出結(jié)果舉例如下:
[{'content-type': 'application/x-zip-compressed', 'size': 1160851, 'content': <_io.BytesIO object at 0x046A7B68>, 'filename': 'xxxx.zip'}]
也是一個字典列表,一個附件為一個字典,包括 content-type size content filename 4 個鍵,即類型、大小、內(nèi)容、文件名。若無附件則返回空列表。
有了上面的知識我們就可以重新把郵件的關(guān)鍵信息都解析成字符串形式方便存儲:
import keyring
from imbox import Imbox
import datetime
password = keyring.get_password('88mail', '[email protected]')
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages() # 獲取全部郵件
for uid, message in all_inbox_messages:
name = message.sent_from[0]['name'] # 發(fā)件人姓名
email = message.sent_from[0]['email'] # 發(fā)件人郵箱
title = message.subject
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
email_date = email_datetime.strip()[0] # 發(fā)送日期
email_time = email_datetime.strip()[1] # 發(fā)送時間
text = message.body['plain'] # 文本格式正文
attachment_lst = []
attachments = ''
if message.attachments:
for attachment in message.attachments:
attachment_lst.append(attachment['filename'])
attachments = ', '.join(attachment_lst)
print(uid, name, email, title, email_date, email_time)
print(text, attachments if attachments else '無')
接著利用 openpyxl 寫入上述信息即可,首先在程序開頭創(chuàng)建好表頭,明確存儲的信息:
from openpyxl import Workbook
workbook = Workbook() # 創(chuàng)建新工作簿
sheet = workbook.active
heading = ['郵件名', '發(fā)件人姓名', '發(fā)件人郵箱', '發(fā)送日期', '發(fā)送時間', '郵件正文', '附件']
sheet.append(heading)
后面隨著郵件的遍歷將內(nèi)容寫入表格即可。案例一的完整代碼如下:
import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook
workbook = Workbook() # 創(chuàng)建新工作簿
sheet = workbook.active
heading = ['郵件名', '發(fā)件人姓名', '發(fā)件人郵箱', '發(fā)送日期', '發(fā)送時間', '郵件正文', '附件']
sheet.append(heading)
password = keyring.get_password('88mail', '[email protected]')
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages() # 獲取全部郵件
for uid, message in all_inbox_messages:
name = message.sent_from[0]['name'] # 發(fā)件人姓名
email = message.sent_from[0]['email'] # 發(fā)件人郵箱
title = message.subject
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
email_date = email_datetime.strip()[0] # 發(fā)送日期
email_time = email_datetime.strip()[1] # 發(fā)送時間
text = message.body['plain'] # 文本格式正文
attachment_lst = []
attachments = ''
if message.attachments:
for attachment in message.attachments:
attachment_lst.append(attachment['filename'])
attachments = ', '.join(attachment_lst)
sheet.append([title, name, email, email_date, email_time, text, attachments])
workbook.save('xxxxx.xlsx')
02
備份指定用戶郵件至本地
現(xiàn)在來看進階一點的需求,備份指定用戶的郵件,比如
“備份收件箱中所有小明(
”[email protected])發(fā)來的郵件至 Excel,然后刪除這些郵件
其實如果順利理解了案例一,那么這個案例就特別簡單了 從上面的案例中我們知道,通過下面的代碼就可以獲取發(fā)件人郵箱:
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages()
for uid, message in all_inbox_messages:
email = message.sent_from[0]['email'] # 發(fā)件人郵箱
那么只需要在這個基礎(chǔ)上判斷 if email == '[email protected]' 就可以往后執(zhí)行相應(yīng)代碼了。另外,刪除郵件是基于郵箱編號 uid 的,代碼為 imbox.delete(uid) ,具體代碼舉例:
for uid, message in all_inbox_messages:
if 滿足某種條件的郵件:
imbox.delete(uid)
那么,我們綜合上述兩個知識點以及案例一的知識延伸,就很好寫出案例二的代碼了:
import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
heading = ['郵件名', '發(fā)件人姓名', '發(fā)件人郵箱', '發(fā)送日期', '發(fā)送時間', '郵件正文', '附件']
sheet.append(heading)
password = keyring.get_password('88mail', '[email protected]')
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages()
for uid, message in all_inbox_messages:
email = message.sent_from[0]['email']
if email == '[email protected]': # 在此處判斷發(fā)件人
name = message.sent_from[0]['name']
title = message.subject
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
email_date = email_datetime.strip()[0]
email_time = email_datetime.strip()[1]
text = message.body['plain']
attachment_lst = []
attachments = ''
if message.attachments:
for attachment in message.attachments:
attachment_lst.append(attachment['filename'])
attachments = ', '.join(attachment_lst)
sheet.append([title, name, email, email_date, email_time, text, attachments])
imbox.delete(uid) # 在此處刪除符合要求的郵件
workbook.save('xxxxx.xlsx')
03
備份指定內(nèi)容郵件
上一個需求是備份指定用戶的郵件,現(xiàn)在也可以備份包含指定內(nèi)容的郵件,例如
“備份收件箱中標(biāo)題含有 “獎金” 的郵件至 Excel,然后紅旗標(biāo)記這些郵件
”
基本思路跟案例二類似,不過多展開講,只復(fù)習(xí)兩個知識點。要判斷標(biāo)題是否有“獎金”二字:
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages()
for uid, message in all_inbox_messages:
title = message.subject
if '獎金' in title:
pass
紅旗標(biāo)記郵件也刪除郵件一樣,也是基于郵箱編號 uid 的,具體代碼舉例:
for uid, message in all_inbox_messages:
if 滿足某種條件的郵件:
imbox.mark_flag(uid)
故案例三的完整代碼如下:
import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
heading = ['郵件名', '發(fā)件人姓名', '發(fā)件人郵箱', '發(fā)送日期', '發(fā)送時間', '郵件正文', '附件']
sheet.append(heading)
password = keyring.get_password('88mail', '[email protected]')
with Imbox('imap.88.com', '[email protected]', password, ssl=True) as imbox:
all_inbox_messages = imbox.messages()
for uid, message in all_inbox_messages:
title = message.subject
if '獎金' in title: # 判斷標(biāo)題是否含指定內(nèi)容
name = message.sent_from[0]['name']
email = message.sent_from[0]['email']
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
email_date = email_datetime.strip()[0]
email_time = email_datetime.strip()[1]
text = message.body['plain']
attachment_lst = []
attachments = ''
if message.attachments:
for attachment in message.attachments:
attachment_lst.append(attachment['filename'])
attachments = ', '.join(attachment_lst)
sheet.append([title, name, email, email_date, email_time, text, attachments])
imbox.mark_flag(uid) # 在此處標(biāo)記符合要求的郵件
workbook.save('xxxxx.xlsx')
以上就是通過Python實現(xiàn)郵件管理自動化的三個實用案例,完整代碼都已經(jīng)給出,感興趣的讀者可以自行嘗試!
PS:公號內(nèi)回復(fù)「Python」即可進入Python 新手學(xué)習(xí)交流群,一起 100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
