Как я могу проверить, имеет ли почта действительную цифровую подпись - VBA на Outlook 2010 - PullRequest
2 голосов
/ 30 октября 2019

Мне нужно проверить, подписан ли новый входящий почтовый элемент в Outlook 2010. Если почтовый элемент не подписан, его следует переместить в папку «NOSIG».

Сначала я должен сказать, что я мало что знаю о VBA и мне пришлось много гуглить из-за этого небольшого фрагмента кода. Во время исследования я также обнаружил (и вроде как подтвердил, я полагаю), что 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 для запуска этого скрипта при каждом входящем E-Mail.

Когда я начал тестирование, оказалось, что он "обычно" работает, но, к сожалению, иногда он перемещает даже подписанные письма в папку NOSIG.

В этом случае PR_SECURITY_FLAGS были и в 0, до и после этого Modulo-Codeline. Таким образом, будучи равным 0, скрипт работал правильно, но поскольку почта действительно была подписана, флаг должен был быть не 0, а 2.

Я пытался отправить ту же самую подписанную почту десятки раз, просто чтобы всегда видетьпроисходит то же самое: большинство из них обрабатываются правильно, хотя немногие всегда показывают флаг 0 вместо 2, хотя они все еще подписаны.

Я также пытался приостановить выполнение сценария на 1-5 секунд, когда Application.Wait Now + TimeSerial(0, 0, 1) подумал, что сценарий может быть слишком быстрым для PropertyAccessor или чего-то еще, но казалось, что пауза даже не сработала. (Я не мог «почувствовать» эту задержку в 5 секунд при обработке нескольких писем.)

В конце концов я начинаю думать, что это проблема Outlook (возможно, манипулирование флагами безопасности, аналогичными MessageClass, но не каждый раз). да, нет) но, надеюсь, у кого-нибудь есть решение для подобного варианта использования.

Спасибо за ваше время и хорошего дня! :-)

1 Ответ

2 голосов
/ 30 октября 2019

PR_SECURITY_FLAGS устанавливается только в исходящих сообщениях, чтобы указать Outlook шифровать сообщение, когда оно действительно отправлено. Он не будет присутствовать во входящих сообщениях - взгляните на сообщения с OutlookSpy (нажмите кнопку IMessage).

Для входящих сообщений вы могли бы подумать, что можете проверить MessageClass и посмотрите, является ли оно "IPM.Note.SMIME.MultipartSigned", но OOM очень старается представить подписанные и зашифрованные сообщения как обычные IPM.Note сообщения. Вам придется либо полностью обойти OOM и использовать Extended 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
...