【问题标题】:Accessing headers of body part in multipart mail in Outlook using C#使用 C# 在 Outlook 中的多部分邮件中访问正文部分的标题
【发布时间】:2014-11-14 23:37:15
【问题描述】:

我正在尝试在 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-PathX-Mailer)。 我可以通过以下方式使用 `PropertyAccessor 来做到这一点:

mailItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")

在这种情况下,mailItem 是我的 Microsoft.Office.Interop.Outlook.MailItem 实例。

那么,我的问题归结为:我怎样才能得到第一个边界下的标题,或者包含它们的消息的任何更大部分?

【问题讨论】:

    标签: c# email outlook multipart


    【解决方案1】:

    对于已签名的邮件,Outlook 将已签名的邮件正文(包含完整的 MIME 数据)保存在名为 smime.p7m 的附件中(它始终称为 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 验证签名部分(解码其内部部分,如果有的话,或解码quoted-printable 或类似的东西)。

    【讨论】:

    • 感谢您的回答,但我很久以前就停止了这个工作。我不再能够验证这是否适合我,但我希望它仍然可以帮助其他人。
    【解决方案2】:

    PR_TRANSPORT_MESSAGE_HEADERS property 是你唯一能得到的东西。 Outlook 不存储原始邮件的完整 MIME 源。

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

    【讨论】:

    • 我展示的代码已经获得了PR_TRANSPORT_MESSAGE_HEADERS 属性。感谢 OutlookSpy 提示,但我没有在那里找到正确的标题。这是否意味着它根本不可能?这意味着我无法在 Outlook 中验证多部分邮件的 PGP 签名。
    • Outlook 是否将这些邮件视为已签名/加密?
    • 我认为确实如此。它确实在邮件上显示了小证书标志,但是有什么方法可以确定这一点吗?
    • 签名/加密消息不同 - 原始 MIME 存储在 p7m 附件中。要在 OutlookSpy 中查看它,请单击 IMAPIFolder 按钮,转到 GetContentsTable 选项卡,从那里打开邮件。如果单击 IMessage 按钮,OutlooikSpy 会从当前选定的邮件中检索 MAPIOBJECT 属性,但 Outlook 会为加密/签名的邮件返回一个假的 IMessage 对象。
    • 我在那里找到了消息,它的类是 MultipartSigned。我还没有找到我要查找的 p7m 附件或标题。
    猜你喜欢
    • 2018-03-06
    • 2021-12-16
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多