C# 使用C访问Outlook中多部分邮件的正文部分标题#
我试图在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: ...
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
属性。这实际上是一个MAPIIMessage
。将其转换为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附件或我正在寻找的标题。谢谢你的回答,但我很久以前就停止了这方面的工作。我无法再验证这是否适用于我,但我希望它仍然可以帮助其他人。