В надстройке 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