如何解决以下错误:AttributeError: GetNamespace.GetNamespace - 使用 Python 连接到 Outlook 时?

问题描述 投票:0回答:2

我写了一些执行以下操作的 python 代码:

  1. 连接到 outlook 和特定的子文件夹
  2. 从用户那里获取目标日期
  3. 使用指定的目标日期搜索所有带有标记为“report.csv”的附件的电子邮件
  4. 删除/删除电子邮件主题中的某些关键字
  5. 提取附件
  6. 将解析后的电子邮件主题附件保存在指定文件夹中

我的代码按描述工作,但在遍历电子邮件(或可能是日期)时似乎崩溃了,只从我需要的 30 份左右的报告中提取了 4 份。下面是代码的副本。

当它崩溃时,Vs Code 告诉我问题出在第 54 行“outlook.GetNamespace.Quit()”并建议它是“AttributeError: GetNamespace.Getnamespace”

对这个问题的任何想法和见解,将不胜感激。

import os
import win32com.client
import datetime as dt
from datetime import date, timedelta
from pathlib import Path

EMAIL_ADDRESS = "[email protected]"
FOLDER_NAME = "subfolder_name"
OUTPUT_FOLDER = Path(r"Specify Path")   #specify the path

def connect_to_outlook():
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace ("MAPI")
    inbox_folder = outlook.GetDefaultFolder(6)  # Inbox folder
    sub_folder = inbox_folder.Folders(FOLDER_NAME)
    return sub_folder, outlook, inbox_folder, outlook

def extract_csv_attachments(emails):
    csv_attachments = [(email.Subject.split("[INSERT TEXT TO PARSE/SPLIT")[0].strip(), attachment)
                       for email in emails
                       for attachment in email.Attachments if attachment.FileName == "report.csv"]
    return csv_attachments

try:
    # Connect to Outlook
    sub_folder, outlook, inbox_folder, outlook = connect_to_outlook()

    # Get target date from user input
    target_date_str = input("Enter a target date (YYYY-MM-DD): ")
    target_date = dt.datetime.strptime(target_date_str, '%Y-%m-%d')

    # Construct search criteria and filter emails
    search_criteria = f'[SenderEmailAddress] = "{EMAIL_ADDRESS}" AND [ReceivedTime] >= "{target_date.strftime("%m/%d/%Y")}" AND [ReceivedTime] < "{(target_date + dt.timedelta(days=1)).strftime("%m/%d/%Y")}"'
    filtered_emails = sub_folder.Items.Restrict(search_criteria)
    

    # Extract CSV attachments from filtered emails
    csv_attachments = extract_csv_attachments(filtered_emails)

    # Save extracted attachments to output folder
    for email_subject, attachment in csv_attachments:
        attachment.SaveAsFile(OUTPUT_FOLDER / f"{email_subject}.csv")

finally:
    # Release Outlook resources
    sub_folder = None
    inbox_folder = None
    outlook.GetNamespace.Quit()
    outlook.Quit()
python outlook workflow pywin32 office-automation
2个回答
0
投票

Outlook 对象模型中的 Namespace 类不提供

Quit
方法。

您可以使用 Application.Quit 方法关闭所有当前打开的窗口。在这种情况下,相关的 Outlook 会话将完全关闭;用户退出消息系统,对尚未保存的项目所做的任何更改都将被丢弃。


0
投票

使用

Application.Quit
方法-没有
Namespace.Quit
方法。

还要记住,大多数最终用户不会欣赏他们的 Outlook 关闭他们:Outlook 是一个单例,创建

Outlook.Application
对象的实例将返回一个指向已运行实例的指针。如果是您的代码创建了
Outlook.Application
对象,则没有理由调用
Application.Quit
- 当您的代码引用消失时,Outlook 将退出。如果你真的要关闭它,至少检查以确保
Application.Explorers.Count == 0
Application.Inspectors.Count == 0
以确保没有用户打开的打开窗口。

© www.soinside.com 2019 - 2024. All rights reserved.