Outlook .MSG 和 .OFT 文件格式之间有区别吗?

问题描述 投票:0回答:2

这个问题有点遥远,但我花了几个小时却无济于事。我有一些代码可以在网络服务器上生成电子邮件文件,并允许用户下载该电子邮件并在 Outlook 中打开它。从这里,他们可以在将电子邮件发送给一群人之前对电子邮件进行各种手动更改。

现在,我生成了一个 .OFT 文件,它基本上是一个电子邮件模板。我想要做的是生成一个 .MSG 文件,这是一封实际的电子邮件。从二进制的角度来看,这些文件格式似乎是相同的。它们具有相同的流 ID 和属性等。

我的方法是首先在 Outlook 中创建一封空白电子邮件,然后将其保存到名为 Base.oft 的文件中。在我的代码中,我打开文档并修改 Stream ID

__substg1.0_1013001E
,它是 HTML 电子邮件正文的 ID。然后我保存文件并将其写给客户端。这非常有效。

我对 MSG 格式尝试了相同的方法。我创建了一封空白电子邮件,将其另存为 Base.msg,并修改相同的流 ID。如果我查看生成的文件,就会发现新的正文实际上位于其中并已保存。但是,如果我打开电子邮件,正文仍然是空白。

更奇怪的是,如果我在 Outlook 中输入正文并将其保存到基本文件中,我可以在流 0_1013001E 下看到该正文。如果我随后使用不同的正文修改该流,我可以验证新正文确实保存在文件中,但如果我在 Outlook 中打开邮件,我会看到旧的原始正文。就好像电子邮件正文以 .MSG 格式存储在文件中的不同位置,但是我查看了每个流,但找不到任何其他看起来可能是电子邮件正文的内容。

也许 .MSG 文件是加密的,或者它们的主体以某种专有的二进制格式存储,与 .OFT 文件不同?希望有人对此有一些见解,因为我在互联网上搜索并基本上没有发现这些格式。

更新:

.MSG 格式似乎将正文存储在流 ID 中

__substg1.0_10090102
- 以某种二进制形式编码(不确定是什么。)如果我删除流(或将其设置为单个
\0
,文件就会损坏.

email outlook file-format oft
2个回答
4
投票

首先,要查找有关此主题和相关主题的更多信息,请远离原始子流编号并通过 Google 搜索相应的 MAPI 属性。例如,1013 是

PR_HTML
,1009 是
PR_RTF_COMPRESSED
。 MAPI 具有将正文从一种格式同步到另一种格式的方法。

请参阅 MSDN 上的 this 文章,了解所有与内容相关的 MAPI 属性(即 .MSG 文件内的不同“流”)的详细概述。

要写入 PR_RTF_COMPRESSED,请将流包装在 WrapCompressedStream 中。另一方面,在您的特定情况下,您可能希望避免代码中的 MAPI 依赖性,因此也许您最好找到

PR_STORE_SUPPORT_MASK
并设置
STORE_UNCOMPRESSED_RTF
位。这将允许您在 PR_RTF_COMPRESSED 子流中使用直接 RTF。或者 Outlooks 精美的 html-wrapped-in-rtf,如果你有勇气的话。

这些东西都不适合胆小的人,但是看到你已经如何处理原始的 .MSG 子流写入,我猜这是可行的。


3
投票

就格式而言,没有区别。 唯一的区别是 OFT 文件使用

CLSID_TemplateMessage
(
{0006F046-0000-0000-C000-000000000046}
) 作为存储类别 (
WriteClassStg
),而 MSG 文件使用
CLSID_MailMessage
(
{00020D0B-0000-0000-C000-000000000046}
)

© www.soinside.com 2019 - 2024. All rights reserved.