用Python自动化管理邮件太方便了,三个实用例子带你体会
off999 2024-10-01 13:57 50 浏览 0 评论
来源:早起Python
作者:自动化工作组
大家好,我是早起。
在之前的文章中我们已经了解如何对自己的邮箱做一些代码操作前的基础配置,以及通过 Python 代码收发、读取邮件。本文将简单复习之前的部分重点内容,并通过 3 个小案例进一步分享一个实用技巧:将邮件写入 Excel 中。
之前的文章中我们也提到,基础配置需要打开 POP3/SMTP/IMAP,针对不同邮箱有不同的操作,并以网易 163 邮箱和 QQ 邮箱 举例说明,其他邮箱设置基本类似。详情可以查看我之前的Python办公自动化系列文章。
如果你来不及看,至少需要了解下面几个概念
为了体现通用性,这次我们再换一个邮箱讲解,下面的案例均以 88 完美邮箱 为例示范,本文主要将分为下面两个部分介绍
imbox 收取邮件
openpyxl 写入 Excel 文件
1.案例一
“将邮箱里所有邮件的相关信息存到 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')
2.案例二
“备份收件箱中所有小明(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')
3.案例三
“备份收件箱中标题含有 “奖金” 的邮件至 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实现邮件管理自动化的三个实用案例,完整代码都已经给出,感兴趣的读者可以自行尝试!
相关推荐
- winxp系统版本(winxp 版本)
-
1、微软官方3个版本:WINDOWSXPHOME(家庭版)、Professional(专业版)、MediaCenter2005(媒体中心版),每个版本的功能不一样。使用最多的是Professional...
- 打印机无法共享怎么回事(打印机无法共享出去)
-
共享打印机无法打印原因一:可能是由于病毒死机解决方法:确定是否由于病毒死机,找一张干净(确信无病毒)的系统盘,从A驱动舒上启动电脑,检查此时打印机和主机能否联机。如果正常联机,估计这种故障是由攻击硬件...
- ipv6无网络访问权限怎么解决
-
ipv6无网络访问权限解决方法如下1、点击电脑左下角的开始,进入到开始的菜单栏,在菜单栏中找到“运行”。或者通过快捷键Windows+R打开运行窗口。 2、打开运行的窗口页面后,在页面上输入“CMD...
- office ltsc版(Office LTSC版本区别)
-
office2021和2021ltsc的区别如下:1.更新策略不同。前者采用每个月月度更新的方法,提供功能更新、安全更新。后者不采用每个月月度更新的方法,且不提供功能更新。2.界面不同。2021采用了...
- 安装win7需要激活吗(现在安装win7旗舰版还需密钥吗)
-
要激活 Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...
- originos 3升级计划公布(originos升级包)
-
2023年2月。1.OriginOS3.0系统第一批升级时间为11月25日。2、包含iQOONeo7,X80系列,S15系列,iQOO9、iQOO10系列,以及折叠屏XFold系列和大屏XNo...
- 鸿蒙系统适配第三方机型(鸿蒙 第三方适配)
-
最新华为官方公布了鸿蒙系统3.0支持的机型名单,具体如下。鸿蒙系统3.0升级名单:1.Mate系列:MateXs2、MateX2、MateXs、Mate40、Mate40Pro、Mate...
- imei怎么下载(imei changer apk)
-
如果您的steam序列号激活了,可以尝试以下方法下载:1.使用steam自带的下载工具,如“下载工具”,在软件的“下载”选项卡中选择“序列号下载”。2.在下载页面中,选择要下载的游戏,然后点击“下...
- 电脑系统优化软件哪个好(系统优化软件排行榜)
-
有必要用,非常好用,WINDOWS优化大师是一个网络上下载率极高的系统维护软件。多年未曾清理过系统和硬盘的电脑,系统内部将产生大量的垃圾文件、临时文件、废旧程序等等win10系统不需要经常更新,关闭...
- 重装系统后硬盘不见了(重装系统后磁盘不见了)
-
硬盘不见可能是因为重装系统时未正确安装驱动程序或未对硬件进行正确设置。你可以按以下步骤排查问题:进入BIOS检查硬盘是否被识别,尝试重新连接数据线和电源线,更新或安装适当的硬件驱动程序,或者使用硬件故...
- 冰封u盘装win7系统教程图解(冰封u盘启动装机教程)
-
1.查找激活工具:通常来说,Win7冰封系统已经包含了必要的驱动,所以如果你的电脑上并没有出现设备错误,那你就可以正常使用。如果你需要添加任何驱动,请尝试从厂商下载相应的驱动并执行自动安装程序。如果...
- uefi模式下找不到硬盘(uefi引导找不到硬盘)
-
首先你的安装盘必须是从UEFI启动的,然后它才能安装为UEFI启动。(条件:Fat32文件系统,efi文件夹)其次你MBR+BIOS的系统想换成GPT+EFI的,分区得做一点改动,腾出来100M的空...
- win7怎么安装蓝牙驱动程序(win7电脑安装蓝牙驱动教程)
-
方法如下: 1、再开始里点击控制版面,点击【硬件和声音】找到【添加设备】 2、之后再选择你要添加的蓝牙耳机。 3、系统就会提示正在与蓝牙适配器连接,然后提示添加成功。 4、点击“开始”-“...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
