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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:45:29