Outlook批量发邮件:如何实现单PDF逐个发送而非全部附件?
问题修复方案
核心问题分析
你的代码会把C:\ArquivosPDF\OK目录下所有PDF全附加到每一封邮件里,核心原因是没建立公司和对应PDF的关联逻辑,只是无脑遍历整个目录的所有文件并添加。另外代码还有两处基础错误需要修正。
修复步骤及完整代码
1. 先修正基础错误
- 变量名写错:
enumerate(table['Vencidos'])里的table要改成tabela,因为前面定义的Excel数据变量是tabela - 路径拼接错误:
os.path.join(os.getcwd(), caminho, files)改成os.path.join(caminho, files)——caminho已经是绝对路径,没必要再拼当前工作目录,否则会生成无效路径
2. 实现公司与PDF的匹配逻辑
假设你的Excel表格里有一列(比如叫Empresa)存了公司名称,对应的PDF文件名包含该公司名(比如EmpresaABC.pdf),我们就基于这个关联来给每个公司只加对应文件。修复后的完整代码如下:
import os import pandas as pd import win32com.client as win32 # 读取Excel表格数据 tabela = pd.read_excel('SepEmpresa.xlsx') # 初始化Outlook客户端 olApp = win32.Dispatch('Outlook.Application') caminho_pdfs = 'C:\\ArquivosPDF\\OK' # 遍历表格中需要发邮件的行 for idx, row in tabela.iterrows(): if row['Vencidos'] == 'OK': email_destino = row['Email'] nome_empresa = row['Empresa'] # 假设Excel有这一列,用来匹配对应PDF # 创建新邮件 mailItem = olApp.CreateItem(0) mailItem.Subject = 'Expired' mailItem.Body = 'anything' mailItem.To = email_destino # 只添加当前公司对应的PDF for arquivo in os.listdir(caminho_pdfs): # 按文件名包含公司名筛选,可根据实际规则调整(比如完全匹配、前缀后缀匹配) if nome_empresa in arquivo and arquivo.endswith('.pdf'): caminho_arquivo = os.path.join(caminho_pdfs, arquivo) mailItem.Attachments.Add(caminho_arquivo) # 显示邮件(要自动发送就改成mailItem.Send()) mailItem.Display()
关键修改说明
- 用
iterrows()遍历表格,更方便同时获取每行的邮箱、公司名等多列数据 - 新增了文件匹配逻辑:只给当前邮件添加和公司对应的PDF,避免全量附加
- 修正了路径和变量名错误,避免运行报错
额外优化建议
如果Excel里直接存了每个公司对应的PDF文件名(比如列名是NomeArquivoPDF),可以直接定位文件,不用遍历整个目录,效率更高:
# 替换原有的遍历目录代码块 nome_arquivo_pdf = row['NomeArquivoPDF'] caminho_arquivo = os.path.join(caminho_pdfs, nome_arquivo_pdf) # 先检查文件是否存在,避免报错 if os.path.exists(caminho_arquivo): mailItem.Attachments.Add(caminho_arquivo)
内容的提问来源于stack exchange,提问作者Lucas Lima
相关产品推荐
相关产品推荐

