在 Outlook (MAPI) 中将邮件标记为已读的 Python 命令

1 python mapi outlook

我正在编写一个 python 代码,从 Outlook 中未读的电子邮件中下载特定的附件,并将这些电子邮件标记为已读。我已经完成了 90%,即我可以进行迭代以打开未读电子邮件并下载带有特定电子邮件的附件。但是,我有两个问题。

  1. 我正在下载同名附件,如果有两个同名附件,它只保存从上次迭代中提取的附件。我尝试在文件名末尾附加时间戳,但效果相同。任何帮助,将不胜感激。这不是强制性要求,因为邮件按规定的时间间隔发送,我可以编写单独的 python 代码来重命名它,但我想将所有内容打包在这封电子邮件中。

  2. 我想在下载附件后将电子邮件标记为已读。我不知道这个命令。我附上了代码供您参考。

PS这是我的第一个真正的python代码。这也是我在这里的第一篇文章。如果已经在其他地方问过这个,请道歉。

import win32com.client
import os
import time
date_time_stamp = time.strftime("%Y%m%d-%H%M%S")
#set custom working directory
os.chdir('C:\\Users\user_name\Desktop\')
print(os.getcwd())
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
main_inbox = outlook.GetDefaultFolder(6)
subfolder = main_inbox.Folders.Item("my_child_folder_under_inbox")
subfolderitems = subfolder.Items
message = subfolderitems.GetFirst()
attachment_name = 'my_attachment_name'

#Loop to pick messages that are unread
for message in subfolderitems:
        if message.Unread == True:
                print("New Mail Found... Downloading Attachment...")
                #Loop to check if the attachment name is the same
                for attachments in message.Attachments:
                    if attachments.Filename == attachment_name:
                        #Saves to the attachment to the working directory 
                        attachments.SaveASFile(os.getcwd() + '\\' + 'my_attachment_name' + date_time_stamp + '.csv')
                        print (attachments)
                        time.sleep(2)
                        break
                    #Go to next unread messages if any
                message = subfolderitems.GetNext()
        else:
                print ("Checking...")
Run Code Online (Sandbox Code Playgroud)

- 谢谢和问候, Sakthi Ganesh K.

dre*_*c4s 8

我认为这可能与您的“date_time_stamp”有关,因为它试图在同一秒内下载文件,而系统只保留最后一个。您可以尝试使用 UUID 来确保它是唯一的字符串:

import uuid
file_uuid = str(uuid.uuid4())
...
attachments.SaveASFile(os.getcwd() + '\\' + 'my_attachment_name' + file_uuid + '.csv')
Run Code Online (Sandbox Code Playgroud)

要将消息标记为已读,您只需执行以下操作:

message.Unread = False
Run Code Online (Sandbox Code Playgroud)