您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用Python自動化管理郵件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Python自動化管理郵件”吧!
如果你來不及看,至少需要了解下面幾個概念
為了體現通用性,這次我們再換一個郵箱講解,下面的案例均以 88 完美郵箱 為例示范,本文主要將分為下面兩個部分介紹
imbox 收取郵件
openpyxl 寫入 Excel 文件
案例一
“將郵箱里所有郵件的相關信息存到 Excel 中備份
”要解決這個需求,首先我們利用 keyring 庫,通過系統密鑰環將開啟 IMAP/SMTP服務后獲得的密碼(授權碼)預先在本地存儲好。首先打開命令行輸入python后輸入:
import keyring keyring.set_password("88mail", "test@88.com", "password")
這樣 password 在本地存儲好了,后面只需要 keyring.get_password 獲取作為變量即可:
import keyring password = keyring.get_password('88mail', 'test@88.com')
打開 88 郵箱的網頁版,進一步確認是否配置是否完成,以及服務器郵箱:
用 imbox 讀取郵件的代碼如下:
import keyring from imbox import Imbox password = keyring.get_password('88mail', 'test@88.com') with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: # 獲取全部郵件 all_inbox_messages = imbox.messages() # 獲取全部郵件 for uid, message in all_inbox_messages: print(uid) # 郵件編號 print(message.sent_from) # 發件人 print(message.subject) # 郵件主題 print(message.date) # 日期 print(message.body['plain']) # 郵件文本格式正文 print(message.attachments) # 附件
關于上面的代碼有幾個地方需要注意一下:
Imbox('imap.qq.com', 'xxx@qq.com', password, ssl=True) 這行代碼中需要填寫服務器、用戶名郵箱、密碼、SSL加密
循環體中 uid 參數是每封郵件的編號,郵件編號十分重要,可以用于郵件的標記和刪除
message.sent_from 返回一個包裹字典的列表,這個字典有兩個鍵:name 和 email,name 即用戶名(或昵稱),email 是發件人的郵箱
message.date 獲取的字符串內容如 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)' ,一個 GMT 格式的時間,我們需要將它轉化為正常的日期(年月日)+時間(時分秒),也就是將 GMT 時間格式的字符串轉換成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 輸出結果舉例如下:
[{'content-type': 'application/x-zip-compressed', 'size': 1160851, 'content': <_io.BytesIO object at 0x046A7B68>, 'filename': 'xxxx.zip'}]
也是一個字典列表,一個附件為一個字典,包括 content-type size content filename 4 個鍵,即類型、大小、內容、文件名。若無附件則返回空列表。
有了上面的知識我們就可以重新把郵件的關鍵信息都解析成字符串形式方便存儲:
import keyring from imbox import Imbox import datetime password = keyring.get_password('88mail', 'test@88.com') with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: all_inbox_messages = imbox.messages() # 獲取全部郵件 for uid, message in all_inbox_messages: name = message.sent_from[0]['name'] # 發件人姓名 email = message.sent_from[0]['email'] # 發件人郵箱 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) print(uid, name, email, title, email_date, email_time) print(text, attachments if attachments else '無')
接著利用 openpyxl 寫入上述信息即可,首先在程序開頭創建好表頭,明確存儲的信息:
from openpyxl import Workbook workbook = Workbook() # 創建新工作簿 sheet = workbook.active heading = ['郵件名', '發件人姓名', '發件人郵箱', '發送日期', '發送時間', '郵件正文', '附件'] sheet.append(heading)
后面隨著郵件的遍歷將內容寫入表格即可。案例一的完整代碼如下:
import keyring from imbox import Imbox import datetime from openpyxl import Workbook workbook = Workbook() # 創建新工作簿 sheet = workbook.active heading = ['郵件名', '發件人姓名', '發件人郵箱', '發送日期', '發送時間', '郵件正文', '附件'] sheet.append(heading) password = keyring.get_password('88mail', 'test@88.com') with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: all_inbox_messages = imbox.messages() # 獲取全部郵件 for uid, message in all_inbox_messages: name = message.sent_from[0]['name'] # 發件人姓名 email = message.sent_from[0]['email'] # 發件人郵箱 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]) workbook.save('xxxxx.xlsx')
案例二
“備份收件箱中所有小明(xiaoming@qq.com)發來的郵件至 Excel,然后刪除這些郵件
”其實如果順利理解了案例一,那么這個案例就特別簡單了 從上面的案例中我們知道,通過下面的代碼就可以獲取發件人郵箱:
with Imbox('imap.88.com', 'test@88.com', 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 == 'xiaoming@qq.com' 就可以往后執行相應代碼了。另外,刪除郵件是基于郵箱編號 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 = ['郵件名', '發件人姓名', '發件人郵箱', '發送日期', '發送時間', '郵件正文', '附件'] sheet.append(heading) password = keyring.get_password('88mail', 'test@88.com') with Imbox('imap.88.com', 'test@88.com', 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 == 'xiaoming@qq.com': # 在此處判斷發件人 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')
案例三
“備份收件箱中標題含有 “獎金” 的郵件至 Excel,然后紅旗標記這些郵件
”基本思路跟案例二類似,不過多展開講,只復習兩個知識點。要判斷標題是否有“獎金”二字:
with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: all_inbox_messages = imbox.messages() for uid, message in all_inbox_messages: title = message.subject if '獎金' in title: pass
紅旗標記郵件也刪除郵件一樣,也是基于郵箱編號 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 = ['郵件名', '發件人姓名', '發件人郵箱', '發送日期', '發送時間', '郵件正文', '附件'] sheet.append(heading) password = keyring.get_password('88mail', 'test@88.com') with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: all_inbox_messages = imbox.messages() for uid, message in all_inbox_messages: title = message.subject if '獎金' in title: # 判斷標題是否含指定內容 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) # 在此處標記符合要求的郵件 workbook.save('xxxxx.xlsx')
到此,相信大家對“怎么用Python自動化管理郵件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。