一、前言
对于编程来说,我期望的是并不仅仅用于make money,而是出于生活,融于生活。
最近炒股,每天都会有一封邮件发到我的qq邮箱,里面有今天账户的结算信息,感觉这个挺有意义的,可以记录每天的交易情况和相关费用,但是我又不想每天去下载这个附件。于是乎花了一个晚上研究了一下python的poplib库,完成了一个拉取qq邮箱附件的程序。
二、实现 2.1 poplib是什么?
poplib是一个python的一个模块,用于专门的处理邮箱的邮件,是基于pop3的协议。 使用的话用import poplib就可以了。 2.2 代码说明
想要解析邮件分为几个步骤:
第一步:创建链接
pop_conn = poplib.pop3_ssl(self.host) pop_conn.set_debuglevel(self.debugmode) pop_conn.user(self.user) pop_conn.pass_(self.pass_) 1234
使用poplib库创建一个ssl的链接,然后分别设置这个connect的几个参数,分别是: – debugmode:0为关闭,1为开启。如果开启的话,会显示交互时的日志。 – username :邮箱的账号 – password :邮箱的密码 – host : 对应的邮箱的pop3协议的host,qq邮箱是pop.qq.com
注:这里有个坑爹的东西,如果直接用qq密码用作password的话,会提示这个报错 poplib.error_proto: -err please using authorized code to login.
跟着这个链接进去看,是因为qq出于安全的考虑,使用pop协议的时候,需要使用一个16位的密保来进行操作。按照链接里面的提示设置好了密码,再填入就可以使用了。
第二步:获取邮件
几个主要的api:
pop_conn.stat() pop_conn.list() pop_conn.retr()123
stat()用于获取邮件的状态,例如:有46封邮件
messages: 46. size: 3819672
list()用于获取邮件的列表状态:
(‘ ok’, [‘1 196394’, ‘2 35328’, ‘3 195761’, ‘4 19024’, ‘5 63952’, ‘6 196662’, ‘7 45720’, ‘8 197030’, ‘9 15565’, ‘10 36985’, ‘11 2550’, ‘12 31237’, ‘13 26712’, ‘14 18984’, ‘15 15990’, ‘16 12196’, ‘17 21966’, ‘18 194291’, ‘19 194885’, ‘20 126483’, ‘21 14534’, ‘22 29710’, ‘23 196006’, ‘24 13974’, ‘25 34424’, ‘26 195320’, ‘27 202168’, ‘28 24900’, ‘29 22061’, ‘30 7843’, ‘31 53405’, ‘32 7958’, ‘33 7913’, ‘34 200682’, ‘35 5349’, ‘36 15979’, ‘37 34286’, ‘38 53619’, ‘39 198150’, ‘40 25144’, ‘41 7366’, ‘42 196818’, ‘43 214880’, ‘44 196847’, ‘45 18007’, ‘46 194614’], 461)
pop_conn.retr()则是用于获取每封邮件的状态了
第三步:解析邮件
分为两步:
1、先把pop_conn.retr()获得的一封邮件格式化一下,把其中的分割符化成”n”(具体这一步的意义我没有深究,应该是方便email模块去解析)
messages = ["n".join(mssg[1]) for mssg in messages] 12
注意每个邮件mssg里面只有mssg[1]是内容。
2、然后对邮件进行解析转化成message对象
messages = [parser().parsestr(mssg) for mssg in messages] 12
3、然后就可以获取到对应的邮件内容了
直接获取了 主题:msg.get(\\\’subject\\\’) 时间:msg.get(\\\’date\\\’) 发件人:email.utils.parseaddr(msg.get(\\\’from\\\’))[1] 收件人:email.utils.parseaddr(msg.get(\\\’to\\\’))[1]12345
不过这些我都不需要,我只需要里面的附件内容。
4、保存附件
for part in msg.walk(): filename = part.get_filename() # 保存附件 if filename: fname = self.decode_str(filename) fex = open("%s%s"%(self.savepath,fname), \\\’wb\\\’) data = part.get_payload(decode=true) fex.write(data) fex.close()12345678910
遍历一下msg,如果有附件就存下来,这里需要注意的是需要对文件的名字进行解码。
然后找个目录存下来吧。
有个问题,不知道为什么只能取到最近的一个月的邮件,有点奇怪,不知道是不是qq邮箱的限制了。
三、源码
#!/usr/bin/python #-*- encoding: utf-8 -*- # @auth atany 347702498@qq.com # blog : http://blog.csdn.net/yang8456211 import poplib from email.parser import parser from email.header import decode_header from email.utils import parseaddr import email import os import sys reload(sys) sys.setdefaultencoding(\\\’utf-8\\\’) # 默认的编码是ascii.. class mailmanager: # 测试的邮件数量 0为所有 testlimitmailcount = 0 def __init__(self, host, username, password, savepath, debugmode = 0): self.host = host self.user = username self.pass_ = password self.debugmode = debugmode self.savepath = savepath def _download_mail(self): print "…n=========
网站访问出现非常慢的延迟阿里云服务器备案号在哪SEO的发展无非就是“网络运营”为什么域名很普通,二手域名价格却很高?php怎么将json转化为数组?如何在win7系统里创建ASP程序测试环境pdf怎么转换成cad图纸方法介绍域名备案短信验证-备案平台