这段代码旨在通过 Python 发送邮件,并根据 Excel 文件中的信息,为每个 Project Manager 附加对应名字命名的 Excel 子表作为附件。代码中存在一个问题,即循环发送邮件时,每个邮件都会累积之前所有邮件的附件,导致后面的 Project Manager 收到的邮件附件包含了所有之前的子表。

这个问题的根本原因在于,在循环中,每次都是在原来的邮件对象 msg 上添加附件,而没有清空上一个邮件的附件。为了解决这个问题,可以在循环开始前加上 msg = MIMEMultipart() 来清空上一个邮件的附件,保证每个邮件只有对应的附件。

以下是修改后的代码:

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

    msg = MIMEMultipart() # 清空上一个邮件的附件
    msg['Subject'] = 'Open ProNovia E-mail reminder'
    msg['From'] = sender
    msg['To'] = pm_email
    
    excel_path = os.path.join(subtables_path, f'{pm_name}.xlsx')
    if os.path.exists(excel_path):
        xlsxpart = MIMEApplication(open(excel_path, 'rb').read())
        xlsxpart.add_header('Content-Disposition', 'attachment', filename=f'{pm_name}.xlsx')
        msg.attach(xlsxpart)
        msg.attach(puretext)
        smtpObj.sendmail(sender, pm_email, msg.as_string()) # 发送邮件给该Project manager
    else:
        print(f'Subtable for {pm_name} not found')

通过在循环开始前创建新的 MIMEMultipart() 对象,每次发送邮件都使用新的邮件对象,就能确保每个邮件只包含对应的附件,解决附件累加的问题。

Python 发送邮件并附加对应 Project Manager 的 Excel 子表

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

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