如何修改Python代码实现Outlook邮件逐个循环处理PDF附件?
修改方案:逐个处理指定分类的Outlook邮件并发送合并后的PDF
原代码逻辑为一次性处理所有符合条件的邮件,现调整为逐个处理单封邮件,执行流程为:下载单封邮件的PDF附件 → 合并为单个PDF → 发送邮件 → 清理文件夹内文件,完成后再处理下一封邮件。
修改后的完整代码
import os import win32com.client as win32 from PyPDF2 import PdfFileMerger from pathlib import Path # 配置路径和邮件参数 WORK_PATH = 'C:\\Users\\Desktop\\Work' TARGET_CATEGORY = "Red Category" SEND_TO_EMAIL = 'email@example.com' # 替换为目标收件邮箱 def clear_work_folder(): """清理工作文件夹内的所有文件""" for f in Path(WORK_PATH).glob("*"): if f.is_file(): f.unlink() def merge_pdfs(output_filename): """将工作文件夹内的PDF合并为单个文件""" merger = PdfFileMerger() for root, dirs, file_names in os.walk(WORK_PATH): for file_name in file_names: if file_name.lower().endswith('.pdf'): file_path = os.path.join(root, file_name) merger.append(file_path) merger.write(os.path.join(WORK_PATH, output_filename)) merger.close() def send_email_with_attachment(attachment_path, email_subject, email_body): """通过Outlook发送带附件的邮件""" olApp = win32.Dispatch('Outlook.Application') mailItem = olApp.CreateItem(0) mailItem.Subject = email_subject mailItem.BodyFormat = 1 mailItem.Body = email_body mailItem.To = SEND_TO_EMAIL mailItem.Attachments.Add(attachment_path) mailItem.Send() def process_single_message(message): """处理单封邮件的完整流程""" # 1. 清理工作文件夹(确保初始状态干净) clear_work_folder() # 2. 下载当前邮件的PDF附件 pdf_attachments_count = 0 for attachment in message.Attachments: if attachment.FileName.lower().endswith('.pdf'): save_path = os.path.join(WORK_PATH, attachment.FileName) attachment.SaveAsFile(save_path) print(f"已下载附件: {attachment.FileName}") pdf_attachments_count += 1 if pdf_attachments_count == 0: print("该邮件无PDF附件,跳过处理") return # 3. 合并PDF(如果有多附件) merged_pdf_name = f"merged_{message.Subject.replace('/', '_')}.pdf" merge_pdfs(merged_pdf_name) merged_pdf_path = os.path.join(WORK_PATH, merged_pdf_name) # 4. 发送邮件 email_subject = f"[已处理] {message.Subject}" email_body = f"以下是邮件「{message.Subject}」的PDF附件合并文件。" send_email_with_attachment(merged_pdf_path, email_subject, email_body) print(f"已发送邮件: {email_subject}") # 5. 再次清理工作文件夹 clear_work_folder() if __name__ == "__main__": # 初始化Outlook连接 outlook = win32.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) subFolder = inbox.Folders("Test") messages = subFolder.Items # 遍历所有符合分类条件的邮件,逐个处理 for message in messages: if message.Categories == TARGET_CATEGORY: print(f"\n开始处理邮件: {message.Subject}") process_single_message(message) print(f"完成邮件处理: {message.Subject}\n")
关键修改点说明
- 拆分流程为独立函数:将清理文件夹、合并PDF、发送邮件、处理单封邮件的逻辑拆分为单独函数,提高代码可读性和复用性。
- 外层循环遍历单封邮件:主逻辑改为遍历每一封符合分类的邮件,对单封邮件调用完整处理流程。
- 每轮处理前后清理文件夹:确保每封邮件的处理环境独立,不会混入上一封邮件的附件文件。
- 过滤PDF附件:只处理PDF格式的附件,避免非PDF文件干扰合并流程。
- 动态生成合并文件名:根据邮件主题生成合并后的PDF文件名,避免重名覆盖。
内容的提问来源于stack exchange,提问作者aksent1344
相关产品推荐
相关产品推荐

