Мне нужно проверить, подписан ли новый входящий почтовый элемент в 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, но не каждый раз). да, нет) но, надеюсь, у кого-нибудь есть решение для подобного варианта использования.
Спасибо за ваше время и хорошего дня! :-)