在使用 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()  # 发送完所有的邮件后关闭连接

代码解析:

  1. 在每次循环迭代开始时,创建一个新的 MIMEMultipart 实例,确保邮件内容从新开始,避免附件累积。
  2. 使用 MIMEBase 类创建附件对象,并使用 encoders.encode_base64() 对附件进行编码。
  3. 使用 add_header() 方法设置附件的文件名,确保每个收件人收到的附件名称都是正确的。

通过这些修改,可以确保每个收件人只收到对应自己的附件,有效避免了重复附件的问题。

注意:

  • sender, subject, email_body 是你发送邮件时需要设置的具体内容。
  • smtpObj 是你使用的 SMTP 邮件服务器对象,需要根据你的具体情况进行配置。
  • 以上代码示例使用 pandas 库读取 Excel 文件,你需要确保已安装该库。
  • 请确保代码中使用的路径、文件名和邮件服务器配置信息与实际情况相符。
Python 邮件附件问题:如何避免发送重复附件

原文地址: https://www.cveoy.top/t/topic/oWHG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录