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

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

以excel为例:

  1. 获取邮件:
	email_value_config = {
    
    
		'imap_server': 'imap.exmail.qq.com', 
		'username': '[email protected]', 
		'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': '[email protected]', 
		'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()

猜你喜欢

转载自blog.csdn.net/weixin_35757704/article/details/132627378