C# 使用C访问Outlook中多部分邮件的正文部分标题#

C# 使用C访问Outlook中多部分邮件的正文部分标题#,c#,email,outlook,multipart,C#,Email,Outlook,Multipart,我试图在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: ...

我试图在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
但是,如果我可以得到边界之间的整个部分,那也很好,因为我可以自己解析它

到目前为止,我只能在邮件顶部获取标题(因此从
返回路径
X-Mailer
)。 我可以通过以下方式使用“PropertyAccessor”实现这一点:

mailItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")
在本例中,
mailItem
是我的
Microsoft.Office.Interop.Outlook.mailItem
实例


因此,我的问题归结为:如何获取第一个边界下的标题,或包含标题的消息的任何更大部分?

PR\u TRANSPORT\u message\u headers属性
是唯一可以获取的内容。Outlook不存储原始邮件的完整MIME源


您可以在-单击IMessage按钮中查看可用内容。

对于签名邮件,Outlook会将签名邮件正文(包含完整的MIME数据)保留在名为
smime.p7m
的附件中(它始终称为smime,即使它实际上是PGP/MIME)。不幸的是,Outlook对您隐藏了这一点,透明地解压签名邮件并显示它。使用Outlook对象模型无法获得实际的邮件正文

但是,如果您愿意直接调用MAPI(从本机代码中最简单,但如果您不害怕某些讨厌的COM互操作,可以从.NET中完成),则可以获得
多部分/签名的
正文-签名和完整的签名部分-如下所示:


从Outlook
MailItem
开始,获取
MAPIOBJECT
属性。这实际上是一个MAPI
IMessage
。将其转换为
IMAPISecureMessage
(.NET将在幕后将其作为
查询接口处理)。在此IMAPISecureMessage(唯一有文档记录的函数)上调用
GetBaseMessage()
,该函数返回另一个
IMessage
。这是“真实”的消息,带有
smime.p7m
附件的消息。不幸的是,没有办法将其放回OOM,因此您必须继续使用MAPI。通过调用
IMessage
上的函数,可以获取附件,然后获取其数据。您将需要解析MIME部分,至少足够让签名部分不带头、外部边界,当然还有签名部分。根据签名blob验证签名部分(不解码其内部部分,如果有,或解码引用的可打印或类似内容)。

我显示的代码已获得
PR\u TRANSPORT\u MESSAGE\u HEADERS
属性。谢谢你的OutlookSpy提示,但是我还没有找到正确的标题。这是否意味着这根本不可能?这意味着我无法在Outlook中验证多部分邮件的PGP签名。Outlook是否将这些邮件视为已签名/加密的邮件?我想是的。它确实在邮件上显示了小小的证书签名,但有没有办法确定这一点?签名/加密的邮件是不同的-原始MIME存储在p7m附件中。要在OutlookSpy中查看它,请单击IMAPIFolder按钮,转到GetContentsTable选项卡,从那里打开消息。如果单击“IMessage”按钮,OutlooikSpy将从当前选定的邮件中检索MAPIOBJECT属性,但Outlook会为加密/签名的邮件返回一个虚假的IMessage对象。我在其中找到了该邮件,其类是多部分签名的。我还没有找到p7m附件或我正在寻找的标题。谢谢你的回答,但我很久以前就停止了这方面的工作。我无法再验证这是否适用于我,但我希望它仍然可以帮助其他人。