Python 邮件附件问题:如何避免发送重复附件
在使用 Python 发送邮件时,一个常见的错误是每个收件人都会收到之前所有收件人的附件,这通常是因为在发送邮件时,没有清空之前添加的附件。
为了解决这个问题,需要在每个循环迭代中,在添加新附件之前,先清空一下邮件内容,重新构建一个新的邮件实例。
以下是一个修改后的代码示例,可以确保每个收件人只收到对应自己的附件:
import os
import pandas as pd
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
subtables_path = r'C:\Users\LOH2HZ\Desktop\2023.6 email sending\SubTables' # 定义子表文件夹的路径
# 假设 df 是你的 Excel 数据,包含 Project manager 和 Email address 列
for i, row in df.iterrows(): # 遍历 Excel 文件的每一行并附加相应的子表
pm_name = row['Project manager']
pm_email = row['Email address']
if pd.isna(pm_name) or pd.isna(pm_email):
print(f'Missing information for row {i}')
continue
excel_path = os.path.join(subtables_path, f'{pm_name}.xlsx')
if os.path.exists(excel_path):
msg = MIMEMultipart() # 新建邮件实例
msg['From'] = sender
msg['To'] = pm_email
msg['Subject'] = subject
body = f'Dear {pm_name},
{email_body}'
msg.attach(MIMEText(body, 'plain'))
xlsxpart = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')
xlsxpart.set_payload(open(excel_path, 'rb').read())
encoders.encode_base64(xlsxpart)
xlsxpart.add_header('Content-Disposition', 'attachment', filename=f'{pm_name}.xlsx')
msg.attach(xlsxpart)
smtpObj.sendmail(sender, pm_email, msg.as_string()) # 发送邮件给该Project manager
else:
print(f'Subtable for {pm_name} not found')
smtpObj.quit() # 发送完所有的邮件后关闭连接
代码解析:
- 在每次循环迭代开始时,创建一个新的
MIMEMultipart实例,确保邮件内容从新开始,避免附件累积。 - 使用
MIMEBase类创建附件对象,并使用encoders.encode_base64()对附件进行编码。 - 使用
add_header()方法设置附件的文件名,确保每个收件人收到的附件名称都是正确的。
通过这些修改,可以确保每个收件人只收到对应自己的附件,有效避免了重复附件的问题。
注意:
sender,subject,email_body是你发送邮件时需要设置的具体内容。smtpObj是你使用的 SMTP 邮件服务器对象,需要根据你的具体情况进行配置。- 以上代码示例使用
pandas库读取 Excel 文件,你需要确保已安装该库。 - 请确保代码中使用的路径、文件名和邮件服务器配置信息与实际情况相符。
原文地址: https://www.cveoy.top/t/topic/oWHG 著作权归作者所有。请勿转载和采集!