#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- encoding: gbk -*-
# 目前只測試過網易163郵箱,qq郵箱時間格式與163有所不同需要更改時間格式那部分的代碼
import poplib
import email
import datetime
import time
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import traceback
import sys
import telnetlib
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\\銀聯對賬zip文件臨時存放文件夾' + '\\' + 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):
# 順序遍歷郵件
a = 1
while a == 1:
global number
for i in range(number, index+1):
resp, lines, octets = server.retr(i)
# lines存儲了郵件的原始文本的每一行,
# 郵件的原始文本:
msg_content = b'\r\n'.join(lines).decode('unicode_escape')
# 解析郵件:
msg = Parser().parsestr(msg_content)
From = parseaddr(msg.get('from'))[1] # 發件人
To = parseaddr(msg.get('To'))[1] # 收件人
Cc = parseaddr(msg.get_all('Cc')) [1] # 抄送人
Subject = parseaddr(msg.get('Subject'))[1] #主題
print('from:%s,to:%s,Cc:%s,Subject%s:'%(From,To,Cc,Subject))
if From == 'operator_gd@unionpay.com': # 判斷是否來自指定郵箱
# 獲取郵件時間,格式化收件時間
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)
a += 1
else:
number += 1
# c_step4_get_email.run_ing()
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): #用os中rename 重命名的方法剪貼zip文件
os.rename(file_name,zip_path + file_name[48:])
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
number = 1
zip_path = 'C:\\Users\\Administrator\\Desktop\\'
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