我试图打开一封电子邮件,向它添加一些文本,并使用python窗口扩展转发它。
这就是我所拥有的:
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“+NewMsg.Body,它会破坏原始消息中的所有超链接,并删除原始格式。我是否可以保留原始格式(粗体/彩色单词/超链接)并添加新文本?
发布于 2013-08-23 20:31:49
在Outlook中,Body属性MailItem表示“Outlook项的明文主体”。
有一个单独的RTFBody属性表示“富文本格式的Microsoft项的主体”。
如果您重写其中一个,它将重新创建另一个。这一工作方式在OOM中似乎没有很清楚地记录下来,但是MAPI的等价物,PidTagBody/PR_RTF_COMPRESSED解释说:
当第一次存储PR_BODY时,消息存储还生成和存储PR_RTF_COMPRESSED (PidTagRtfCompressed)属性,这是消息文本的RTF版本。如果随后调用IMAPIProp::SaveChanges方法并修改了PR_BODY,则消息存储将调用RTFSync函数以确保与RTF版本的同步。如果只更改了空白,则属性将保持不变。
因此,如果您除了对Body进行空格更改之外,还可以从头开始重新创建RTFBody。你对此无能为力。
还有第三个属性HTMLBody,它可能比使用RTFBody更容易编辑,无论是使用stdlib解决方案(如ElementTree )还是使用第三方库(如BeautifulSoup )。
在任何地方都没有清楚地记录哪些类型的更改可以打破精确的往返,但测试并不太困难(而且您想要做的大多数更改都不会产生任何明显的效果,即使它们确实更改了RTF的细节,这可能足够好)。
或者,也许更好的方法是,通过将BodyFormat设置为olFormatHTML,只需强制转换和编辑的HTML作为消息的主要表示形式,而不是RTF。这样,您就会知道所传递的内容与您在代码中看到的HTML完全相同。
如果您需要实际编辑RTFBody,则可以。它是一个字节数组,表示可能压缩和绝对编码的RTF。您必须调用StrConv将其转换为Unicode字符串,然后必须将其处理为RTF。如果需要,可以使用纯Python (请参阅RTF规范)或使用第三方库来实现这一点,但也可以通过搜索MSDN找到COM API。
还有最后一种可能需要考虑:您可以始终创建并自动化消息编辑器窗口。这是可怕的黑客行为,但它确实保证了您所做的事情与用户手动复制并粘贴到电子邮件中的…完全相同
https://stackoverflow.com/questions/18411107
复制相似问题