我写了一些执行以下操作的 python 代码:
我的代码按描述工作,但在遍历电子邮件(或可能是日期)时似乎崩溃了,只从我需要的 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()
Outlook 对象模型中的 Namespace 类不提供
Quit
方法。
您可以使用 Application.Quit 方法关闭所有当前打开的窗口。在这种情况下,相关的 Outlook 会话将完全关闭;用户退出消息系统,对尚未保存的项目所做的任何更改都将被丢弃。
使用
Application.Quit
方法-没有Namespace.Quit
方法。
还要记住,大多数最终用户不会欣赏他们的 Outlook 关闭他们:Outlook 是一个单例,创建
Outlook.Application
对象的实例将返回一个指向已运行实例的指针。如果是您的代码创建了 Outlook.Application
对象,则没有理由调用 Application.Quit
- 当您的代码引用消失时,Outlook 将退出。如果你真的要关闭它,至少检查以确保Application.Explorers.Count == 0
和Application.Inspectors.Count == 0
以确保没有用户打开的打开窗口。