python下载邮件excel附件

tech2025-06-12  5

import poplib import email import datetime import time import os #import xlrd #import xlwt import shutil from email.parser import Parser from email.header import decode_header from email.utils import parseaddr import smtplib as sm import email.mime.multipart import email.mime.text import time import datetime from email.mime.application import MIMEApplication from email import encoders from email.mime.base import MIMEBase from email.mime.text import MIMEText yesterday = datetime.date.today() - datetime.timedelta(days=1) m=yesterday.strftime("%Y%m%d") msg=email.mime.multipart.MIMEMultipart() shutil.rmtree('E:\\zjzj\\wenjian\\') os.mkdir('E:\\zjzj\\wenjian\\') # 输入邮件地址, 口令和POP3服务器地址: email = 'aaa@qq.com' password = '*************' pop3_server = 'imap.exmail.qq.com' def decode_str(s):#字符编码转换 value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return value def get_att(msg): import email attachment_files = [] for part in msg.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 = decode_str(str(filename,dh[0][1]))#将附件名称可读化 print(filename) #filename = filename.encode("utf-8") if 'xls' in filename: data = part.get_payload(decode=True)#下载附件 att_file = open('E:\\zjzj\\wenjian\\' + filename, 'wb')#在指定目录下创建文件,注意二进制文件需要用wb模式打开 attachment_files.append(filename) att_file.write(data)#保存附件 att_file.close() return attachment_files def get_email_headers(msg): # 邮件的From, To, Subject存在于根对象上: headers = {} for header in ['From', 'To', 'Subject', 'Date']: value = msg.get(header, '') if value: if header == 'Date': headers['date'] = value if header == 'Subject': # 需要解码Subject字符串: subject = decode_str(value) headers['subject'] = subject else: # 需要解码Email地址: hdr, addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name, addr) if header == 'From': from_address = value headers['from'] = from_address else: to_address = value headers['to'] = to_address content_type = msg.get_content_type() print ('head content_type: ', content_type) return headers # 连接到POP3服务器,有些邮箱服务器需要ssl加密,对于不需要加密的服务器可以使用poplib.POP3() server = poplib.POP3_SSL(pop3_server) server.set_debuglevel(1) # 打印POP3服务器的欢迎文字: print(server.getwelcome().decode('utf-8')) # 身份认证: server.user(email) 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): #倒序遍历邮件 resp, lines, octets = server.retr(i) # lines存储了邮件的原始文本的每一行, #邮件的原始文本: msg_content = b'\r\n'.join(lines).decode('utf-8',"ignore") #解析邮件: msg = Parser().parsestr(msg_content) #message = email.message_from_string(filename.decode("utf-8")) #sender = email.utils.parseaddr(message.get('from'))[1] #获取邮件时间 date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') #格式化收件时间 date2 = time.strftime("%Y%m%d", date1)#邮件时间格式转换 if date2 < m: continue print(msg) f_list = get_att(msg)#获取附件 server.quit()
最新回复(0)