背景:業(yè)務(wù)提出需求,希望數(shù)據(jù)部門可以開發(fā)一個小工具,幫助他們能夠自動化下載某一特定主題郵件的附件,研究了很多種方法,記錄下使用zmail+多線程的方式收取郵件坏瞄。
import zmail
import queue
import threading
import pandas as pd
import os
from datetime import date, datetime, timedelta
q =queue.Queue()
results,threads,subject,ids,threads1=[],[],[],[],[]
tb=subject=pd.DataFrame()
run_time = datetime.strftime(datetime.now(), "%Y-%m-%d")
def get_subject_zmail(i):
server = zmail.server('xxxxx@.com','xxxxx',config='ali')
mail = server.get_headers(start_index=i,end_index=i+9) ####根據(jù)郵件索引取郵件heders信息
q.put(mail)
for i in range(0,2900,10):###2900是郵箱郵件數(shù)
t = threading.Thread(target=get_subject_zmail, args=(i,))
t.start()
threads.append(t)
for i in threads:
i.join()
while not q.empty():
results = results + q.get() ####把所有郵件頭部存成列表
for index,result in enumerate(results): ###解析郵件主題并進(jìn)行判斷
value=result.get('Subject')
date=str(result.get('date')).split()[0]
if value.find('工資條')> -1 and date >= '2018-08-01': ###選擇主題和時間范圍
tb.loc[index,"id"]=result.get('id') ###拿到郵件的id值
tb.loc[index,"主題"]=value
tb.loc[index,"時間"]=date
print("郵件搜索成功")
def save_file(i):
server = zmail.server('xxxxx@.com','xxxxx',config='ali')
mail_file= server.get_mail(int(i))
attachment=mail_file.get('attachments') ###獲取附件信息
if attachment:
if attachment[0][0].split(".")[1] in ("png","jepg","jpg"): ####指定附件類型
path = r"F:/work/test/file/{0}_email_file_{1}_1".format(int(i),run_time)
os.makedirs(path)
zmail.save_attachment(mail_file,target_path=path,overwrite=True)
if tb.shape[0]==0:
print("未查找到符合條件的郵件")
else:
for i in list(tb['id']):###傳入符合條件的郵件id并保存附件
t1 = threading.Thread(target=save_file, args=(i,))
t1.start()
threads1.append(t1)
for i in threads1:
i.join()
print('附件保存成功')