python+POP 3一括ダウンロードメール添付ファイル

2884 ワード

最近新しく学校が始まって、ボスの本科の課程に助教の仕事をすることを受け取って、百十人ぐらいの人は1学期の下で4、5回の宿題がメールボックスに送らなければならなくて、私が採点を統計する必要があって、1つの点に入って添付ファイルをダウンロードする過程を考えてみると頭が大きくて、そこでシナリオを書いて宿題を統括する考えが芽生えました.
実はpythonにはメールの送受信に便利なパッケージがあり、合理的に使えばいいので、ほとんどのメールの送受信タスクを解決することができます.しかし、このスクリプトを書くのに時間がかかりました.その最大の時間はpythonの符号化の問題にかかり、python 2とpython 3の符号化プリセットが少し異なり、python 3でunicodeという方法がキャンセルされ、python 2に書かれたルーチンの多くが3で実行できなくなりました.
変更後、次のスクリプトは、指定した日付範囲のメール添付ファイルをメールボックスから取得し、指定したディレクトリに併存します.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import poplib
import email
import datetime
import time
import os
import xlrd
import xlwt
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr



#       ,    POP3     :
email = '[email protected]'
password = 'xxxxxxxxxxx'
pop3_server = 'pop.qq.com'



def decode_str(s):#      
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value


def get_att(msg):
    import email
    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)#         
            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)#    
            att_file = open('E:\\L\\zy\\307\\' + filename, 'wb')#          ,          wb    
            attachment_files.append(filename)
            att_file.write(data)#    
            att_file.close()
    return attachment_files

        
            
#    POP3   ,         ssl  ,               poplib.POP3()
server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1)
#   POP3        :
print(server.getwelcome().decode('utf-8'))
#     :
server.user(email)
server.pass_(password)
#            :
print('Messages: %s. Size: %s' % server.stat())
# list()         :
resp, mails, octets = server.list()
#            [b'1 82923', b'2 2184', ...]
print(mails)
index = len(mails)



for i in range(index,0,-1):
    #      
    resp, lines, octets = server.retr(i)
    # lines              ,
    #       :
    msg_content = b'\r
'.join(lines).decode('utf-8') # : msg = Parser().parsestr(msg_content) # date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') # date2 = time.strftime("%Y%m%d", date1)# if (date2'20180314'): continue f_list = get_att(msg)# #print_info(msg) server.quit()