<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)用小腳本,教你 Python 自動(dòng)化備份郵箱

          共 15910字,需瀏覽 32分鐘

           ·

          2021-04-21 21:49

          ↑↑↑關(guān)注后"星標(biāo)"簡(jiǎn)說Python

          人人都可以簡(jiǎn)單入門Python、爬蟲、數(shù)據(jù)分析
           簡(jiǎn)說Python推薦 
          來源:早起Python
          作者:自動(dòng)化工作組

          大家好,我是老表。

          在之前的文章中我們已經(jīng)了解如何對(duì)自己的郵箱做一些代碼操作前的基礎(chǔ)配置,以及通過 Python 代碼收發(fā)、讀取郵件。本文將進(jìn)一步講解如何利用Python備份郵件,主要將涉及三種不同的形式

          • 備份郵箱全部郵件
          • 備份指定用戶郵件
          • 備份指定內(nèi)容郵件

          之前的文章中我們也提到,基礎(chǔ)配置需要打開 POP3/SMTP/IMAP,針對(duì)不同郵箱有不同的操作。

          為了體現(xiàn)通用性,這次我們?cè)贀Q一個(gè)郵箱講解,下面的案例均以 88 完美郵箱 為例示范,本文主要將分為下面兩個(gè)部分介紹

          • imbox 收取郵件
          • openpyxl 寫入 Excel 文件


          01

          自動(dòng)備份全部郵件至Excel



          首先來看一個(gè)最通用的,將郵箱中的全部郵件備份至本地。

          要解決這個(gè)需求,首先我們利用 keyring 庫,通過系統(tǒng)密鑰環(huán)將開啟 IMAP/SMTP服務(wù)后獲得的密碼(授權(quán)碼)預(yù)先在本地存儲(chǔ)好。首先打開命令行輸入python后輸入:

          import keyring
          keyring.set_password("88mail", "[email protected]", "password")

          這樣 password 在本地存儲(chǔ)好了,后面只需要 keyring.get_password 獲取作為變量即可:

          import keyring
          password = keyring.get_password('88mail''[email protected]')

          打開 88 郵箱的網(wǎng)頁版,進(jìn)一步確認(rèn)是否配置是否完成,以及服務(wù)器郵箱:

          imbox 讀取郵件的代碼如下:

          import keyring 
          from imbox import Imbox
          password = keyring.get_password('88mail''[email protected]')

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas imbox: 
              # 獲取全部郵件
              all_inbox_messages = imbox.messages() # 獲取全部郵件
              for uid, message in all_inbox_messages:
                  print(uid) # 郵件編號(hào)
                  print(message.sent_from) # 發(fā)件人
                  print(message.subject)  # 郵件主題
                  print(message.date) # 日期
                  print(message.body['plain']) # 郵件文本格式正文
                  print(message.attachments) # 附件

          關(guān)于上面的代碼有幾個(gè)地方需要注意一下:

          • Imbox('imap.qq.com', '[email protected]', password, ssl=True) 這行代碼中需要填寫服務(wù)器、用戶名郵箱、密碼、SSL加密
          • 循環(huán)體中 uid 參數(shù)是每封郵件的編號(hào),郵件編號(hào)十分重要,可以用于郵件的標(biāo)記和刪除
          • message.sent_from 返回一個(gè)包裹字典的列表,這個(gè)字典有兩個(gè)鍵:nameemail,name 即用戶名(或昵稱),email 是發(fā)件人的郵箱
          • message.date 獲取的字符串內(nèi)容如 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)' ,一個(gè) GMT 格式的時(shí)間,我們需要將它轉(zhuǎn)化為正常的日期(年月日)+時(shí)間(時(shí)分秒),也就是將 GMT 時(shí)間格式的字符串轉(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

          同樣需要注意的是

          1. message.body['plain'] 正文以字符串列表形式返回
          2. message.attachments 輸出結(jié)果舉例如下:
          [{'content-type''application/x-zip-compressed''size'1160851'content': <_io.BytesIO object at 0x046A7B68>, 'filename''xxxx.zip'}]

          也是一個(gè)字典列表,一個(gè)附件為一個(gè)字典,包括 content-type size content filename 4 個(gè)鍵,即類型、大小、內(nèi)容、文件名。若無附件則返回空列表。

          有了上面的知識(shí)我們就可以重新把郵件的關(guān)鍵信息都解析成字符串形式方便存儲(chǔ):

          import keyring 
          from imbox import Imbox
          import datetime

          password = keyring.get_password('88mail''[email protected]')

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas 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ā)送時(shí)間

                  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)建好表頭,明確存儲(chǔ)的信息:

          from openpyxl import Workbook

          workbook = Workbook() # 創(chuàng)建新工作簿
          sheet = workbook.active
          heading = ['郵件名''發(fā)件人姓名''發(fā)件人郵箱''發(fā)送日期''發(fā)送時(shí)間''郵件正文''附件']
          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ā)送時(shí)間''郵件正文''附件']
          sheet.append(heading)

          password = keyring.get_password('88mail''[email protected]')

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas 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ā)送時(shí)間

                  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)在來看進(jìn)階一點(diǎn)的需求,備份指定用戶的郵件,比如

          備份收件箱中所有小明([email protected])發(fā)來的郵件至 Excel,然后刪除這些郵件

          其實(shí)如果順利理解了案例一,那么這個(gè)案例就特別簡(jiǎn)單了 從上面的案例中我們知道,通過下面的代碼就可以獲取發(fā)件人郵箱:

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas imbox: 
              all_inbox_messages = imbox.messages() 
              for uid, message in all_inbox_messages:
                  email = message.sent_from[0]['email'# 發(fā)件人郵箱

          那么只需要在這個(gè)基礎(chǔ)上判斷 if email == '[email protected]' 就可以往后執(zhí)行相應(yīng)代碼了。另外,刪除郵件是基于郵箱編號(hào) uid 的,代碼為 imbox.delete(uid) ,具體代碼舉例:

          for uid, message in all_inbox_messages: 
              if 滿足某種條件的郵件: 
                  imbox.delete(uid)

          那么,我們綜合上述兩個(gè)知識(shí)點(diǎn)以及案例一的知識(shí)延伸,就很好寫出案例二的代碼了:

          import keyring
          from imbox import Imbox
          import datetime
          from openpyxl import Workbook

          workbook = Workbook() 
          sheet = workbook.active
          heading = ['郵件名''發(fā)件人姓名''發(fā)件人郵箱''發(fā)送日期''發(fā)送時(shí)間''郵件正文''附件']
          sheet.append(heading)

          password = keyring.get_password('88mail''[email protected]')

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas 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)容郵件



          上一個(gè)需求是備份指定用戶的郵件,現(xiàn)在也可以備份包含指定內(nèi)容的郵件,例如

          備份收件箱中標(biāo)題含有 “獎(jiǎng)金” 的郵件至 Excel,然后紅旗標(biāo)記這些郵件

          基本思路跟案例二類似,不過多展開講,只復(fù)習(xí)兩個(gè)知識(shí)點(diǎn)。要判斷標(biāo)題是否有“獎(jiǎng)金”二字:

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas imbox: 
              all_inbox_messages = imbox.messages() 
              for uid, message in all_inbox_messages:
                  title = message.subject
                  if '獎(jiǎng)金' in title:
                      pass

          紅旗標(biāo)記郵件也刪除郵件一樣,也是基于郵箱編號(hà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ā)送時(shí)間''郵件正文''附件']
          sheet.append(heading)

          password = keyring.get_password('88mail''[email protected]')

          with Imbox('imap.88.com''[email protected]', password, ssl=Trueas imbox: 
              all_inbox_messages = imbox.messages() 
              for uid, message in all_inbox_messages:
                  title = message.subject  
                  if '獎(jiǎng)金' 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實(shí)現(xiàn)郵件管理自動(dòng)化的三個(gè)實(shí)用案例,完整代碼都已經(jīng)給出,感興趣的讀者可以自行嘗試!

          最后給大家分享《100本Python電子書》,包括Python編程技巧、數(shù)據(jù)分析、爬蟲、Web開發(fā)、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)。
          現(xiàn)在免費(fèi)分享出來,有需要的讀者可以下載學(xué)習(xí),在下面的公眾號(hào)「程序員獅子里回復(fù)關(guān)鍵字Python,就行。
          -END-

          文末推薦一本《Python數(shù)據(jù)分析全流程指南》主要圍繞整個(gè)數(shù)據(jù)分析方法論的常規(guī)流程,介紹了Python常用的工具包,包括科學(xué)計(jì)算庫Numpy、數(shù)據(jù)分析庫Pandas、數(shù)據(jù)挖掘庫Scikit-Learn,以及數(shù)據(jù)可視化庫Matplotlib和Seaborn的基本知識(shí),并從數(shù)據(jù)分析挖掘的實(shí)際業(yè)務(wù)應(yīng)用出發(fā),講解了互聯(lián)網(wǎng)、金融及零售等行業(yè)的真實(shí)案例,比如客戶分群、產(chǎn)品精準(zhǔn)營銷、房?jī)r(jià)預(yù)測(cè)、特征降維等,深入淺出、循序漸進(jìn)地介紹了Python數(shù)據(jù)分析的全過程。


          掃碼查看我朋友圈

          獲取最新學(xué)習(xí)資源


          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了

          點(diǎn)贊”傳統(tǒng)美德不能丟 

          瀏覽 125
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩乱伦影片 | h片免费网站 | a√在线看 | 日本精品黄色视频 | 啪啪综合 |