邮件附件批量下载小程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010723516/article/details/82892247

背景:最近一段在忙着和单位招聘相关的技术环节的事宜,前几天有个活,是把单位邮箱中的简历下载打印下来。这事看起来简单极了,事实上也很简单,但是上手一做,忙活了大半个中午,才下载打印了不到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 用程序做批量打印是不现实的,因为并不是要打印出简历中所有的文件,由于命名不规范,具体打印哪个文件还需要人工判别。所以,打印还是得老老实实一个一个打!

总结

利用不到半天时间写个小程序,现学现卖,写个文章缕缕思路还是不错的。不过,雕虫小技,确实何足挂齿!我更看重的是解决问题思路的清晰、考虑问题的周全、以及解决方案的高效实施。

猜你喜欢

转载自blog.csdn.net/u010723516/article/details/82892247