Python - 回复电子邮件 win32com

Python - Reply to email 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" 的发件人,但我尝试回复的上一封电子邮件没有出现在我正在回复的新 email.The 电子邮件历史记录下方迷路了。

我没有办法测试这个,但是从你分享的代码来看,我认为问题如下:

您遍历 messages,每个找到的 MailItem 都分配给循环变量 "message"。 接下来,您将 messagebody 设置为“这是一条回复” - 换句话说:您覆盖了原始消息 与新的字符串,然后发送回复。 .Reply() 然后简单地从 message 创建一个新的 MailItem 对象,只需切换 SenderRecipient 属性...以及您自己分配的新 body

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

编辑:

所以我做了这个代码:

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())到我的 Drafts 文件夹中。在那里我可以检查它并看到,原始电子邮件确实保留在历史记录中,主题行自动获得 "AW: " 前缀。

所以: 要保留原始电子邮件,您只需确保不覆盖原始 Body 并仅在 MailItem.HTMLBody 的开头插入新文本。