如何为基于CSV批量发邮件的Python脚本添加PDF附件
解决方案:添加PDF附件选择提示(最小改动现有脚本)
完全可以通过添加文件选择提示实现需求,且几乎不用改动你的前置筛选逻辑,只需做几处小修改:
具体修改步骤:
- 引入Python自带的文件选择工具,无需额外安装依赖
- 给
send_email函数增加可选的附件参数,兼容原有调用逻辑 - 在脚本启动时弹出选择框,让用户指定PDF附件路径
- 在发送邮件时自动添加选中的PDF(若用户选择了的话)
修改后的完整代码
import os import win32com.client as win32 import pandas as pd import datetime # 改动点1:引入文件选择模块 from tkinter import Tk from tkinter.filedialog import askopenfilename # Define today's date today = datetime.date.today().strftime('%m/%d/%Y') # Read the CSV file df = pd.read_csv('exhibitorlist.csv') print(df) # 改动点2:弹出PDF选择框,只允许选PDF文件 Tk().withdraw() # 隐藏tk主窗口 pdf_path = askopenfilename( title="选择要添加的PDF附件", filetypes=[("PDF文件", "*.pdf")] ) # Set up outlook outlook = win32.Dispatch('Outlook.Application') namespace = outlook.GetNamespace('MAPI') sent_folder = namespace.GetDefaultFolder(5) inbox_folder = namespace.GetDefaultFolder(6) # Define email template with placeholders for variables email_template = """ EMAIL TEMPLATE HERE - I've removed the text for this purpose <p></p> """ # 改动点3:修改send_email函数,增加可选的pdf_path参数,同时修正To字段的bug def send_email(to, body, subject, pdf_path=None): mail = outlook.CreateItem(0) mail.To = to # 修正原bug:之前误用了全局变量email_address,现在用参数to mail.Subject = subject # 添加签名图片 attachment = mail.Attachments.Add("C:/Users/User/AppData/Local/Programs/Python/Python311/my_sig_files/logo.png") attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "my_sig") # 改动点4:如果用户选择了PDF,添加附件 if pdf_path: mail.Attachments.Add(pdf_path) mail.HTMLBody = body + "<html><body><img style='width: 100px' src='cid:my_sig'></body></html>" mail.Send() for index, row in df.iterrows(): check_on = row['check_on'] designation = row['designation'] email_address = row['email_address'] action = row['action'] if check_on == today and designation == "auto" and action == "send": to = email_address body = email_template subject = "Exhibitor Email" # 改动点5:调用send_email时传入pdf_path参数 send_email(to, body, subject, pdf_path) df.at[index, 'check_on'] = (datetime.datetime.today() + datetime.timedelta(days=28)).strftime('%m/%d/%Y') df.at[index, 'action'] = 'sent' # Edit CSV file df.to_csv('exhibitorlist.csv', index=False) print(df)
关键说明:
- 前置的邮箱筛选逻辑完全没改动,只是在脚本启动时多了一个文件选择步骤
- 如果用户取消选择PDF,脚本会自动跳过附件添加,保持原有发送逻辑不变
- 顺便修正了原脚本中
send_email函数的一个bug:之前mail.To误用了全局变量email_address,现在改用传入的to参数,避免潜在错误
内容的提问来源于stack exchange,提问作者MMWASS
相关产品推荐
相关产品推荐

