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

时间:2018-01-08 14:35:54

标签: python outlook mapi

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

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

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

  3. P.S。这是我的第一个真正的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。

1 个答案:

答案 0 :(得分:2)

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

import uuid
file_uuid = str(uuid.uuid4())
...
attachments.SaveASFile(os.getcwd() + '\\' + 'my_attachment_name' + file_uuid + '.csv')

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

message.Unread = False