返回

win32com 批量处理多邮箱邮件附件下载教程

python

使用 win32com 处理多个邮箱的邮件附件

许多应用场景需要从多个邮箱下载邮件附件,这其中涉及到访问不同账户并迭代处理邮件。直接使用 GetDefaultFolder(6) 方法会默认选择第一个账户,这不能满足多邮箱处理需求。本文将探讨如何使用 win32com 库实现多邮箱附件的下载。

问题分析

默认情况下, GetDefaultFolder(6) 指向 MAPI 配置文件中的默认账户的收件箱。要访问其他邮箱,需要通过 mapi.Accounts 获取所有可用账户,然后选择特定账户并访问其收件箱。这个过程的核心在于识别目标账户和定位正确的邮箱文件夹。

解决方案

通过迭代所有账户,我们可以获得所有可用账户的 DeliveryStore DisplayName,将其与我们希望使用的账户名称进行匹配。 成功匹配后, 我们将从特定账户的文件夹集合中获取收件箱对象,而不是使用 GetDefaultFolder 方法访问默认邮箱。
以下代码演示了如何选择第二个账户的收件箱并下载其邮件附件。

代码示例:

import win32com.client
import os
from datetime import datetime, timedelta

outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
target_account_name = "[email protected]" # 修改为你的目标账户名

# 修改以下为第二个邮箱的delivery store name. 注意打印显示出来的 DeliveryStore.DisplayName
target_account_delivery_store = "second account's delivery store display name" 

outputDir = 'N:\M_folder'
email_subject = 'Base2'

try:
    for account in mapi.Accounts:
         print(f"Current Delivery Store Name: {account.DeliveryStore.DisplayName}")
         if account.DeliveryStore.DisplayName == target_account_delivery_store:
            print("found matching email, now processing.")
            inbox = account.GetDefaultFolder(6)  # Inbox
            messages = inbox.Items
            
            for message in list(messages):
                if email_subject in message.subject:
                     try:
                         s = message.sender
                         for attachment in message.Attachments:
                             attachment.SaveASFile(os.path.join(outputDir, attachment.FileName))
                             print(f"attachment {attachment.FileName} from {s} saved")
                     except Exception as e:
                         print("Error when saving the attachment:" + str(e))

except Exception as e:
        print("Error when processing emails messages:" + str(e))

操作步骤:

  1. target_account_name 的值更改为你希望访问的邮箱账户名;或修改为账户对应的 delivery store name;注意通过首次运行程序获取打印的各个delivery store name;
  2. outputDir 更改为保存附件的目录路径;
  3. email_subject 设置为你需要匹配的主题关键词。
  4. 运行代码,附件将被下载到指定的文件夹中。
  5. 代码中的 delivery store 匹配更为健壮和通用。建议使用打印出来的delivery store name来选择匹配账户。

扩展与建议

  • 动态账户选择: 除了预设账户名,还可以通过其他规则来选择账户,例如账户序号。可以基于序号建立循环,对多个账户执行附件下载操作。
  • 错误处理: 添加更多的错误处理, 例如在文件夹不存在的时候创建文件夹。并且为每个附件的处理提供日志。这能够使程序在不同场景下更健壮地运行。
  • 安全建议: 定期检查邮件处理脚本及其配置,避免敏感信息泄露或未授权访问。注意对外部文件下载操作的权限和来源进行把控。确保 outputDir 路径的安全性和访问权限。使用更安全和经过审查的文件保存路径,避免覆盖系统文件或出现其他意外行为。
  • 避免硬编码: 可以使用环境变量或外部配置文件来存储邮件账户和附件存储路径等敏感信息。这样可以提高代码的维护性和安全性。

上述示例展示了如何在 Python 中使用 win32com 处理多邮箱附件下载的问题。理解 MAPI 账户结构和如何通过程序定位特定账户是解决此问题的关键。