Python 发送邮件并附加对应 Project Manager 的 Excel 子表
这段代码旨在通过 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() 对象,每次发送邮件都使用新的邮件对象,就能确保每个邮件只包含对应的附件,解决附件累加的问题。
原文地址: https://www.cveoy.top/t/topic/oWIj 著作权归作者所有。请勿转载和采集!