文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

用Python自动化管理邮件简直太方便了,三个实用小例子带你体会!

2024-12-03 11:06

关注

本文转载自微信公众号「早起Python」,作者自动化工作组。转载本文请联系早起Python公众号。   

大家好,我是早起。

在之前的文章中我们已经了解如何对自己的邮箱做一些代码操作前的基础配置,以及通过 Python 代码收发、读取邮件。本文将简单复习之前的部分重点内容,并通过 3 个小案例进一步分享一个实用技巧:将邮件写入 Excel 中

之前的文章中我们也提到,基础配置需要打开 POP3/SMTP/IMAP,针对不同邮箱有不同的操作,并以网易 163 邮箱和 QQ 邮箱 举例说明,其他邮箱设置基本类似。

如果你来不及看,至少需要了解下面几个概念

 

为了体现通用性,这次我们再换一个邮箱讲解,下面的案例均以 88 完美邮箱 为例示范,本文主要将分为下面两个部分介绍

案例一

“将邮箱里所有邮件的相关信息存到 Excel 中备份

”要解决这个需求,首先我们利用 keyring 库,通过系统密钥环将开启 IMAP/SMTP服务后获得的密码(授权码)预先在本地存储好。首先打开命令行输入python后输入:

  1. import keyring 
  2. keyring.set_password("88mail""test@88.com""password"

这样 password 在本地存储好了,后面只需要 keyring.get_password 获取作为变量即可:

  1. import keyring 
  2. password = keyring.get_password('88mail''test@88.com'

打开 88 邮箱的网页版,进一步确认是否配置是否完成,以及服务器邮箱:

 

用 imbox 读取邮件的代码如下:

  1. import keyring  
  2. from imbox import Imbox 
  3. password = keyring.get_password('88mail''test@88.com'
  4.  
  5. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  6.     # 获取全部邮件 
  7.     all_inbox_messages = imbox.messages() # 获取全部邮件 
  8.     for uid, message in all_inbox_messages: 
  9.         print(uid) # 邮件编号 
  10.         print(message.sent_from) # 发件人 
  11.         print(message.subject)  # 邮件主题 
  12.         print(message.date) # 日期 
  13.         print(message.body['plain']) # 邮件文本格式正文 
  14.         print(message.attachments) # 附件 

关于上面的代码有几个地方需要注意一下:

  1. import datetime 
  2.  
  3. date = 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)' 
  4. GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)' 
  5.  
  6. print(datetime.datetime.strptime(date, GMT_FORMAT)) 
  7. # 2020-11-03 08:08:16 

同样需要注意的是

message.body['plain'] 正文以字符串列表形式返回

message.attachments 输出结果举例如下:

  1. [{'content-type''application/x-zip-compressed''size': 1160851, 'content': <_io.BytesIO object at 0x046A7B68>, 'filename''xxxx.zip'}] 

也是一个字典列表,一个附件为一个字典,包括 content-type size content filename 4 个键,即类型、大小、内容、文件名。若无附件则返回空列表。

有了上面的知识我们就可以重新把邮件的关键信息都解析成字符串形式方便存储:

  1. import keyring  
  2. from imbox import Imbox 
  3. import datetime 
  4.  
  5. password = keyring.get_password('88mail''test@88.com'
  6.  
  7. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  8.     all_inbox_messages = imbox.messages() # 获取全部邮件 
  9.     for uid, message in all_inbox_messages: 
  10.         name = message.sent_from[0]['name'] # 发件人姓名 
  11.         email = message.sent_from[0]['email'] # 发件人邮箱 
  12.         title = message.subject 
  13.  
  14.         GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)' 
  15.         email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT)) 
  16.         email_date = email_datetime.strip()[0] # 发送日期 
  17.         email_time = email_datetime.strip()[1] # 发送时间 
  18.  
  19.         text = message.body['plain'] # 文本格式正文 
  20.         attachment_lst = [] 
  21.         attachments = '' 
  22.         if message.attachments: 
  23.             for attachment in message.attachments: 
  24.                 attachment_lst.append(attachment['filename']) 
  25.             attachments = ', '.join(attachment_lst) 
  26.         print(uid, name, email, title, email_date, email_time) 
  27.         print(text, attachments if attachments else '无'

接着利用 openpyxl 写入上述信息即可,首先在程序开头创建好表头,明确存储的信息:

  1. from openpyxl import Workbook 
  2.  
  3. workbook = Workbook() # 创建新工作簿 
  4. sheet = workbook.active 
  5. heading = ['邮件名''发件人姓名''发件人邮箱''发送日期''发送时间''邮件正文''附件'
  6. sheet.append(heading) 

后面随着邮件的遍历将内容写入表格即可。案例一的完整代码如下:

  1. import keyring 
  2. from imbox import Imbox 
  3. import datetime 
  4. from openpyxl import Workbook 
  5.  
  6. workbook = Workbook() # 创建新工作簿 
  7. sheet = workbook.active 
  8. heading = ['邮件名''发件人姓名''发件人邮箱''发送日期''发送时间''邮件正文''附件'
  9. sheet.append(heading) 
  10.  
  11. password = keyring.get_password('88mail''test@88.com'
  12.  
  13. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  14.     all_inbox_messages = imbox.messages() # 获取全部邮件 
  15.     for uid, message in all_inbox_messages: 
  16.         name = message.sent_from[0]['name'] # 发件人姓名 
  17.         email = message.sent_from[0]['email'] # 发件人邮箱 
  18.         title = message.subject 
  19.  
  20.         GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)' 
  21.         email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT)) 
  22.         email_date = email_datetime.strip()[0] # 发送日期 
  23.         email_time = email_datetime.strip()[1] # 发送时间 
  24.  
  25.         text = message.body['plain'] # 文本格式正文 
  26.         attachment_lst = [] 
  27.         attachments = '' 
  28.         if message.attachments: 
  29.             for attachment in message.attachments: 
  30.                 attachment_lst.append(attachment['filename']) 
  31.             attachments = ', '.join(attachment_lst) 
  32.         sheet.append([title, name, email, email_date, email_time, text, attachments]) 
  33.  
  34. workbook.save('xxxxx.xlsx'

案例二

“备份收件箱中所有小明(xiaoming@qq.com)发来的邮件至 Excel,然后删除这些邮件

”其实如果顺利理解了案例一,那么这个案例就特别简单了 从上面的案例中我们知道,通过下面的代码就可以获取发件人邮箱:

  1. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  2.     all_inbox_messages = imbox.messages()  
  3.     for uid, message in all_inbox_messages: 
  4.         email = message.sent_from[0]['email'] # 发件人邮箱 

那么只需要在这个基础上判断 if email == 'xiaoming@qq.com' 就可以往后执行相应代码了。另外,删除邮件是基于邮箱编号 uid 的,代码为 imbox.delete(uid) ,具体代码举例:

  1. for uid, message in all_inbox_messages:  
  2.     if 满足某种条件的邮件:  
  3.         imbox.delete(uid) 

那么,我们综合上述两个知识点以及案例一的知识延伸,就很好写出案例二的代码了:

  1. import keyring 
  2. from imbox import Imbox 
  3. import datetime 
  4. from openpyxl import Workbook 
  5.  
  6. workbook = Workbook()  
  7. sheet = workbook.active 
  8. heading = ['邮件名''发件人姓名''发件人邮箱''发送日期''发送时间''邮件正文''附件'
  9. sheet.append(heading) 
  10.  
  11. password = keyring.get_password('88mail''test@88.com'
  12.  
  13. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  14.     all_inbox_messages = imbox.messages()  
  15.     for uid, message in all_inbox_messages: 
  16.         email = message.sent_from[0]['email']  
  17.         if email == 'xiaoming@qq.com': # 在此处判断发件人 
  18.             name = message.sent_from[0]['name'
  19.             title = message.subject 
  20.             GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)' 
  21.             email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT)) 
  22.             email_date = email_datetime.strip()[0] 
  23.             email_time = email_datetime.strip()[1] 
  24.             text = message.body['plain'
  25.             attachment_lst = [] 
  26.             attachments = '' 
  27.             if message.attachments: 
  28.                 for attachment in message.attachments: 
  29.                     attachment_lst.append(attachment['filename']) 
  30.                 attachments = ', '.join(attachment_lst) 
  31.             sheet.append([title, name, email, email_date, email_time, text, attachments]) 
  32.             imbox.delete(uid) # 在此处删除符合要求的邮件  
  33.              
  34. workbook.save('xxxxx.xlsx'

案例三

“备份收件箱中含有 “奖金” 的邮件至 Excel,然后红旗标记这些邮件

”基本思路跟案例二类似,不过多展开讲,只复习两个知识点。要判断是否有“奖金”二字:

  1. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  2.     all_inbox_messages = imbox.messages()  
  3.     for uid, message in all_inbox_messages: 
  4.         title = message.subject 
  5.         if '奖金' in title: 
  6.             pass 

红旗标记邮件也删除邮件一样,也是基于邮箱编号 uid 的,具体代码举例:

  1. for uid, message in all_inbox_messages:  
  2.     if 满足某种条件的邮件:  
  3.         imbox.mark_flag(uid) 

故案例三的完整代码如下:

  1. import keyring 
  2. from imbox import Imbox 
  3. import datetime 
  4. from openpyxl import Workbook 
  5.  
  6. workbook = Workbook()  
  7. sheet = workbook.active 
  8. heading = ['邮件名''发件人姓名''发件人邮箱''发送日期''发送时间''邮件正文''附件'
  9. sheet.append(heading) 
  10.  
  11. password = keyring.get_password('88mail''test@88.com'
  12.  
  13. with Imbox('imap.88.com''test@88.com'password, ssl=Trueas imbox:  
  14.     all_inbox_messages = imbox.messages()  
  15.     for uid, message in all_inbox_messages: 
  16.         title = message.subject   
  17.         if '奖金' in title: # 判断是否含指定内容 
  18.             name = message.sent_from[0]['name'
  19.             email = message.sent_from[0]['email']  
  20.             GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)' 
  21.             email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT)) 
  22.             email_date = email_datetime.strip()[0] 
  23.             email_time = email_datetime.strip()[1] 
  24.             text = message.body['plain'
  25.             attachment_lst = [] 
  26.             attachments = '' 
  27.             if message.attachments: 
  28.                 for attachment in message.attachments: 
  29.                     attachment_lst.append(attachment['filename']) 
  30.                 attachments = ', '.join(attachment_lst) 
  31.             sheet.append([title, name, email, email_date, email_time, text, attachments]) 
  32.             imbox.mark_flag(uid) # 在此处标记符合要求的邮件  
  33.              
  34. workbook.save('xxxxx.xlsx'

以上就是通过Python实现邮件管理自动化的三个实用案例,完整代码都已经给出,感兴趣的读者可以自行尝试!

来源:早起Python内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯