当前位置: 首页 > 科技观察

用Python实现邮件自动化管理好方便,三个实例带你体验!

时间:2023-03-20 15:00:26 科技观察

本文转载自微信公众号《早期的Python》,作者自动化工作组。转载本文请联系早起Python公众号。大家好,我早起。在上一篇文章中,我们学习了如何在代码操作之前对我们的邮箱进行一些基本配置,以及如何通过Python代码发送、接收和阅读邮件。本文将简单回顾一下之前的一些重点内容,并通过3个小案例进一步分享一个实用技巧:写邮件到Excel。我们在之前的文章中也提到过,基础配置需要开启POP3/SMTP/IMAP,对于不同的邮箱有不同的操作,这里以网易163邮箱和QQ邮箱为例进行说明,其他邮箱设置基本类似。如果你没有时间阅读它,至少你需要了解以下概念。为了体现通用性,这次换个邮箱来说明吧。以下案例均以88完美邮箱为例。本文将主要分为以下两部分来介绍imbox收邮件openpyxl写Excel文件案例一《将邮箱中的所有邮件信息保存到Excel中备份》解决这个需求,首先我们使用keyring库打开密码通过系统keyring开启IMAP/SMTP服务后获得的授权码(Authorizationcode)预先存储在本地。首先打开命令行输入python输入:importkeyringkeyring.set_password("88mail","test@88.com","password")这样密码就保存在本地了,只需要获取keyring.get_password作为variablelater:importkeyringpassword=keyring.get_password('88mail','test@88.com')打开网页版88邮箱,进一步确认配置是否完成,服务器邮箱:读取邮件的代码imbox如下:importkeyringfromimboximportImboxpassword=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)#mailnumberprint(message.sent_from)#senderprint(message.subject)#mailsubjectprint(message.date)#dateprint(message.body['plain'])#Mailtextformattextprint(message.attachments)#Attachments上面的代码有几点需要注意:imbox('imap.qq.com','xxx@qq.com',password,ssl=True)这行代码需要填写服务器,用户名,邮箱,密码,SSL加密循环体中的uid参数为每一个的序号电子邮件。邮箱ID非常重要,可以用来标记和删除邮件。message.sent_from返回一个包字典List,这个字典有两个key:name和email,name是用户名(或昵称),email是发件人的邮箱message.date得到的字符串内容如'Tue,3Nov202008:08:16+0800(GMT+08:00)',一个GMT格式的时间,我们需要把它转换成一个正常的日期(年月日)+时间(时分秒),即即,GMT时间格式字符串可以通过以下代码转换为datetime类型:importdatetimedate='Tue,3Nov202008: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-0308:08:16还要注意message.body['plain']文本以字符串列表的形式返回message.attachments。输出结果如下:[{'content-type':'application/x-zip-compressed','size':1160851,'content':<_io.BytesIOobjectat0x046A7B68>,'filename':'xxxx.zip'}]也是一个字典列表,附件是一个字典,包括content-typesizecontentfilename4个key,分别是type,size,content,filename。如果没有附件,将返回一个空列表。有了以上知识,我们就可以将邮件的关键信息重新解析成字符串,方便存储:importkeyringfromimboximportImboximportdatetimepassword=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']#Senderemailtitle=message.subjectGMT_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]#senddateemail_time=email_datetime.strip()[1]#sendtimetext=message.body['plain']#textformatattachment_lst=[]attachments=''ifmessage.attachments:forattachmentinmessage.attachments:attachment_lst.append(attachment['filename'])attachments=','.join(attachment_lst)print(uid,name,email,title,email_date,email_time)print(text,attachmentsifattachmentselse'none')然后使用openpyxl要写入以上信息,首先在程序开头创建一个header,指定存储的信息:fromopenpyxlimportWorkbookworkbook=Workbook()#新建一个工作簿sheet=workbook.activeheading=['邮件名称','发件人姓名','发件人邮件地址','发送日期','发送时间','邮件正文','附件']Aftersheet.append(heading),邮件遍历时将内容写入表中案例一的完整代码如下:importkeyringfromimboximportImboximportdatetimefromopenpyxlimportWorkbookworkbook=Workbook()#新建工作簿sheet=workbook.activeheading=['邮箱名','发件人姓名','发件人邮箱','发送日期','senttime','邮件正文','附件']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']#Sendernameemail=message.sent_from[0]['email']#发件人邮件title=message.subjectGMT_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=''ifmessage.attachments:forattachmentinmessage.attachments:attachment_lst.append(attachment['filename'])attachments=','.join(attachment_lst)sheet.append([标题,姓名,电子邮件,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']#发件人的邮箱,那么只需要在此基础上判断如果email=='xiaoming@qq.com'即可执行相应的代码之后另外,删除邮件是根据邮箱号uid,代码为imbox.delete(uid),具体代码示例:foruid,messageinall_inbox_messages:如果邮件满足一定条件:imbox.delete(uid)然后,我们综合有了以上两个知识点和案例一的知识扩展,就很容易写出案例二的代码:','发送日期','发送时间','电子邮件正文','附件']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']ifemail=='xiaoming@qq.com':#这里判断发送者name=message.sent_from[0]['name']title=message.subjectGMT_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=消息。body['plain']attachment_lst=[]attachments=''ifmessage.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)#here删除workbook.save('xxxxx.xlsx')中符合要求的邮件案例3“将收件箱中标题为“bonus”的邮件备份到Excel,然后对这些邮件进行红标处理”基本思路类似Case2,但是展开更多的Speaking,只复习两个知识点判断标题是否有bonus字样:withImbox('imap.88.com','test@88.com',password,ssl=True)asimbox:all_inbox_messages=imbox.messages()foruid,messageinall_inbox_messages:title=message.subjectif'bonus'intitle:pass与删除红旗邮件一样,也是根据邮箱号uid,具体代码示例:foruid,messageinall_inbox_messages:if满足一定条件的邮件:imbox.mark_flag(uid)socase3完整代码如下:importkeyringfromimboximportImboximportdatetimefromopenpyxlimportWorkbookworkbook=Workbook()sheet=workbook.activeheading=['邮箱名','发件人姓名','发件人邮箱','发送日期','发送时间','邮件正文','附件']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.subjectif'bonus'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(消息。日期,GMT_FORMAT))email_date=email_datetime.strip()[0]email_time=email_datetime.strip()[1]text=message.body['plain']attachment_lst=[]attachments=''ifmessage.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实现邮件管理自动化的三个实际案例。完整代码已经给出,有兴趣的读者可以自行尝试!