首页 > 解决方案 > Python - 回复电子邮件 win32com

问题描述

我正在尝试通过 python 和 win32com 回复电子邮件。下面是我的代码:

    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    o = win32com.client.Dispatch("Outlook.Application")
    inbox = outlook.GetDefaultFolder(6)
    messages = inbox.Items


    for message in messages:
        if message.Subject == "aaa":
            print("Found message")             
            message.body="This is a reply"        
            message.Reply()

回复已发送给“aaa”的发件人,但我尝试回复的上一封电子邮件未出现在新电子邮件下方。我正在回复的电子邮件历史记录丢失了。

标签: python-3.xwin32com

解决方案


我没有办法对此进行测试,但是从您分享的代码中,我认为问题如下:

您迭代messages并为每个找到的MailItem分配循环变量“消息”。接下来,您将bodyof设置message为“这是回复” - 换句话说:您使用新字符串覆盖原始消息,然后发送回复。 .Reply()然后只需从 中创建一个新的 MailItem 对象message,只需切换Sender和属性...以及您自己分配的新对象。Recipientbody

https://docs.microsoft.com/en-gb/office/vba/api/outlook.mailitem.reply(方法)

编辑:

所以我做了这个代码:

import win32com.client as win32

outlook = win32.Dispatch("Outlook.Application").GetNamespace("MAPI")
acc = outlook.Folders("myemail@provider.com")
inbox = acc.folders("Inbox")   #change to localized versions
drafts = acc.folders("Drafts") #if necessary

def createReply(email:object):
        reply = email.Reply()
        newBody = "Dear friend,\n\nThis should be added on top.\nI hope this 
                   works\n\nkr\ntst\n"
        reply.HTMLBody = newBody + reply.HTMLBody
        reply.Move(drafts)

for mailItem in inbox.Items:
        if mailItem.Subject == "Test4Reply":
                print("Start")
                createReply(mailItem)

首先,我给自己发了一封主题为“Test4Reply”的电子邮件,这样我就可以抓住它了。我在电子邮件正文中添加了一些乱码,只是为了检查它是否被保留。reply然后,我使用该方法从我的收件箱中的电子邮件创建了一个新的 MailItem 对象.Reply(),然后我将它(用.Move())移动到我的草稿文件夹中。在那里我可以检查它,发现原始电子邮件确实保留在历史记录中,并且主题行自动获得“AW:”前缀。

所以:要保留原始电子邮件,您只需要确保不覆盖原始电子邮件,Body并且只在MailItem.HTMLBody.


推荐阅读