我试图在Outlook中提取多部分邮件正文部分的标题。原始消息(我无法从我的代码中获取)看起来像这样:
Return-Path: ...
Received: ...
From: ...
Content-Type: multipart/signed; boundary="Apple-Mail=_06FDFEBB-366E-4B1E-AA7F-F5DDEC13FD03"; protocol="application/pgp-signature"; micalg=pgp-sha512
Subject: ...
Message-Id: ...
Date: ...
To: ...
Mime-Version: ...
X-Mailer: ...
--Apple-Mail=_06FDFEBB-366E-4B1E-AA7F-F5DDEC13FD03
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
...
--Apple-Mail=_06FDFEBB-366E-4B1E-AA7F-F5DDEC13FD03
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=signature.asc
Content-Type: application/pgp-signature;
name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail
...
--Apple-Mail=_06FDFEBB-366E-4B1E-AA7F-F5DDEC13FD03--
我用点替换了一些无关的部分。我想要获得的标题是第一个边界下的标题。所以这是我要找的部分:
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
但是,如果我可以在界限之间获得整个部分,那也可以,因为我可以自己解析它。
到目前为止,我只能在邮件顶部显示标题(从Return-Path
到X-Mailer
)。
我能够通过以下方式使用`PropertyAccessor来做到这一点:
mailItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")
在这种情况下,mailItem
是我的Microsoft.Office.Interop.Outlook.MailItem
实例。
那么,我的问题归结为:如何在第一个边界或包含它们的消息的任何更大部分下获取标题?
答案 0 :(得分:0)
PR_TRANSPORT_MESSAGE_HEADERS property
是唯一能得到的东西。 Outlook不存储原始邮件的完整MIME源。
您可以在OutlookSpy中查看可用内容 - 点击IMessage按钮。
答案 1 :(得分:0)
对于已签名的邮件,Outlook会在名为smime.p7m
的附件中保留已签名的邮件正文(包含完整的MIME数据)(它总是称为smime,即使它实际上是PGP / MIME)。不幸的是,Outlook隐藏了这一点,透明地解压缩已签名的消息并显示它。使用Outlook对象模型无法获取实际的邮件正文。
但是,如果您愿意直接调用MAPI(从本机代码最简单,但如果您不怕某些讨厌的COM互操作可以从.NET完成),您可以获得multipart/signed
正文 - 签名和完整签名部分 - 如下:
从Outlook MailItem
开始,获取MAPIOBJECT
属性。这实际上是MAPI IMessage
。将其转换为IMAPISecureMessage
(.NET将在幕后处理QueryInterface
。在此IMAPISecureMessage(唯一记录的函数)上调用GetBaseMessage()
,该函数返回另一个IMessage
。这是“真实”消息,即带有smime.p7m
附件的消息。不幸的是,没有办法把它放回到OOM中,所以你必须继续使用MAPI。通过调用IMessage
上的函数,您可以获取附件,然后获取其数据。您需要解析MIME部分,至少足以获得没有标题,外部边界或签名部分的签名部分。验证签名部分(不解码其内部部分,如果有,或解码引用可打印或类似的东西)对着签名blob。