首页 > 解决方案 > 加密的 MailItem 的 PR_ATTACH_FLAGS 属性在移动到另一个文件夹后为内联附件返回 5

问题描述

在针对 Outlook 2016 的 VSTO Outlook 插件中,我目前正在将加密的电子邮件复制到另一个文件夹,将其从非内联附件中剥离并解密。这是通过以下代码完成的。

代码从电子邮件的检查器功能区运行,因此用户输入了私钥来查看电子邮件。

        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。

我尝试在解密之前移动附件循环,但这没有任何区别。

我将字符串传递给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 的附件表

标签: outlookvstooutlook-addin

解决方案


你永远不应该检查整个PR_ATTACH_FLAGS值,只检查一个特定的位集。例如 5 是ATT_INVISIBLE_IN_HTML | ATT_MHTML_REF. 双击 OutlookSpy 中的附件并选择PR_ATTACH_FLAGS属性以查看值。

如果您正在检查嵌入的 HTML 图像,PR_ATTACH_FLAGS它会变得不可靠。您实际上需要阅读 HTML 正文并确定是否有任何标签通过(检查属性)或文件名或位置img来引用图像。cidPR_ATTACH_CONTENT_ID


推荐阅读