2017-02-21 17 views
0

Не знаете, почему следующий код не удаляет постоянный код MailItem из папки Deleted Items.MailItem.Delete, запрещающий удалить элемент в папке «Удаленные»

MailItem обязательно попадает в папку Deleted Items, но Delete ничего не делает. Размещение второго Delete вызывает исключение, как и следовало ожидать, потому что его нет.

Я могу вручную удалить MailItem через Outlook.

Код:

Dim oOLapp as Outlook.Application 
Dim oMapi as Outlook.NameSpace 
Dim oFolder as Outlook.Folder 
Dim oMailItem as Outlook.MailItem 

oOLapp = GetObject([Class]:="Outlook.Application") 
oMapi = oOLapp.GetNameSpace("MAPI") 
oFolder = oMapi.oFolders(oMapi.DefaultStore.Displayname).Folders("Deleted Items") 

oMailItem = oOLapp.Session.OpenSharedItem("C:\sometestmail.msg") 
oMailItem = oMailItem.Move(oFolder) ' Now in Deleted items Folder. Verified 
' Do other stuff with email 
' . 
' . 
' . 
oMailItem.Delete() 
oMailItem = nothing 
+0

Возможно, потому что это то, что удаляет DOES ... Переместите его в удаленную папку. Если ваш прогноз настроен на удаление по закрытию, они должны исчезнуть, когда вы его закроете. В противном случае они останутся там. –

+0

BUt вы можете проверить эту ссылку http://www.vbforums.com/showthread.php?327965-RESOLVED-Permanently-Delete-Outlook-Items –

+0

Или это https://www.experts-exchange.com/questions /27503590/VBA-to-permanently-delete-emails-instead-of-moving-them-to-the-deleted-folder.html –

ответ

1

Чтобы окончательно удалить MailItem вы должны петлю через Items в папке Deleted.

Для этого посмотрим на следующий код:

Dim oApp As New Outlook.Application 

Dim oMapi As Outlook.NameSpace = oApp.GetNamespace("MAPI") 
Dim oFolders As Outlook.Folders = oMapi.Folders 
Dim oFolder As Outlook.MAPIFolder = oFolders(oMapi.DefaultStore.DisplayName).Folders("Deleted Items") 

Dim oMailItem As Outlook.MailItem = CType(oApp.Session.OpenSharedItem("C:\sometestmail.msg"), Outlook.MailItem) 
oMailItem.UserProperties.Add("DeleteMe", Outlook.OlUserPropertyType.olText) 
oMailItem.Move(oFolder) 
oMailItem = Nothing 

For Each item As Outlook.MailItem In oFolder.Items 
    Dim oProperty As Outlook.UserProperty = item.UserProperties.Find("DeleteMe") 

    If oProperty IsNot Nothing Then 
     item.Delete() 
    End If 
Next 

Мой код будет отличаться на ваш, как я повернулся Option Strict On. Я предлагаю вам сделать то же самое. Это поможет в долгосрочной перспективе.

Обратите внимание, что я устанавливаю UserProperty на MailItem, прежде чем переместить его в папку Deleted. Это поможет идентифицировать этот единственный MailItem, который вы хотите удалить навсегда. Если вы хотите навсегда удалить все MailItems в папке Deleted то это код, который нужно будет:

Dim oApp As New Outlook.Application 

Dim oMapi As Outlook.NameSpace = oApp.GetNamespace("MAPI") 
Dim oFolders As Outlook.Folders = oMapi.Folders 
Dim oFolder As Outlook.MAPIFolder = oFolders(oMapi.DefaultStore.DisplayName).Folders("Deleted Items") 

Dim oMailItem As Outlook.MailItem = CType(oApp.Session.OpenSharedItem("C:\sometestmail.msg"), Outlook.MailItem) 
oMailItem.Move(oFolder) 
oMailItem = Nothing 

For i = oFolder.Items.Count To 1 Step -1 
    CType(oFolder.Items(i), Outlook.MailItem).Delete() 
Next 

Для того, чтобы это работало нужно перебрать в Deleted папку назад. В документации к MSDN в нем указано:

Метод Delete удаляет один элемент в коллекции. Чтобы удалить все элементы в коллекции элементов папки, вы должны удалить каждый элемент, начиная с последнего элемента в папке. Например, в коллекции элементов папки AllItems, если в папке указано n количество элементов, начните удаление элемента на странице AllItems.Item (n), уменьшая индекс каждый раз, пока вы не удалите AllItems.Item (1) ,