百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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

off999 2024-10-01 13:57 56 浏览 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

同样需要注意的是

  1. message.body['plain'] 正文以字符串列表形式返回
  2. 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实现邮件管理自动化的三个实用案例,完整代码都已经给出,感兴趣的读者可以自行尝试!

相关推荐

笔记本电脑系统修复软件(笔记本电脑程序修复)

1、超级兔子2013系统修复软件超级兔子是一款完整的系统维护工具。拥有电脑系统评测、垃圾清理和注册表清理、可疑文件和插件检测、网页防护等功能,同时自带一些实用的系统工具,可清理你大多数的文件、注册表里...

联想保修服务包括哪些(联想保修都保修什么)

1、保修36个月的硬件包括:CPU、内存。2、保修24个月的硬件包括:主板、显卡、LCD屏、硬盘、电源适配器、键盘、鼠标模块。3、保修12个月的硬件包括:LCD之附件、光驱、DVD、CDR/W、软驱...

系统科学大会(中国系统科学学会)

2021年各种科学大会的召开时间取决于疫情的发展和国家政策的调整。一些大型的国际科学会议可能会推迟或者采用线上形式进行,以保障参会人员的安全和健康。同时,一些国内的学术会议也会受到疫情的影响,需要推迟...

win10系统下载的内容在哪(win10下载的软件在哪个文件夹)

进入C:\Windows\SoftwareDistribution\Download目录下,通过win10应用商店中下载的安装包都放在此目录下。进入C:\Windows\SoftwareDistrib...

下载原版xp系统光盘(xp光盘系统安装教程怎么安装)

方法步骤步骤如下:1、首先打开计算机,在电脑光驱上放入XP光盘,启动电脑后不停按F12、F11、Esc等启动热键,在弹出的启动菜单中选择DVD选项,回车。2、进入光盘主菜单,按数字2或点击选项2运行w...

windows7中文版下载安装(windows7安装包下载)

谢邀,如果你戳设置-时间和语言-区域和语言,右边的语言提示“只允许使用一种语言包”,那么你的系统就是家庭中文版。家庭中文版限定系统界面只能使用简体中文显示,其他功能则与普通家庭版没有区别,也可以使用其...

win7开机按f2怎么重装系统(win7开机按f12怎么重装系统)

开机或重启时,在进入Windows前按F2进入BIOS。  ←→移动到第三个好像是BOOT。  然后将EXTENELBOOT选项设置为ENABLE  最后按F5将第一启动项目设置为EXTENEL...

win10驱动管理(win10驱动程序)
win10驱动管理(win10驱动程序)

win10由于联网后会自动安装驱动,如果自动安装驱动没出现问题,即可视为最佳驱动,若出现问题,卸载出问题的驱动,然后去查自己主板型号,在主板供应商官网下载对应驱动即是最佳01Windows10驱动更新调整当前当你插入连接即插即用(Pn...

2025-12-29 05:51 off999

手机上怎么找qq邮箱登录(用手机怎么找到qq邮箱)

入口是“联系人”选项卡。qq邮箱手机在QQ主菜单中选择下方的“联系人”选项卡;3、在“联系人”中选取“公众号”选项卡;4、在公众号中菜单中找到或搜索“QQ邮箱提醒”,点击进入;5、点击“进入邮箱”;6...

amd显卡控制面板

AMD显卡控制面板是用来管理你的AMD显卡的,可以在控制面板中进行设置一些简单的调整,来提升显卡性能和效果。1、先打开AMD控制面板。2、打开“垂直同步(V-SYNC)”功能,可调整细节,改善影像流畅...

win10老是未响应卡死(window10总是未响应)

具体方法:1、如果win10中的应用程序出现不响应的情况,应该是应用程序加载失败了。可以通过重置方法来解决win10应用程序无响应。2、登录win10系统,用管理员身份运行Powershell(可在C...

usb安装系统步骤(USB安装系统步骤)

1.准备一张U盘,将联想官网下载的系统镜像文件复制到U盘中;2.将U盘插入联想S41U电脑,重启电脑,按F12进入BIOS设置,将U盘设置为启动项;3.重启电脑,进入U盘安装界面,按提示操作,完成系统...

win98安装教程(win98iso怎么安装)

如何安装windows98  一、具体安装步骤  备份好重要文件之后,就可以安装windows98了。  第一步:启动安装程序。  用户如果原来已安装了windows95/97/98,现在拟对其进行升...

雨林木风win7安装(雨林木风win732位安装教程)

  安装步骤如下:  1、光盘放入光驱,复制光盘上的win7.gho和安装系统.exe到硬盘非C盘的文件夹;(gho文件名可以是其他名字,后缀为gho,体积最大的就是。)  2、双击安装系统.exe;...

win10解绑管理员账户(win10管理员账户怎么取消开机密码)

要解除Windows10电脑上的管理员权限,您需要进行以下操作:1.打开“控制面板”:右键单击“开始”按钮,然后选择“控制面板”。2.进入“用户账户”:在控制面板中,选择“用户账户”。3.点击...

取消回复欢迎 发表评论: