首页 > 解决方案 > Python - Outlook 保存电子邮件而不是全部保存

问题描述

下面的代码在我运行脚本时保存来自特定文件夹的电子邮件 - 但是如果文件夹中有 5 或 6 封电子邮件,我必须运行两次才能将它们全部清除 - 似乎无法正常工作 - 这是 python 版本我正在使用我曾经使用过 VBA 版本并且它以相同的方式发生 - 所以我认为这是导致问题或我对这两个版本的错误编码的前景

from win32com.client import Dispatch
from datetime import datetime
from zipfile import ZipFile
from os import remove, listdir, rename, rmdir
from uuid import uuid4
import webbrowser

OUTLOOK = Dispatch("Outlook.Application").GetNamespace("MAPI")
BUSINESS_OBJECTS = OUTLOOK.Folders.Item(2).Folders['Inbox'].Folders['4. Regional'].Folders['Business Objects']
DIR = "\\\\GB998K12FPS01\\HomeDir$\\user001\\Desktop\\Exports\\Outlook attachments"

count = 0

for email in BUSINESS_OBJECTS.Items:
    timestamp = str(datetime.fromtimestamp(email.ReceivedTime.timestamp())).replace(":", "-")
    for attachment in email.attachments:
        filename = "{}\\{} {}".format(DIR, timestamp, attachment.FileName)
        attachment.SaveAsFile(filename)
        if attachment.FileName.split(".")[-1] == "zip":
            TEMP_FOLDER = "{}\\{}\\".format(DIR, uuid4())
            with ZipFile(filename, "r") as zipped:
                zipped.extractall(TEMP_FOLDER)
            for file in listdir(TEMP_FOLDER):
                rename(TEMP_FOLDER + file, "{}\\..\\{} {}".format(TEMP_FOLDER, timestamp, file))
            remove(filename)
            rmdir(TEMP_FOLDER)
    if len(email.attachments) > 0:
        email.UnRead = False
        email.delete()
        count += 1

print("Complete! Processed {} emails!".format(count))
input()
webbrowser.open("\\\\GB998K12FPS01\\HomeDir$\\user001\\Desktop\\Exports\\Outlook attachments"

any ideas would be greatly apprciated

标签: pythonoutlook

解决方案


考虑以下可能的情况:

  1. Outlook 文件夹可能包含不同类型的项目,因此集合可能包含邮件项目、文档项目、约会项目等。因此,我建议在进一步处理之前检查项目类型。

  2. 遍历文件夹中的所有项目并不是一个好主意:

for email in BUSINESS_OBJECTS.Items

相反,您可以考虑使用类的Find/FindNextRestrict方法,Items只允许获取与您的条件相对应的项目。在以下文章中阅读有关这些方法的更多信息:

  1. 我还注意到共享文件夹用于保存附件:
    DIR = "\\\\GB998K12FPS01\\HomeDir$\\user001\\Desktop\\Exports\\Outlook attachments"
    ...
    filename = "{}\\{} {}".format(DIR, timestamp, attachment.FileName)
    attachment.SaveAsFile(filename)

使用本地文件夹来保存附件。

无论如何,要了解为什么不是所有项目都被处理并将附加文件保存到磁盘,我建议将任何日志语句添加到代码中,这样您就可以查看日志并了解代码失败的原因。


推荐阅读