背景:最近一段在忙着和单位招聘相关的技术环节的事宜,前几天有个活,是把单位邮箱中的简历下载打印下来。这事看起来简单极了,事实上也很简单,但是上手一做,忙活了大半个中午,才下载打印了不到40份简历。
究其原因,
第一,邮箱没有提供批量下载附件的功能(有批量下载部分附件功能,但是一是那样文件就散乱了,而是仍然需要点击多次),只能打开一份邮件,进去找到附件,然后点击下载附件,而且浏览器下载附件的速度也是抽疯的,忽快忽慢。
第二,应聘者可能比较匆忙,没好好阅读招聘公告,造成递交的材料没有按照规范打包成压缩文件,下载起来又增添较大工作量
解决方案:从理论讲,重复性的劳动都可以用计算机来解决。从现实讲,日后还会有大批的简历要下载打印,截至写本文时,已经有133份,以后会更多,要是一份一份下,需大量时间,更重要的是,时间长就易出错,易遗漏。从个人讲,快速写个小程序也是锻炼热身一下。
方案一:爬虫。因为下载过程是,登陆邮箱,点击邮件,再点击附件下载,和爬虫思路相近。笔者之前写过很多爬虫博客,这里就不赘述了,思路都是一样的,具体问题具体分析就行。不过这次我没选爬虫,因为相比方案二,有些麻烦。
方案二:使用python的poplib包和Email包直接下。不废话了,直接上源码
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import os
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))
'''
for msg_id in M.list()[1]:
#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):#字符编码转换
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def get_att(msg,id):
import email
attachment_files = []
os.mkdir(id)
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)#对附件名称进行解码
filename = dh[0][0]
if dh[0][1]:
filename = decode_str(str(filename,dh[0][1]))#将附件名称可读化
print(filename)
#filename = filename.encode("utf-8")
data = part.get_payload(decode=True)#下载附件
path=id+"/"+filename
att_file = open(path, 'wb')#在指定目录下创建文件,注意二进制文件需要用wb模式打开
attachment_files.append(filename)
att_file.write(data)#保存附件
att_file.close()
return attachment_files
dd=len(M.list()[1])
for i in range(dd,0,-1):
resp, lines, octets = 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_('*****')中,填入的不是邮箱密码,而是pop认证的码
2 之所以做成文件夹形式,一是因为便于管理,二是因为直接写到一个文件夹内,重名的简历会被覆盖(命名规则的原因),造成丢失
3 对于打印工作效率而言,或许写到一个文件夹内效率会更高(重名问题可以通过加上id来解决)
4 用程序做批量打印是不现实的,因为并不是要打印出简历中所有的文件,由于命名不规范,具体打印哪个文件还需要人工判别。所以,打印还是得老老实实一个一个打!
总结
利用不到半天时间写个小程序,现学现卖,写个文章缕缕思路还是不错的。不过,雕虫小技,确实何足挂齿!我更看重的是解决问题思路的清晰、考虑问题的周全、以及解决方案的高效实施。