1

我正在尝试打开一封电子邮件,向其中添加一些文本并使用 python windows 扩展转发它。

这就是我所拥有的:

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 

inbox = outlook.GetDefaultFolder(6).Folders('SUBFOLDER')
messages = inbox.Items
message = messages.GetLast()
NewMsg = message.Forward()
NewMsg.To = "email@email.com" #I want to forward it to this address
NewMsg.Body = "New Text"+NewMsg.Body

当我将某些内容复制到电子邮件的前面时:NewMsg.Body = "New Text"+NewMsg.Body,它会破坏原始消息中的所有超链接并删除原始格式。无论如何我可以保留原始格式(粗体/彩色单词/超链接)并添加新文本吗?

4

1 回答 1

1

在 Outlook 对象模型中,Body[ MailItem] 的属性表示“Outlook 项目的明文正文”。

有一个单独的RTFBody属性表示“富文本格式的 Microsoft Outlook 项目的正文”。

如果您重写其中任何一个,它会重新创建另一个。这种工作方式在 OOM 中似乎没有很清楚地记录,但 MAPI 等价物PidTagBody/PR_RTF_COMPRESSED解释了它:

首次存储 PR_BODY 时,消息存储还生成并存储 PR_RTF_COMPRESSED (PidTagRtfCompressed) 属性,即消息文本的 RTF 版本。如果随后调用了 IMAPIProp::SaveChanges 方法并且 PR_BODY 已被修改,则消息存储将调用 RTFSync 函数以确保与 RTF 版本同步。如果仅更改了空格,则属性保持不变。

因此,如果您对除空格之外的任何更改BodyRTFBody可能会从头开始重新创建。你对此无能为力。


还有第三个属性 ,HTMLBody它可能比在 Python 中更容易编辑RTFBody,无论是使用 stdlib 解决方案,还是使用ElementTree第三方库,如BeautifulSoup.

任何地方都没有清楚地记录什么样的更改会破坏精确的往返,但测试起来并不难(而且您想要进行的大多数更改都不会产生任何明显的效果,即使它们确实发生了变化RTF 的详细信息,这可能已经足够好了)。

或者,也许更好,您可以通过设置BodyFormatolFormatHTML. 这样,您就会知道所交付的 HTML 与您在代码中看到的完全相同。


如果您需要实际编辑RTFBody,您可以。它是一个字节数组,表示可能压缩和明确编码的 RTF。您必须调用StrConv它以将其转换为 Unicode RTF 字符串,然后您必须将其作为 RTF 处理。如果需要,您可以在纯 Python 中执行此操作(请参阅RTF 规范),或使用第三方库,但您也可以通过搜索 MSDN 找到相应的 COM API。

最后一种可能性需要考虑:您始终可以创建和自动化消息编辑器窗口。这是非常骇人听闻的,但它确实保证您所做的事情与用户手动复制并粘贴到电子邮件中一样......</p>

于 2013-08-23T20:31:49.917 回答