背景:最近忙于公司招聘相关的技术方面。前几天有个工作要下载打印公司邮箱里的简历。这个看似很简单,其实也很简单邮件附件过大如何处理,但是上手之后,花了大半个中午的时间,下载打印了不到40份简历。
原因,
首先,邮箱不提供批量下载附件的功能(有批量下载部分附件的功能,但是首先文件会比较分散,但是还是需要点击多次),可以只打开一封邮件,进去找到附件,然后点击下载附件,而且浏览器下载附件的速度也很疯狂,时快时慢。
其次,申请者可能比较着急,没有仔细阅读招聘公告,导致提交的材料没有按照规范打包成压缩文件,下载会增加工作量。
解决方案:理论上,重复劳动可以通过计算机解决。实事求是地说,未来会有大量的简历可供下载和打印。到写这篇文章的时候,已经有133份了,以后还会有更多。错误,容易错过。个人来说,快速写一个小程序也是一种热身。
选项 1:爬虫。因为下载过程是登录邮箱,点击邮件,然后点击附件下载邮件附件过大如何处理,和爬虫的思路差不多。笔者之前写过很多爬虫博客,这里不再赘述。思路都是一样的,具体问题分析一下。但是这次我没有选择爬虫,因为和第二种方案相比有点麻烦。
方案二:使用python的poplib包和Email包直接下载。废话不多说,直接上源码
导入poplib
从 email.parser 导入解析器
从 email.header 导入 decode_header
从 email.utils 导入解析地址
导入操作系统
M= poplib.POP3("pop.163.com")
M.user('*****')
M.pass_('*****')
#print (len(M.list()[1]))
#print(M.list()[1])
#msg_id="qqqqq"
#outf = open('%s.rar' % msg_id, 'w')
#outf.write(M.retr(1))
#print (M.retr(1))
p>
'''
对于 M.list()[1] 中的 msg_id:
#print (msg_id)
outf = open('%s.rar' % msg_id, 'w')
outf.write('\n'.join(M.retr(msg_id)[1]))
outf .close()
'''
def decode_str(s):#字符编码转换
值,字符集 = decode_header(s)[0]
如果字符集:
value = value.decode(charset)
返回值
def get_att(msg,id):
p>
导入电子邮件
附件文件 = []
os.mkdir(id)
对于 msg.walk() 的一部分:
file_name = part.get_filename()#获取附件名称类型
contType = part.get _content_type()
如果文件名:
h = email.header.Header(file_name)
dh = email.header.decode_header(h)#要解码的附件名称
文件名 = dh[0][0]
如果 dh[0][1]:
filename = decode_str(str(filename, dh[0][1]))#使附件名称可读
打印(文件名)
#filename = filename.encode("utf-8")
data = part.get_payload(decode=True)#下载附件
path=id+"/"+文件名
att_file = open(path, 'wb')#在指定目录下创建文件,注意二进制文件需要wb模式打开
attachment_files.append(文件名)
att_file.write(data)#保存附件
att_file.close()
返回附件文件
dd=len(M.list()[1])
对于范围内的 i(dd,0 ,-1):
resp,行,八位字节 = M.retr(i)
msg_content = b'\r\n'.join(lines).decode('utf-8')
#解析邮件:
msg = Parser().parsestr(msg_content)
f_list = get_att(msg,str(i))#获取附件
获得的结果
一个文件夹一份简历
文件夹中的普通简历
文件夹中的简历不规则
几个需要注意的问题
1 M.pass_('*****'),不是邮箱密码,而是弹出的验证码
2是文件夹的形式,一来是便于管理,二来如果直接写到文件夹里,同名的简历会被覆盖(由于命名规则),原因损失
3为了打印工作的效率,写到一个文件夹可能效率更高(加id可以解决重名问题)
4 使用程序 批量打印是不现实的,因为不需要将简历中的所有文件都打印出来。由于命名不规范,需要手动确定打印哪个文件。所以,打印还是要一张一张的!
总结
不到半天就写了个小程序还不错,现在学着卖了,写一篇文章。不过,雕刻昆虫的招数,实在是一文不值!我更看重的是解决问题的思路清晰,对问题的深思熟虑,以及解决方案的高效执行。