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

本文介绍了使用Python自动收邮件并管理的三个实用案例,包括将邮件信息存入Excel、备份特定发件人邮件并删除、标记含有特定关键词的邮件。通过imbox库收邮件,openpyxl库写入Excel,结合关键概念如IMAP、SMTP,展示了自动化邮件管理的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

d65a2252ae4b9437650198e7b46be70c.png

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

大家好,我是早起。

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

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

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

0c11f30e0bfdc19bec1f9f4c45309558.png

为了体现通用性,这次我们再换一个邮箱讲解,下面的案例均以 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 邮箱的网页版,进一步确认是否配置是否完成,以及服务器邮箱:

84cc80a5baa08a60675abd34b888f995.png

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

import keyring

fromimbox import Imbox

password= keyring.get_password('88mail','test@88.com')

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

# 获取全部邮件

all_inbox_messages = imbox.messages() # 获取全部邮件

foruid, messageinall_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>,'filename':'xxxx.zip'}]

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

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

import keyring

fromimbox import Imbox

import datetime

password= keyring.get_password('88mail','test@88.com')

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages() # 获取全部邮件

foruid, messageinall_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:

forattachmentinmessage.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 写入上述信息即可,首先在程序开头创建好表头,明确存储的信息:

fromopenpyxl import Workbook

workbook = Workbook() # 创建新工作簿

sheet = workbook.active

heading = ['邮件名','发件人姓名','发件人邮箱','发送日期','发送时间','邮件正文','附件']

sheet.append(heading)

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

import keyring

fromimbox import Imbox

import datetime

fromopenpyxl import Workbook

workbook = Workbook() # 创建新工作簿

sheet = workbook.active

heading = ['邮件名','发件人姓名','发件人邮箱','发送日期','发送时间','邮件正文','附件']

sheet.append(heading)

password= keyring.get_password('88mail','test@88.com')

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages() # 获取全部邮件

foruid, messageinall_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:

forattachmentinmessage.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,然后删除这些邮件

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

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages()

foruid, messageinall_inbox_messages:

email = message.sent_from[0]['email'] # 发件人邮箱

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

foruid, messageinall_inbox_messages:

if 满足某种条件的邮件:

imbox.delete(uid)

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

import keyring

fromimbox import Imbox

import datetime

fromopenpyxl import Workbook

workbook = Workbook()

sheet = workbook.active

heading = ['邮件名','发件人姓名','发件人邮箱','发送日期','发送时间','邮件正文','附件']

sheet.append(heading)

password= keyring.get_password('88mail','test@88.com')

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages()

foruid, messageinall_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:

forattachmentinmessage.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,然后红旗标记这些邮件

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

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages()

foruid, messageinall_inbox_messages:

title = message.subject

if '奖金'intitle:

pass

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

foruid, messageinall_inbox_messages:

if 满足某种条件的邮件:

imbox.mark_flag(uid)

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

import keyring

fromimbox import Imbox

import datetime

fromopenpyxl import Workbook

workbook = Workbook()

sheet = workbook.active

heading = ['邮件名','发件人姓名','发件人邮箱','发送日期','发送时间','邮件正文','附件']

sheet.append(heading)

password= keyring.get_password('88mail','test@88.com')

withImbox('imap.88.com','test@88.com',password, ssl=True)asimbox:

all_inbox_messages = imbox.messages()

foruid, messageinall_inbox_messages:

title = message.subject

if '奖金'intitle: # 判断标题是否含指定内容

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:

forattachmentinmessage.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实现邮件管理自动化的三个实用案例,完整代码都已经给出,感兴趣的读者可以自行尝试!

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值