Свойство PR_ATTACH_FLAGS зашифрованного MailItem возвращает 5 для встроенного вложения после перемещения в другую папку. - PullRequest
0 голосов
/ 03 августа 2020

В надстройке VSTO Outlook, предназначенной для Outlook 2016, я в настоящее время копирую зашифрованное электронное письмо в другую папку, удаляя из него не встроенные вложения и расшифровывая его. Это делается с помощью следующего кода.

Код запускается с ленты инспектора электронной почты, поэтому пользователь ввел закрытый ключ для просмотра электронной почты.

        olNS = Globals.ThisAddIn.Application.Session
        olFolder = CType(olNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDeletedItems), Outlook.Folder)
        olMailItemCopy = CType(oMail.Copy, Outlook.MailItem)
        olMailItemMoved = CType(olMailItemCopy.Move(olFolder), Outlook.MailItem)

        'throwing in a save in case it helped
        olMailItemMoved.Save()

        'showEncrypted is a boolean flag to indicate if the mailitem is encrpted
        If showEncrypted Then
            '**EncryptionAction is simply a function to remove encryption by setting
            '**the Const PR_SECURITY_FLAGS As String = "http://schemas.microsoft.com/mapi/proptag/0x6E010003" to 0 on the mail item.
            Globals.ThisAddIn.EncryptionAction(aMailItem:=olMailItemMoved, decryptIt:=showEncrypted)
        End If
        'throwing in a save in case it helped
        olMailItemMoved.Save()

        olAttchs = CType(olMailItemMoved.Attachments, Outlook.Attachments)

        For i = olAttchs.Count To 1 Step -1
            oAttch = CType(olAttchs.Item(i), Outlook.Attachment)
            'IsInlineAttachment checkes for the PR_ATTACH_FLAGS property
            If Not DBAttachment.IsInlineAttachment(oAttch, olMailItemMoved) Then
                oAttch.Delete()
                Log(String.Concat("CopyMoveAndThenRemoveAttachments - Removed ", i.ToString, " attachment."))
            End If
            If oAttch IsNot Nothing Then
                Log(String.Concat("CopyMoveAndThenRemoveAttachments - Releasing the oAttch Object. Ref Count: ", ReleaseComObject(oAttch).ToString))
                oAttch = Nothing
            End If
        Next

        olMailItemMoved.Save()

Проблема, которая у меня есть заключается в том, что при проверке встроенных вложений в приведенном выше примере с функцией IsInlineAttachement PR_ATTACH_FLAGS возвращает 5, если электронное письмо зашифровано (или, как вы можете видеть выше, только что было расшифровано), и возвращает 4, если это обычное электронное письмо. Насколько я понимаю, он должен вернуть 4.

Я попытался переместить вложения l oop ПЕРЕД расшифровкой, но это не имело никакого значения.

Я передаю строку Const PR_ATTACH_FLAGS As String = "http://schemas.microsoft.com/mapi/proptag/0x37140003" в вспомогательную функцию ниже и используйте Clng (res) для преобразования в long.

Private Shared Function GetExtendedPropertyValue(ByVal anAttach As Outlook.Attachment, ByVal aProperty As String, ByRef res As Object) As Boolean

    Dim oPropAcc As Outlook.PropertyAccessor = Nothing

    Try
        oPropAcc = DirectCast(anAttach.PropertyAccessor, Outlook.PropertyAccessor)
        res = oPropAcc.GetProperty(aProperty)

        Return True
    Catch ex As System.Exception
        Trace.WriteLineIf(dbAppLog, String.Concat("DBAttachment - GetExtendedPropertyValue - Error generally in method. Message: - EXCEPTION - ", ex.ToString))
    Finally
        If Not oPropAcc Is Nothing Then
            ReleaseComObject(oPropAcc)
            oPropAcc = Nothing
        End If
    End Try
    Return False
End Function

Следует отметить, что когда возвращается 5, я проверил свойство Const PR_ATTACH_CONTENT_ID As String = "http://schemas.microsoft.com/mapi/proptag/0x3712001E", и оно возвращает строку, которая присутствует в HTMLBody, поэтому я Я предполагаю, что это все еще встроенное вложение.

Я хотел бы понять, почему я получаю 5, и если случайно могут быть другие значения, возвращаемые PR_ATTACH_FLAGS, для которых мне нужно кодировать.

Вот таблица вложений от Outlookspy

1 Ответ

0 голосов
/ 08 августа 2020

Вы никогда не должны проверять все значение PR_ATTACH_FLAGS, только для определенного набора битов. Например, 5 - это ATT_INVISIBLE_IN_HTML | ATT_MHTML_REF. Дважды щелкните вложение в OutlookSpy и выберите свойство PR_ATTACH_FLAGS, чтобы увидеть значения.

Если вы проверяете встроенные изображения HTML, PR_ATTACH_FLAGS настолько ненадежен, насколько это возможно. На самом деле вам нужно прочитать тело HTML и выяснить, относятся ли какие-либо теги img к изображениям либо по cid (проверьте свойство PR_ATTACH_CONTENT_ID), либо по имени или местоположению файла.

...