outlook - 加密的 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 返回的其他值,我需要对其进行编码。
解决方案
你永远不应该检查整个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
推荐阅读
- django - 如何在 AWS 上运行的 Dockerized Django Web 应用程序中使用 SMTP
- javascript - 将对象保留在数组中并删除剩余的
- python - 如何修复“错误:fa2 构建轮子失败”?
- python - 根据特定条件将单元格值转换为数据框中的数组
- python - 评估顺序,Unicode字符串和格式
- reactjs - 如何取消选中选定的无线电输入 onChange 并对重置当前显示数据做出反应?
- javascript - 通过 http 调用等读取 html 页面的 DOM
- json - 有没有办法将一堆 JSON 文件导入 Excel
- python - 如何使用 Django 表单在前端显示模型字段值的动态和可靠列表?
- php - Laravel 从存储中下载文件导致内部服务器错误(状态码 500)