1. 程式人生 > 實用技巧 >基於Python3 下載郵箱附件,並解壓到指定資料夾

基於Python3 下載郵箱附件,並解壓到指定資料夾

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 目前只測試過網易163郵箱,qq郵箱時間格式部分有問題


import poplib
import email
import datetime
import time
from email.parser import Parser
from email.header import decode_header
import traceback
import sys
import telnetlib
import zipfile
import zipfile
import os
import shutil
# from email.utils import parseaddr class c_step4_get_email: """建立一個處理郵箱附件下降和解壓的類""" @staticmethod def decode_str(str_in): """字元編碼轉換""" value, charset = decode_header(str_in)[0] if charset: value = value.decode(charset) return value @staticmethod
def get_att(msg_in, str_day_in): """解析郵件,獲取附件""" # import email attachment_files = [] for part in msg_in.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 = c_step4_get_email.decode_str(str(filename, dh[0][1])) print(filename) # filename = filename.encode("utf-8") # 下載附件 data = part.get_payload(decode=True) # 在指定目錄下建立檔案,注意二進位制檔案需要用wb模式開啟 att_file = open('C:\\Users\\Administrator\\Desktop\\' + '\\' + filename, 'wb') attachment_files.append(filename) att_file.write(data) # 儲存附件 att_file.close() return attachment_files @staticmethod def run_ing(): """登陸郵箱""" # 輸入郵件地址, 口令和POP3伺服器地址: email_user = '******@163.com' # 此處密碼是授權碼,用於登入第三方郵件客戶端 password = '******' pop3_server = 'pop.163.com' # 日期賦值 day = datetime.date.today() str_day = str(day).replace('-', '') print(str_day) # 連線到POP3伺服器,有些郵箱伺服器需要ssl加密,可以使用poplib.POP3_SSL try: telnetlib.Telnet('pop.163.com', 995) server = poplib.POP3_SSL(pop3_server, 995, timeout=10) except: time.sleep(5) server = poplib.POP3(pop3_server, 110, timeout=10) # 可以開啟或關閉除錯資訊 server.set_debuglevel(1) # 列印POP3伺服器的歡迎文字: print(server.getwelcome().decode('utf-8')) # 身份認證: server.user(email_user) 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): # 順序遍歷郵件 for i in range(1, index+1): resp, lines, octets = server.retr(i) # lines儲存了郵件的原始文字的每一行, # 郵件的原始文字: msg_content = b'\r\n'.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 < str_day: # 倒敘用break # break # 順敘用continue continue else: # 獲取附件 c_step4_get_email.get_att(msg, str_day) # print_info(msg) server.quit() def un_zip(file_name): """解壓單個檔案""" zip_file = zipfile.ZipFile(file_name) #讀取zip檔案 for names in zip_file.namelist(): zip_file.extract(names,local) #解壓 zip_file.close() # if os.path.exists(file_name): #刪除zip檔案 # os.remove(file_name) print(file_name,'解壓成功') def un_zip_Tree(path): """解壓資料夾中的zip檔案""" if not os.path.exists(path): # 如果本地資料夾不存在,則建立它 os.makedirs(path) for file in os.listdir(path): #listdir()返回當前目錄下清單列表 Local = os.path.join(path, file) #os.path.join()用於拼接檔案路徑 if os.path.isdir(file): # 判斷是否是檔案 if not os.path.exists(Local): #對於資料夾:如果本地不存在,就建立該資料夾 os.makedirs(Local) un_zip_Tree(path) else: # 是檔案 if os.path.splitext(Local)[1] == '.zip': #os.path.splitext(Remote)[1]獲取副檔名,判斷是否為.zip檔案 c_step4_get_email.un_zip(Local) #解壓檔案 if __name__ == '__main__': origin = sys.stdout local = 'C:\\Users\\Administrator\\Desktop\\' # 此處地址看實際儲存 path = 'C:\\Users\\Administrator\\Desktop\\' # 此處地址看實際儲存 # 簡單的日誌處理 將日誌寫入到log.txt f = open('E:\python_project\log.txt', 'w') sys.stdout = f try: c_step4_get_email.run_ing() except Exception as e: s = traceback.format_exc() print(e) tra = traceback.print_exc() sys.stdout = origin c_step4_get_email.un_zip_Tree(path) f.close()

下載附件部分原文地址:https://blog.csdn.net/u012209894/article/details/82384987/
解壓部分原文地址:https://www.cnblogs.com/testxiaobai/p/10515443.html
經過自己做了小修改實現自己的功能

生成exe檔案命令:pyinstaller -F 指令碼名.py