查看原文
其他

邮箱附件太多?Python帮你批量下载!

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:赵一帆,中南财经政法大学金融学院

本文编辑:刘光中

技术总编:王玉婷


Stata and Python 数据分析

     由李春涛教授团队成员司海涛薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!爬虫俱乐部特此为大家准备了100本,即日起购买爬虫俱乐部课程,可赠送本书一本,先到先得!


购书链接:


爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

导读

有时我们会使用邮箱批量收集一些文件,如果自己一封一封手动下载的话,操作麻烦且耗时较长。这时我们可以使用Python程序来帮助我们进行批量下载某个时间段的邮箱附件,方便快捷。下面我们一起来看看Python是如何实现邮件附件的批量下载吧~


一、开启邮箱的pop协议

POP3是接收邮件服务器,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。

首先,我们点击进入QQ邮箱首页,点击进入设置,如下图所示。本文以QQ邮箱为例,介绍使用Python批量下载邮件附件的方法,163邮箱和新浪邮箱也是类似的操作,不再赘述。

然后,在邮箱设置中我们可以找到POP3服务的设置,在设置前小编的POP3/SMTP服务显示的是已关闭,这里需要点击开启POP3服务。

通过手机验证后,会自动生成一个自己邮箱的授权码。此处的授权码就是程序登录访问QQ邮箱的密码,我们可以自行截图保存好,用于后续的程序。
二、登录邮箱并设置邮件储存路径

收取邮件主要分为两步:第一步用poplib模块把邮件的原始文本下载到本地;第二步:用email模块将原始邮件解析为Message对象,并把内容展示给用户。这里需要简单介绍一下poplib模块的用法:

poplib.POP3(host,port,timeout):连接pop3服务器POP3.user(username):发送用户名进行验证POP3.pass_(password):发送密码进行验证POP3.list([which]):返回邮件数量和每个邮件的大小POP3.retr(which):收取邮件POP3.quit():退出与pop3服务器的连接

首先,我们连接到POP3服务器,QQ邮箱的pop3地址是pop.qq.com。之后使用server作为poplib.pop3对象,进行邮箱的身份验证,大家需要将usernamepassword分别修改为自己的邮箱名称和授权码。我们使用程序成功登录邮箱后,可以获取到邮件的简要信息和编号。

#导入第三方库import poplibpoplib._MAXLINE=20480import emailimport timeimport osfrom email.parser import Parserfrom email.header import decode_header# 连接到POP3服务器host = "pop.qq.com"server = poplib.POP3(host)# 身份验证username = "ABC@qq.com" #需要自己的邮箱名称password = "AABBCCDD" #邮箱自动生成的授权码start_date = '20220801'end_date = '20220930'# 设置批量下载邮件储存路径mail_att_dir = r'E:\att_file'mail_pdf_dir = os.path.join(mail_att_dir, end_date+'pdf_file')mail_word_dir = os.path.join(mail_att_dir, end_date+'word_file')#登录邮箱server.user(username)server.pass_(password) # 参数是邮箱授权码resp, mails, octets = server.list() #返回所有邮件的编号print(mails)  #所有邮件简要信息
三、解析邮件内容

通过POP3协议收取到的是邮件的原始文本。要想把POP3收取的文本变成可阅读的邮件,还需要用email模块来解析原始文本,变成可阅读的邮件对象。email模块是一个用于管理电子邮件信息的库,该模块的主要组件包含parser模块,parser把接受电子邮件消息的序列化版本并将转换为Message对象。email模块主要包含有以下文档:

email.message:表示电子邮件的信息email.parser:解析电子邮件信息email.header:自定义表头信息

首先我们自行定义一个名称为decode_str的解码函数,因为邮件的Subject或者Email中包含的名字都是经过编码后的字符串格式,要正常显示需要使用解码函数。接着我们倒序遍历邮件,即从收到最新一封邮件开始到最后一封邮件,使用email.parser模块解析邮件内容为Message对象,之后下载邮箱附件到存储的文件夹里。

具体代码如下:

def decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return value
# 倒序遍历邮件index = len(mails)for i in range(index, 0, -1): resp, lines, octets = server.retr(i) # 邮件的原始文本: msg_content = b'\r\n'.join(lines).decode('utf-8','ignore') # 解析邮件: msg = Parser().parsestr(msg_content) # 获取邮件日期 date = time.strptime(msg.get('Date')[:24], '%a, %d %b %Y %H:%M:%S') date = time.strftime('%Y%m%d', date) # 只下载发送日期在2022年8月1日到9月30日之间的邮件附件 if date < start_date : break if date > end_date : continue # 下载附件 attachment_files = [] for part in msg.walk(): file_name = part.get_filename() # 获取附件名称类型 contType = part.get_content_type() if file_name: h = email.header.Header(file_name) dh = email.header.decode_header(h) # 对附件名称进行解码 print(dh) filename = dh[0][0] if dh[0][1]: filename = decode_str(str(filename, dh[0][1])) # 将附件名称可读化 print(filename) data = part.get_payload(decode=True) # 下载附件 # 创建附件存储文件夹 if not os.path.isdir(mail_att_dir ): os.mkdir(mail_att_dir ) # 在指定目录下创建文件,注意二进制文件需要用wb模式打开 att_file = open(mail_att_dir + os.sep + filename, 'wb') attachment_files.append(filename) att_file.write(data) # 保存附件 att_file.close()server.quit()print('下载完成,去文件夹看看吧!')

运行全部程序,程序运行成功,结果如下:

打开我们的存储路径,我们可以看到这些文件已经成功下载了:

以上就是使用Python程序批量下载QQ邮箱附件的全部步骤了,小伙伴们可以动手试试呀!

(END)重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐       正则表达式之多次匹配

        爬虫君为你的数据自由操碎了心!cnborder重磅推出!

      基于Python的假设检验实现      Stata与MySQL交互--基础操作           Jupyter Notebook中的魔术命令     《Stata正则表达式》由中国金融出版社出版发行          匿名函数lambda到底怎么用?

Stata绘图系列—NBER Working paper仿图

       Camelot:从PDF中提取表格数据      Stata之计算财务指标——融资约束

      列表生成式|让你的代码更简洁

Stata绘图系列——玩转绘图通用选项之坐标轴

       玩转地图的好帮手--pyecharts

       爬虫俱乐部又又又输送了一位研究助理!!!      【数据分析】一文教你玩转DataFrame

 震惊,爬虫俱乐部竟是这样运营答疑群的?!

【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新

带你玩转Stata编码一言不合就teamviewer

【基础篇】循环语句的continue与break  

     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可

以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存