【问题标题】:How can I check if a mail has a valid digital signature?如何检查邮件是否具有有效的数字签名?
【发布时间】:2022-04-03 03:21:07
【问题描述】:

我需要验证传入的邮件是否在 Outlook 2010 中签名。

如果邮件未签名,则应将其移动到“NOSIG”文件夹中。

在研究时,我发现(并在某种程度上确认)Outlook 2010 将 MessageClass 修改为“IPM.Note”,因此我尝试使用 PropertyAccessor 并阅读安全标志。

到目前为止,这是我的代码:

Sub TRCR(MAIL_ITEM As MailItem)

    Dim PR_SECURITY_FLAGS As Integer

    On Error Resume Next

    'Security-Flags: 0=none, 1=encrypted, 2=signed, 3=both
    PR_SECURITY_FLAGS = MAIL_ITEM.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003")

    'Modulo because, sometimes the flags value is added to a multiple of 32... <unfortunately I lost the source>
    If (PR_SECURITY_FLAGS > 32) Then PR_SECURITY_FLAGS = PR_SECURITY_FLAGS Mod 32

    If PR_SECURITY_FLAGS = 2 Or PR_SECURITY_FLAGS = 3 Then
        'Do all that fancy stuff I want to with that signed Mail
    Else
        MAIL_ITEM.Move Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Folders.Item("NOSIG")
    End If

End Sub

我使用 Outlook 规则在每封收到的电子邮件上运行该脚本。

它有时会将签名的邮件移动到 NOSIG 文件夹。

在这些情况下,PR_SECURITY_FLAGS 在模代码行之前和之后都为 0。所以为 0,脚本工作正常,但由于邮件已签名,标志不应该是 0,而是 2。

我多次重复发送相同的签名邮件,只是为了总是看到同样的事情发生。他们中的大多数都得到了正确的对待,而少数人在签名时总是显示标志 0 而不是 2。

我尝试使用 Application.Wait Now + TimeSerial(0, 0, 1) 将脚本暂停 1-5 秒,认为脚本对于 PropertyAccessor 或其他东西来说可能太快了,但暂停不起作用。 (在处理多封邮件时,我感觉不到五秒钟的延迟。)

我开始认为这是一个 Outlook 问题(可能操纵类似于 MessageClass 的安全标志,但并非每次都如此)。

【问题讨论】:

    标签: vba email outlook


    【解决方案1】:

    PR_SECURITY_FLAGS 仅在外发邮件上设置,以告诉 Outlook 在实际发送邮件时对其进行加密。它不会出现在传入的消息中 - 查看带有 OutlookSpy 的消息(我是它的作者 - 单击 IMessage 按钮)。

    对于传入的消息,您可能认为可以检查 MessageClass 属性并查看它是否为 "IPM.Note.SMIME.MultipartSigned",但 OOM 非常努力地将签名和加密的消息表示为常规的 IPM.Note 消息。您必须完全绕过 OOM 并使用扩展 MAPI(仅限 C++ 或 Delphi),或者您可以使用 Redemption(任何语言,包括 VBA,我是它的作者)。像下面这样的东西可以让你检查真正的消息类:

    set Session = CreateObject("Redemption.RDOSession")
    Session.MAPIOBJECT = Application.Session.MAPIOBJECT
    set SourceMsg = Session.GetRDOObjectFromOutlookObject(MAIL_ITEM , true)
    MsgBox SourceMsg.MessageClass
    

    【讨论】:

    • 感谢您的解释。但是,如果PR_SECURITY_FLAGS 仅设置用于外发邮件,为什么我也可以在收到的邮件上阅读它? Outlook是它自己之后设置的吗?我的大多数测试邮件都得到了正确处理,甚至加密。你的“救赎”看起来很有趣,但我认为我不能将它用于我的公司。
    • PR_SECURITY_FLAGS 不是在消息本身上实际设置并由底层存储提供程序公开的属性,它是由 Outlook 对象模型提供的假属性,只能通过 PropertyAccessor 和假的 IMessage 对象公开通过 MailItem.MAPIOBJECT 属性。
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2014-05-08
    • 1970-01-01
    • 2015-03-24
    • 2021-10-31
    • 2018-01-31
    • 2011-10-07
    • 2012-12-08
    相关资源
    最近更新 更多