python+POP 3一括ダウンロードメール添付ファイル
2884 ワード
最近新しく学校が始まって、ボスの本科の課程に助教の仕事をすることを受け取って、百十人ぐらいの人は1学期の下で4、5回の宿題がメールボックスに送らなければならなくて、私が採点を統計する必要があって、1つの点に入って添付ファイルをダウンロードする過程を考えてみると頭が大きくて、そこでシナリオを書いて宿題を統括する考えが芽生えました.
実はpythonにはメールの送受信に便利なパッケージがあり、合理的に使えばいいので、ほとんどのメールの送受信タスクを解決することができます.しかし、このスクリプトを書くのに時間がかかりました.その最大の時間はpythonの符号化の問題にかかり、python 2とpython 3の符号化プリセットが少し異なり、python 3でunicodeという方法がキャンセルされ、python 2に書かれたルーチンの多くが3で実行できなくなりました.
変更後、次のスクリプトは、指定した日付範囲のメール添付ファイルをメールボックスから取得し、指定したディレクトリに併存します.
実は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()