Python 3.x Python-回复电子邮件win32com

Python 3.x Python-回复电子邮件win32com,python-3.x,win32com,Python 3.x,Win32com,我正在尝试通过python和win32com回复电子邮件。 下面是我的代码: outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") o = win32com.client.Dispatch("Outlook.Application") inbox = outlook.GetDefaultFolder(6) messages = inbox.Items

我正在尝试通过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”的发件人,但我试图回复的前一封电子邮件未显示在新电子邮件的下方。我回复的电子邮件的历史记录将丢失。

我没有办法测试此功能,但从您共享的代码来看,我认为问题如下:

您迭代
消息
,找到的每个邮件项都分配了循环变量“message”。 接下来,您将
消息的
正文设置为“这是回复”-换句话说:使用新字符串覆盖原始消息,然后发送回复。
.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()
方法从收件箱中的电子邮件创建了一个新的邮件项对象
reply
,然后将其移动(使用
.Move()
)到我的草稿文件夹中。在那里,我可以检查它,并看到,事实上,原始电子邮件保存在历史记录中,以及主题行自动获得“AW:”前缀

因此:
要保留原始电子邮件,只需确保不覆盖原始的
正文
,只需在
MailItem.HTMLBody
的开头插入新文本即可

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

您迭代
消息
,找到的每个邮件项都分配了循环变量“message”。 接下来,您将
消息的
正文设置为“这是回复”-换句话说:使用新字符串覆盖原始消息,然后发送回复。
.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()
方法从收件箱中的电子邮件创建了一个新的邮件项对象
reply
,然后将其移动(使用
.Move()
)到我的草稿文件夹中。在那里,我可以检查它,并看到,事实上,原始电子邮件保存在历史记录中,以及主题行自动获得“AW:”前缀

因此:
要保留原始电子邮件,只需确保不覆盖原始的
正文
,只需在
MailItem.HTMLBody
的开头插入新文本即可

你说得对。我尝试创建新的电子邮件对象,但没有看到任何回复电子邮件的方法可以保持以前的对话不变。Reply()/replyll()不要将我创建的新电子邮件对象作为参数。不确定win32com是否能满足我的要求。我会在我的工作站上呆一会儿,我可以试试,然后做一些测试<代码>回复()
不应该发送电子邮件,对吗?根据文档,它只会创建一个新的MailItem对象,然后您必须通过调用
.send
发送该对象,感谢您的帮助。我尝试在消息中查找消息:if message.Subject==“aaa”:newMessage=message.Reply()newMessage.body=“body in Reply”newMessage.Send(),但它的操作与原始问题中的相同:(嘿!谢谢它起作用了。它至少保留了以前的邮件。在我连接了我的MailItem.HTMLBody.之后,格式稍微好一点。仍然需要在邮件正文中进行操作,使其看起来像一个电子邮件链。感谢你的帮助..干杯!哦…是的,我刚刚找到了它。HTMLBody是你真正需要的。我补充道在上面的回答中我的代码!很明显,我的
newBody
字符串中的换行符不显示,因为它现在应该是HTML格式的,而不是纯文本。你是对的。我尝试创建新的电子邮件对象,但没有看到任何回复电子邮件的方法保持以前的对话完整。reply()/ReplyAll()不要将我创建的新电子邮件对象作为参数。不确定win32com是否能满足我的要求。我将在我的工作站上呆一会儿,我可以尝试一下,然后做一些测试。
Reply()
不应该发送电子邮件,对吗?根据文档,它只会创建一个新的MailItem对象,然后您必须通过调用
发送该对象。send
已经感谢您的帮助。我尝试在messages中发送消息:if message.Subject==“aaa”:newMessage=message.Reply()newMessage.body=“body in reply”newMessage.Send()但它的作用与原始问题中的相同:(嘿!谢谢它起作用了。它至少保留了以前的邮件。在我连接了我的MailItem.HTMLBody.之后,格式稍微好一点。仍然需要在邮件正文中进行操作,使其看起来像一个电子邮件链。感谢你的帮助..干杯!哦…是的,我刚刚找到了它。HTMLBody是你真正需要的。我补充道在上面的答案中,我的代码!很明显,我的
newBody
字符串中的换行符不显示,因为它现在应该是HTML格式的,而不是纯文本。