python下载邮箱附件_基于Python3 下载邮箱附件,并解压到指定文件夹

#!/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 

# 倒叙用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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Python 的 imaplib 库来连接到腾讯邮箱,使用该库中的 fetch 函数来获取指定日期的邮件,并使用 email 库来解析邮件内容和附件。 以下是一个简单的示例代码: ```python import imaplib import email import os from datetime import datetime # 邮箱登录信息 username = 'your_username' password = 'your_password' # 连接到腾讯邮箱 mail = imaplib.IMAP4_SSL('imap.qq.com') mail.login(username, password) # 选择收件箱 mail.select('INBOX') # 搜索指定日期的邮件 date = datetime.now().strftime('%d-%b-%Y') typ, data = mail.search(None, f'(SINCE "{date}")') # 遍历搜索结果 for num in data[0].split(): typ, msg_data = mail.fetch(num, '(RFC822)') msg = email.message_from_bytes(msg_data[0][1]) # 解析邮件内容和附件 for part in msg.walk(): if part.get_content_maintype() == 'multipart': continue if part.get('Content-Disposition') is None: continue filename = part.get_filename() # 下载附件 if filename is not None: filepath = os.path.join('./attachments', filename) with open(filepath, 'wb') as f: f.write(part.get_payload(decode=True)) # 关闭连接 mail.close() mail.logout() ``` 在上述代码中,你需要将 `your_username` 和 `your_password` 替换为你的腾讯邮箱账户名和密码。代码会连接到腾讯邮箱并选择收件箱,然后使用 `datetime.now().strftime('%d-%b-%Y')` 获取当前日期,并使用该日期搜索邮件。接下来,代码会遍历搜索结果并解析邮件内容和附件,将附件下载到 `./attachments` 文件夹中。最后,关闭连接。 请注意,这只是一个简单的示例代码,你需要根据自己的需求进行修改。例如,你可能需要添加更多的搜索条件来过滤邮件,或者你可能需要修改附件下载路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值