获取 Outlook MailItem 的 Content-Type
Posted
技术标签:
【中文标题】获取 Outlook MailItem 的 Content-Type【英文标题】:Get the Content-Type of an Outlook MailItem 【发布时间】:2016-12-16 04:36:45 【问题描述】:我正在使用 C# 编写 Outlook VSTO,目标是 Outlook 2010。我需要获取消息的 MIME 内容类型(想想text/plain
或其更奇特的替代方案)。我唯一能找到的地方是消息头,这是一个我不想手动读取和解析的长字符串。
MSDN 记录了 PidNameContentType 属性 (alternate link),但我无法让它工作。任何类似的事情总是失败(未找到)。
String ct = mail.PropertyAccessor.GetProperty(
"urn:schemas:mailheader:content-type"); // Not found
String ct2 = mail.PropertyAccessor.GetProperty(
"http://schemas.microsoft.com/mapi/string/00020386-0000-0000-C000-000000000046/content-type"); // Not found
奇怪的是,对于类似的documented example,这甚至会失败:
String ct2 = mail.PropertyAccessor.GetProperty(
"http://schemas.microsoft.com/mapi/string/00020386-0000-0000-C000-000000000046/content-class"); // Not found
另一方面,一些“更常见”的标头,例如 urn:schemas:mailheader:subject
,工作正常。
我只是使用了PropertyAccessor
错误吗? Outlook 实际上并没有解析出 Content-Type 标头,而我只需要手动完成吗?还有其他方法可以获取此标头的内容吗?
【问题讨论】:
【参考方案1】:消息的内容类型应该是消息,对吧?
使用OutlookSpy(单击IMessage)或MFCMAPI 查看可用属性以查看可用属性。
【讨论】:
不,Content-Type(如 MIME 标头)将类似于text/plain
(或者,更有趣的是,multipart/signed;\n\tboundary="Apple-Mail=_E0EEB558-0782-4701-B076-26B88FDF6612";\n\tprotocol="application/pgp-signature"; micalg=pgp-sha512
)。
Outlook 不需要这个 - 它总是将邮件正文解析为普通 (PR_BODY)、html (PR_HTML) 和 RTF (PER_RTF_COMPRESSED) 部分。如果 HTML 和 RTF 是从纯文本创建的,则会在 HTML 和 RTF 正文中添加注释,将正文标记为纯文本。
不幸的是,电子邮件不仅仅是纯文本和 HTML(和 RTF)正文……尤其是在处理签名和加密的消息时。更不幸的是,Outlook 对 PGP/MIME 消息的理解 刚好 足以让它们完全无法处理(请参阅此站点上带有字符串“smime.p7m”的每个问题,其中大部分实际上与 PGP 有关/哑剧)。在这种情况下,我正在寻找一种快速识别 PGP/MIME 签名和/或加密邮件的方法,而无需浪费时间进行猜测和检查。幸运的是,它在 MIME 标头“Content-Type”中指明了......如果我能得到它!
您可以使用 PropertyAccessor 检索 PR_TRANSPORT_MESSAGE_HEADERS。【参考方案2】:
先获取整个标题,然后搜索该字符串以获得所需的内容怎么样?
Const PR_TRANSPORT_MESSAGE_HEADERS = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"
Outlook.PropertyAccessor olPA = olkMsg.PropertyAccessor;
String Header = olPA.GetProperty(PR_TRANSPORT_MESSAGE_HEADERS);
来源:Code Project
【讨论】:
完全有可能,但属于问题的"Does Outlook not actually parse out the Content-Type header and I simply need to do it manually?"
部分。考虑到 Outlook 自动解析了多少东西,有一个命名属性正是我想要的,以及我编写这个加载项的原因之一是因为它打算替换的属性不好性能,我真的希望有更好的解决方案。以上是关于获取 Outlook MailItem 的 Content-Type的主要内容,如果未能解决你的问题,请参考以下文章
获取 Outlook MailItem 的 Content-Type
如何检查可应用于 Outlook 中的 mailItem 的所有规则
从 C# 中的 MailItem 获取命名的 MAPI 属性
Outlook.MailItem.EntryID 和 Mapi32.dll MessageID 之间的区别