如何修改Python邮件代码实现多附件添加?现有代码仅将文件放入正文
没问题!我帮你调整代码,让它既能把指定文件内容放到邮件正文,又能轻松添加多个附件。下面是修改后的完整代码,关键改动我都标出来了:
完整修改后的代码
#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders def read_files(file_list): data = '' for filename in file_list: with open(filename, 'r', encoding='utf-8') as file: # 加上编码避免中文乱码 data += file.read() + '\n\n' # 每个文件内容间加换行,正文排版更清晰 return data def add_attachments(msg, attachment_list): # 遍历附件列表,逐个添加到邮件 for file_path in attachment_list: with open(file_path, 'rb') as attachment: # 创建附件对象并编码 part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) encoders.encode_base64(part) # 设置附件文件名和头部信息 part.add_header( 'Content-Disposition', f'attachment; filename="{file_path.split("/")[-1]}"', ) msg.attach(part) def send_mail(header, body, attachment_list=None): # 创建多部分邮件容器(支持正文+附件) msg = MIMEMultipart() msg['Subject'] = header['Subject'] msg['From'] = header['From'] msg['To'] = header['To'] # 这里填收件人邮箱,比如 "xxx@example.com" # 添加邮件正文 text_part = MIMEText(body, 'html') msg.attach(text_part) # 如果有附件列表,执行添加逻辑 if attachment_list and len(attachment_list) > 0: add_attachments(msg, attachment_list) # 发送邮件(根据你的邮箱服务商调整SMTP参数) try: with smtplib.SMTP('smtp.example.com', 587) as server: # 替换成你的SMTP服务器地址 server.starttls() # 启用TLS加密 server.login(header['From'], 'your_email_auth_code') # 替换成邮箱授权码/密码 server.send_message(msg) print("邮件发送成功!") except Exception as e: print(f"邮件发送失败:{str(e)}") # ------------------- 使用示例 ------------------- if __name__ == '__main__': # 邮件头部配置 email_header = { 'Subject': '带正文和多附件的测试邮件', 'From': 'your_email@example.com', 'To': 'recipient@example.com' } # 要放到正文里的文件列表 body_files = ['content1.txt', 'content2.html'] email_body = read_files(body_files) # 要添加的附件列表 attachments = ['report.pdf', 'data.xlsx', 'image.jpg'] # 发送邮件 send_mail(email_header, email_body, attachments)
关键改动说明
- 改用
MIMEMultipart作为邮件主容器:原来的MIMEText只能处理纯文本/HTML正文,MIMEMultipart可以同时容纳正文和多个附件,是多内容邮件的标准处理方式 - 新增
add_attachments函数:专门封装附件添加逻辑,遍历列表就能批量添加,避免重复代码 - 优化
read_files函数:增加编码参数防止中文乱码,给每个文件内容间加换行,提升正文可读性 - 完善SMTP发送逻辑:用
with语句自动管理连接,加异常捕获方便排查发送失败的问题
使用注意事项
- 替换代码中的SMTP服务器地址(比如QQ邮箱是
smtp.qq.com,163邮箱是smtp.163.com)和端口号(一般为587) - 邮箱密码建议用授权码(各大邮箱都支持生成,比明文密码更安全)
- 确保正文文件和附件文件的路径正确,或者直接放在脚本同一目录下
内容的提问来源于stack exchange,提问作者Milister




