python提取邮件的附件,以excel为例

配置邮箱、读取基本的邮件内容请参考:python读取并解析邮箱邮件,读取邮件主题、内容、时间

以excel为例:

  1. 获取邮件:
	email_value_config = {
		'imap_server': 'imap.exmail.qq.com', 
		'username': 'xxxx@xxxx.com', 
		'password': 'xxxxx', 
	}
    
    # 连接到邮箱服务器
   	email_server = imaplib.IMAP4_SSL(email_value_config['imap_server']) # 这样就已经链接到目标邮箱了
	email_server.login(email_value_config["username"], email_value_config['password']) # 这里登录
  	email_server.select('INBOX')
  1. 提取数据需要使用:
	part.get_payload(decode=True)
  1. 写入本地文件时,使用:
	file_name = str(email.header.make_header(email.header.decode_header(part.get_filename()))) 
	# 直接解析文件名,文件名会是balabala.xlsx
	
	with open(file_name, "wb") as save_file:
		save_file.write(part.get_payload(decode=True))

示例代码

import imaplib
import email
from loguru import logger


def parse_body(message):
    """解析邮件/信体"""
    for part in message.walk():
        if not part.is_multipart():  # 这里要判断是否是multipart,用来判断附件是一个message列表
            file_name = part.get_filename()  # 附件需要有文件名
            if file_name:
                file_name = str(email.header.make_header(email.header.decode_header(part.get_filename()))) # 直接解析文件名,如果是excel,会在文件名中以.xlsx或.xls为后缀
                if not ((".xls" in file_name) or (".xlsx" in file_name)):  # 根据后缀判断附件是一个excel
                    continue
                logger.debug(f"准备保存文件 {file_name}")
                with open(file_name, "wb") as save_file: # 这里就是写入文件了
                    save_file.write(part.get_payload(decode=True))
                logger.success(f"保存excel完成 {file_name}")


def main():
	email_value_config = {
		'imap_server': 'imap.exmail.qq.com', 
		'username': 'xxxx@xxxx.com', 
		'password': 'xxxxx', 
	}
    
    # 连接到邮箱服务器
   	email_server = imaplib.IMAP4_SSL(email_value_config['imap_server']) # 这样就已经链接到目标邮箱了
	email_server.login(email_value_config["username"], email_value_config['password']) # 这里登录
  	email_server.select('INBOX')
    
    # 选择收件箱
    _typ, _search_data = email_server.search(None, 'ALL')
    
    # 开始解析
    mailidlist = _search_data[0].split()  # 转成标准列表,获得所有邮件的ID
    print(f'一共解析邮件数量:{len(mailidlist)}')
    
    # 解析内容
    for mail_id in mailidlist:
        result, data = email_server.fetch(mail_id, '(RFC822)')  # 通过邮件id获取邮件
        email_info = email.message_from_bytes(data[0][1])  # 邮件内容(未解析)
        parse_body(email_info)

    email_server.close()
    email_server.logout()


if __name__ == '__main__':
    main()
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值