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

用于在Outlook(MAPI)中将邮件标记为已读的Python命令,python,outlook,mapi,Python,Outlook,Mapi,我正在编写一个python代码,从outlook中的未读电子邮件下载特定附件,并将这些电子邮件标记为已读。我已经完成了90%的工作,也就是说,我可以反复打开未读的电子邮件并下载带有特定电子邮件的附件。然而,我有两个问题 我正在下载同名的附件,如果有两个同名的附件,它只保存从上一次迭代中提取的附件。我尝试在文件名的末尾附加一个时间戳,但效果相同。任何帮助都将不胜感激。这不是强制性要求,因为邮件是按规定的时间间隔发送的,我可以编写一个单独的python代码来重命名它,但我想在这封邮件中打包所有内容

我正在编写一个python代码,从outlook中的未读电子邮件下载特定附件,并将这些电子邮件标记为已读。我已经完成了90%的工作,也就是说,我可以反复打开未读的电子邮件并下载带有特定电子邮件的附件。然而,我有两个问题

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

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

  • 另外,这是我第一个真正的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...")
    
    -- 感谢和问候,
    Sakthi Ganesh K.

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

    import uuid
    file_uuid = str(uuid.uuid4())
    ...
    attachments.SaveASFile(os.getcwd() + '\\' + 'my_attachment_name' + file_uuid + '.csv')
    
    要将邮件标记为已读,只需执行以下操作:

    message.Unread = False
    

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

    import uuid
    file_uuid = str(uuid.uuid4())
    ...
    attachments.SaveASFile(os.getcwd() + '\\' + 'my_attachment_name' + file_uuid + '.csv')
    
    要将邮件标记为已读,只需执行以下操作:

    message.Unread = False
    

    与您的请求无关,但看起来您在
    os.chdir
    路径字符串末尾缺少了一个
    \
    ,与您的请求无关,但看起来您在
    os.chdir
    路径字符串末尾缺少了一个
    \