Как может надстройка Outlook определить, когда электронное письмо удалено - PullRequest
0 голосов
/ 28 мая 2018

Я создал надстройку для Outlook, которая обрабатывает вложения.Когда вложение добавляется в почтовый элемент, я обрабатываю его и добавляю свойство пользователя, содержащее информацию о вложении.У меня есть обработчик события отправки элемента, который выполняет окончательную обработку вложения непосредственно перед отправкой письма.

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

Кто-нибудь может сказать мне, как я могу определить, когда почтовый элемент удаляется?Я думаю, что мне, вероятно, нужно сделать, это определить, когда он удаляется из папки «Удаленные» и удаляется, а не просто перемещается в другую папку.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Нет способа легко поймать что-либо, связанное с удалением сообщения.BeforeDelete не работает надежно, плюс элемент может быть удален, когда ваш код не запущен (например, когда пользователь удаляет его с другого компьютера / телефона / и т. Д.).

Также имейте в виду, что все события MAPI являются асинхронными, поэтому к моменту получения события элемент уже исчез.На уровне MAPI таблица содержимого папки вызывает уведомление TABLE_ROW_DELETED, но, поскольку сообщение уже пропало, вы получите только значение свойства PR_INSTANCE_KEY.Это может быть полезно, только если вы уже знаете PR_INSTANCE_KEY определенного сообщения или если у вас есть список PR_INSTANCE_KEY для всех сообщений в папке.Вы можете увидеть событие в OutlookSpy (нажмите кнопку IMAPIFolder, перейдите на вкладку GetContentsTable, посмотрите журнал в нижней части окна).Если MAPI (C ++ или Delphi) не является опцией, Redemption выставляет событие RDOItems . ItemRemove, которое передает PR_INSTANCE_KEY в качестве параметра.

Другойопция под Exchange Server - API Инкрементная синхронизация изменений .Опять же, это чистый MAPI и требует C ++ или Delphi.Погашение выставляет его через объект RDOFolderSynchronizer .

Единственный общий вариант - периодически сканировать сообщения в папке и проверять их по собственному списку на предмет отсутствия каких-либо элементов.Это может быть узким местом в производительности, даже если вы оптимизируете его с помощью объекта Outlook.Table для извлечения свойств из нескольких элементов за один вызов.

0 голосов
/ 28 мая 2018

Событие BeforeDelete элементов Outlook - это именно то, что вы ищете.

 Public WithEvents myItem As Outlook.MailItem 

 Public Sub DeleteMail() 
   Const strCancelEvent = "Application-defined or object-defined error" 
   On Error GoTo ErrHandler 
   Set myItem = Application.ActiveInspector.CurrentItem 
   myItem.Delete 
 Exit Sub 

 ErrHandler: 
   MsgBox Err.Description 
   If Err.Description = strCancelEvent Then 
     MsgBox "The event was cancelled." 
   End If 
   'If you want to execute the next instruction 
   Resume Next 
  'Otherwise it will finish here 
 End Sub 

 Private Sub myItem_BeforeDelete(ByVal Item As Object, Cancel As Boolean) 
   'Prompts the user before deleting an item 
   Dim strPrompt As String 
   'Prompt the user for a response 
   strPrompt = "Are you sure you want to delete the item?" 
   If MsgBox(strPrompt, vbYesNo + vbQuestion) = vbNo Then 
     'Don't delete the item 
     Cancel = True 
   End If 
 End Sub

Чтобы различать перемещение в папку «Удаленные» и окончательное удаление, можно добавить событие ItemAdd в папку «Удаленные».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...