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"。
接下来,您将 message
的 body
设置为“这是一条回复” - 换句话说:您覆盖了原始消息 与新的字符串,然后发送回复。
.Reply()
然后简单地从 message
创建一个新的 MailItem 对象,只需切换 Sender
和 Recipient
属性...以及您自己分配的新 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
的开头插入新文本。
我正在尝试通过 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"。
接下来,您将 message
的 body
设置为“这是一条回复” - 换句话说:您覆盖了原始消息 与新的字符串,然后发送回复。
.Reply()
然后简单地从 message
创建一个新的 MailItem 对象,只需切换 Sender
和 Recipient
属性...以及您自己分配的新 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
的开头插入新文本。