#coding: UTF-8 import imaplib import email from email.parser import Parser import re,os import win32gui, win32api, win32com from win32com.client import Dispatch pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)') def Start_mailbox(host,post,uesr,passwrod):#啟動imap郵箱服務 try: conn = imaplib.IMAP4(host, post) conn.login(uesr, passwrod) print("[+] Connect to {0}:{1} successfully".format(host, post)) return conn except BaseException as e: print("Connect to {0}:{1} failed".format(host, post), e) def GetTxtName(dir):#獲取dir文件下的所有文件名 listName = [] for fileName in os.listdir(dir): fileName = os.path.splitext(fileName)[0] listName.append(fileName) return listName def get_filename(wkb_path,Download_path,sheetname,From_mail_name_all,From_mail_type): os.system('taskkill /IM EXCEL.exe /F') xlapp = win32com.client.gencache.EnsureDispatch('Excel.Application') xlapp.Visible = 1 xlapp.DisplayAlerts = False # 關閉警告 wkb = xlapp.Workbooks.Open(wkb_path) wkb_sheet = wkb.Worksheets(sheetname) listName = GetTxtName(Download_path) #print(listName) n=1 last_row = wkb_sheet.Range('A2').End(-4121).Row for i in range(0,len(listName)-3): #one_range = 'A' + str(last_row+1+i) two_range = 'B' + str(last_row+1+i) true_range = 'C' + str(last_row+1+i) #print(one_range) wkb_sheet.Select() #wkb_sheet.Range(one_range).Value = listName[i] try: wkb_sheet.Range(two_range).Value = From_mail_name_all[i] wkb_sheet.Range(true_range).Value = From_mail_type[i] except: pass n=n+1 wkb.Save() wkb.Close() xlapp.Quit() def savefile(filename, data, path):#保存文件方法(保存在path目錄下) try: filepath = path +r'\\'+ filename print(filepath) f = open(filepath, 'wb') except: print('filename error') f.close() f.write(data) f.close() def remove_email(old_maildir,new_maildir):#移動郵箱文件夾 try: conn.select(old_maildir, readonly=False) type_, data = conn.search(None,"ALL") email_ids = data[0].split() for i in range(-1,len(email_ids)-1): latest_email_id = email_ids[i] resp,data = conn.fetch(latest_email_id,'(UID)') match = pattern_uid.match(data[0].decode('utf-8')) msg_uid = match.group('uid') result = conn.uid('COPY',msg_uid,new_maildir) if result[0]=='OK': conn.select(old_maildir, readonly=False) type_,data = conn.search(None,"ALL") mov,data = conn.uid('STORE',msg_uid, '+FLAGS', '(\\Deleted)') conn.expunge() except BaseException as e: print('fail error:',e) def remove_email_file(old_maildir,new_maildir,msg_uid):#移動郵箱文件夾 try: conn.select(old_maildir, readonly=False) type_, data = conn.search(None,"ALL") result = conn.uid('COPY',msg_uid,new_maildir) print('copy successful:',msg_uid) if result[0]=='OK': conn.select(old_maildir, readonly=False) type_,data = conn.search(None,"ALL") mov,data = conn.uid('STORE',msg_uid, '+FLAGS', '(\\Deleted)') conn.expunge() print('delect successful:',msg_uid) except BaseException as e: print('fail error:',e) def parseHeader(msg):#解析郵件首部,備用方案 # 發件人 From_mail = email.utils.parseaddr(msg.get('from'))[1] # 收件人 To_mail = email.utils.parseaddr(msg.get('to'))[1] # 抄送人 Cc_mail = email.utils.parseaddr(msg.get_all('cc'))[1] def imap4(conn,old_maildir,new_maildir,Download_path,wkb_path,sheetname2): # 初始化變量 list_pattern = re.compile(r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)') From_mail_name_all = {} From_mail_name_all_list = {} # Select and search folder conn.select(old_maildir, readonly=True) type_, data = conn.search(None, "ALL")#ALL參數可以進行修改,類似匹配,假如不想要全部文件,可以進行篩選查詢 #獲取郵件正文和附件並重命名保存,優先保存附件,沒有附件的情況下保存正文(正文大於500字), pcount = 1 mail_list = data[0].split()#傳輸當前文件夾下的文件給mail_list for num in mail_list: type_, data = conn.fetch(num,'(RFC822)') msg = email.message_from_string(data[0][1].decode('utf-8'))#傳輸郵件全部內容,用email解析 # email解析件內容,獲取發件人名稱,以@進行截取 From_mail = email.utils.parseaddr(msg.get('from'))[1] From_mail_name = From_mail.split('@')[0] print(From_mail_name) mail_title,mail_charset = email.header.decode_header(msg.get('Subject'))[0] print(mail_title) # email解析件內容 for part in msg.walk(): if not part.is_multipart(): filename = part.get_filename() #如果是附件,這里就會取出附件的文件名 contentType = part.get_content_type() mycode = part.get_content_charset() print(filename) if filename: #保存附件 print('下載文件') attach_data = part.get_payload(decode=True) #filename = list_pattern.findall(filename) save_name = From_mail_name + '.docx'#以發件人名稱的方式保存為doc的文件 savefile(save_name, attach_data, Download_path) From_mail_name_all['EM'] = From_mail_name From_mail_name_all['文件發送方式'] = '附件' From_mail_name_all_list[num] = From_mail_name_all print(From_mail_name_all_list) #下載一個文件之后把這個文件移動到新的郵件文件夾,以便后面遍歷for少一些數據。 try: resp,data = conn.fetch(num,'(UID)') match = pattern_uid.match(data[0].decode('utf-8')) msg_uid = match.group('uid') print(msg_uid) remove_email_file(old_maildir,new_maildir,msg_uid) except BaseException as e: print("remove email failed", e) elif contentType == 'text/plain' or contentType == 'text/html': print('郵件正文') #保存正文 try: data = part.get_payload(decode=True).decode('utf-8') data = re.sub(u"\<br\>\</p\>","\n ", data) data = re.sub(u"\<br\>","\n", data) data = re.sub(u"\</p\>"," ", data) data = re.sub(u"\<.*?\>","", data) data = re.sub(u"\{.*?\}","", data) data = re.sub(u"\ ","", data) data = re.sub(u"table\.customTableClassName","", data) data = re.sub(u"職業培訓領跑者! 學習是一種信仰!","", data) data = re.sub(u"\[object Object\]","", data) data = re.sub(u"\.customTableClassName td, \.customTableClassName th","", data) #print('郵件正文長度:',len(data)) if len(data) <500:#指定郵件內容最小長度。 pass else: save_name = From_mail_name + '.txt' savefile(save_name,data.encode('utf-8'),Download_path) From_mail_name_all['EM'] = From_mail_name From_mail_name_all['文件發送方式'] = '郵件文本' From_mail_name_all_list[num] = From_mail_name_all print(From_mail_name_all_list) try: resp,data = conn.fetch(num,'(UID)') match = pattern_uid.match(data[0].decode('utf-8')) msg_uid = match.group('uid') remove_email_file(old_maildir,new_maildir,msg_uid) except BaseException as e: print("failed", e) pass except BaseException as e: print("failed", e) pass else: #From_mail_type.append('其他文件') pass print ('</br>') print ('\n\n') pcount += 1 print(From_mail_name_all_list) #get_filename(wkb_path,Download_path,sheetname2,From_mail_name_all,From_mail_type)#向excel中寫入統計結果 conn.close() conn.logout() # ******************主程序************************# #參數設置 Download_path = r'C:\Users\1\Desktop\4月關於“為用戶創造價值的思考和理解”的總結報告\aaaa' wkb_path = r"C:\Users\1\Desktop\4月關於“為用戶創造價值的思考和理解”的總結報告\匯總.xlsx" sheetname2 = '郵箱接受文件數' old_maildir = 'INBOX' new_maildir = '&XfJfUmhj-/&XfJn5ZYFZwllSA-' rubbish_maildir = '&XfJfUmhj-/&U4ZT8leDVz5lh072-' host = 'imap.263.net' post = '143' uesr = '***************' passwrod = '*************' #啟動imap郵箱服務 conn = Start_mailbox(host,post,uesr,passwrod) ''' #查看imap郵箱有多少個文件夾,imap不是ut-f8編碼,不能自動編譯,需自行查看 try: type_, folders = conn.list() for i in folders: print(i) except BaseException as e: print("the {0}:{1} no file".format("imap.263.net", 143), e) ''' imap4(conn,old_maildir,new_maildir,Download_path,wkb_path,sheetname2) #remove_email(old_maildir,rubbish_maildir)#移動收件箱數據到指定的文件夾中 #'''