You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为基于CSV批量发邮件的Python脚本添加PDF附件

解决方案:添加PDF附件选择提示(最小改动现有脚本)

完全可以通过添加文件选择提示实现需求,且几乎不用改动你的前置筛选逻辑,只需做几处小修改:

具体修改步骤:

  1. 引入Python自带的文件选择工具,无需额外安装依赖
  2. 给send_email函数增加可选的附件参数,兼容原有调用逻辑
  3. 在脚本启动时弹出选择框,让用户指定PDF附件路径
  4. 在发送邮件时自动添加选中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:50:15