2017-01-26 9 views
1



Я создал правило, которое запускает VBA-сценарий в зависимости от субъекта полученного сообщения электронной почты (Правила: Тема «MY_SUBJECT» -> запустить скрипт).
Сценарий VBA затем выполняет некоторые действия, а затем он должен, наконец, удалить исходное электронное письмо.удалить электронную почту из почтового ящика, а также удалить его из удаленной-папки с помощью rule-> сценария

Эта часть легко:

Sub doWorkAndDeleteMail(Item As Outlook.MailItem) 
' doSomething: 

' delete email from inbox 
Item.Delete 
End Sub 


Теперь электронная почта будет сидеть в удаляемой-детале-папке. Но я должен достичь, чтобы удалить эту почту из папки удаленных элементов. Так как я знаю, что предмет этой почты (потому что это вызвало мое правило, в первую очередь), я попытался следующий подход:

Sub doWorkAndDeleteMail(Item As Outlook.MailItem) 
' doSomething: 

' delete email from inbox 
Item.Delete 
End Sub 

' delete email from deleted items-folder 
Dim deletedFolder As Outlook.Folder 

Set deletedFolder = Application.GetNamespace("MAPI"). _ 
    GetDefaultFolder(olFolderDeletedItems) 

Dim i As Long 
For i = myFolder.Items.Count To 1 Step -1 

If (deletedFolder.Items(i).Subject) = "MY_SUBJECT" Then 

deletedFolder.Items(i).Delete 
Exit For 
End If 
Next if 

End Sub 


Ну, это в основном работает: почту с этой темой можно найти в deleted-items-folder, и он будет удален, да. Но, к сожалению, это не работает должным образом: Это постоянное удаление работает только после запуска скрипта во второй раз.

Таким образом, электронное письмо, запускающее мой скрипт, никогда не будет удалено постоянно в реальном прогоне этого сценария, но только в следующем прогоне (после того, как будет получено следующее письмо с объектом-триггером для моего правила), но затем это самое следующее электронная почта не будет удалена, снова).

Вы не знаете, что я делаю неправильно здесь? Как-то похоже, что мне нужно как-то обновить папку с удаленными предметами. Или мне нужно сделать первый мой Item.Delete как-то явно?

+1

http://stackoverflow.com/questions/1110612/permanently-delete-mailmessage-in-outlook-with-vba –

+0

Я видел это решение раньше, да. У меня нет RDO или CDO (также я хочу независимое решение). Третий apporach там (маркировка почты с имуществом) выглядит совершенно одинаково для моего: не имеет значения, ищу ли я предмет или другое свойство. Немного больше в нижней части этой темы кто-то утверждает, что существует метод «удалить», который будет удалять почтовый элемент с самого начала. Но этот метод удаления, похоже, не существует для типа «Outlook.MailItem» (который является входом сценария).Во всяком случае: я хотел бы знать, что не так с моим подходом. – and0r

+0

Я пробовал настройку и искал тему: как и ожидалось, поведение точно такое же. Удаление выполняется только при запуске скрипта в следующий раз. – and0r

ответ

0

Тим Уильямс предложил другую существующую нить. Я уже посмотрел на это раньше и решил, что appoach будет точно таким же представлением моей ошибки. Я попробовал это, хотя (чтобы показать мотивировку :)), но поведение - как и ожидалось - точно так же: снова окончательное удаление работает только при следующем запуске скрипта по правилу:

Sub doWorkAndDeleteMail(Item As Outlook.MailItem) 
' First set a property to find it again later 
Item.UserProperties.Add "Deleted", olText 
Item.Save 
Item.Delete 

'Now go through the deleted folder, search for the property and delete item 
Dim objDeletedFolder As Outlook.Folder 
Dim objItem As Object 
Dim objProperty As Variant 

Set objDeletedFolder = Application.GetNamespace("MAPI"). _ 
    GetDefaultFolder(olFolderDeletedItems) 
For Each objItem In objDeletedFolder.Items 
    Set objProperty = objItem.UserProperties.Find("Deleted") 
    If TypeName(objProperty) <> "Nothing" Then 
     objItem.Delete 
    End If 
Next 

End Sub 

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

+0

Кстати, я также попробовал aproach ждать 5 секунд между «удалением из папки« Входящие »и« удалением из удаленных файлов », элементы ", используя цикл while, ожидающий тиков (со стандартным« сном »все приложение зависает), но и это ожидание здесь не помогло. Я определенно пропустил что-то здесь ... :( Папка удаленных элементов, похоже, не знает об этом удаленном элементе, пока не будет запущен следующий скрипт. Но почему бы и нет? – and0r

+0

Вы пробовали itemAdd даже для удаления трюков, когда элемент перемещен в удаленная папка? Или я, когда ваше правило закончит что-то делать, а затем запустите цикл для удаления элементов из папки «Входящие» - сообщите мне, если вам нужны примеры – 0m3r

+0

@ 0m3r, я не знаю, как это сделать. Пример будет приятным. – and0r

0

попробовать что-то вроде этого, код идет под ThisOutlookSession

Private WithEvents Items As Outlook.Items 
Private Sub Application_Startup() 
    Dim olNs As Outlook.NameSpace 
    Dim DeletedFolder As Outlook.MAPIFolder 

    Set olNs = Application.GetNamespace("MAPI") 
    Set DeletedFolder = olNs.GetDefaultFolder(olFolderDeletedItems) 
    Set Items = DeletedFolder.Items 
End Sub 

Private Sub Items_ItemAdd(ByVal Item As Object) 
    Dim olNs As Outlook.NameSpace 
    Dim DeletedFolder As Outlook.MAPIFolder 
    Dim Items As Outlook.Items 
    Dim Filter As String 
    Dim i As Long 

    Set olNs = Application.GetNamespace("MAPI") 
    Set DeletedFolder = olNs.GetDefaultFolder(olFolderDeletedItems) 

    Filter = "[Subject] = 'MY_SUBJECT'" 

    Set Items = DeletedFolder.Items.Restrict(Filter) 

    If TypeOf Item Is Outlook.MailItem Then 

     For i = Items.Count To 1 Step -1 
      DoEvents 
      Items.Remove i 
     Next 

    End If 
End Sub 

Редактировать

Sub doWorkAndDeleteMail(Item As Outlook.MailItem) 
    ' First set a property to find it again later 
    Item.UserProperties.Add "Deleted", olText 
    Item.Save 
    Item.Delete 

    'Now go through the deleted folder, search for the property and delete item 
    Dim olNs As Outlook.NameSpace 
    Dim DeletedFolder As Outlook.MAPIFolder 
    Dim Items As Outlook.Items 
    Dim Filter As String 
    Dim i As Long 

    Set olNs = Application.GetNamespace("MAPI") 
    Set DeletedFolder = olNs.GetDefaultFolder(olFolderDeletedItems) 

    Filter = "[Subject] = 'MY_SUBJECT'" 

    Set Items = DeletedFolder.Items.Restrict(Filter) 

    If TypeOf Item Is Outlook.MailItem Then 

     For i = Items.Count To 1 Step -1 
      DoEvents 
      Items.Remove i 
     Next 

    End If 
End Sub 
+0

Спасибо за ваш ответ. Я скопировал этот скрипт в этом сеансе Outlook и отправил себе электронное письмо с темой «MY_SUBJE КТ». Затем я вручную удалил его из папки «Входящие». Но он все еще отображается в папке delete items. Это странно. Нужно ли мне активировать события? – and0r

+0

@ and0r Вы перезапустили свой Outlook после добавления кода – 0m3r

+0

Да, я это сделал. Работает ли это для вас? Я использую Office 365 (Outlook v16.0 ...) – and0r

0

Проблема не была воссоздана, но попробуйте шагая через это, то работает нормально, если он, как представляется, делай что хочешь.

Sub doWorkAndDeleteMail(Item As mailitem) 

Dim currFolder As Folder 
Dim DeletedFolder As Folder 

Dim i As Long 
Dim mySubject As String 

Set currFolder = ActiveExplorer.CurrentFolder 
mySubject = Item.Subject 
Debug.Print mySubject 

Set DeletedFolder = GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems) 

Set ActiveExplorer.CurrentFolder = DeletedFolder 

Debug.Print "DeletedFolder.count before delete: " & DeletedFolder.Items.count 
' delete email from deleted items-folder 
Item.Delete 
Debug.Print "DeletedFolder.count after delete: " & DeletedFolder.Items.count 

' If necessary 
'DoEvents 

For i = DeletedFolder.Items.count To 1 Step -1 

    Debug.Print DeletedFolder.Items(i).Subject 

    If (DeletedFolder.Items(i).Subject) = mySubject Then 

     Debug.Print DeletedFolder.Items(i).Subject & " *** found ***" 

     DeletedFolder.Items(i).Delete 

     Exit For 

    End If 
Next 

Set ActiveExplorer.CurrentFolder = currFolder 

End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^