Навсегда удалить MailMessage в Outlook с помощью VBA?

Я ищу способ навсегда удалить MailMessage из Outlook 2000 с кодом VBA. Я хотел бы сделать это без необходимости выполнять второй цикл для очистки удаленных элементов.

По сути, я ищу код, эквивалентный методу пользовательского интерфейса, когда щелкаешь сообщение и нажимаешь SHIFT+DELETE.

Что-то подобное существует?


person eidylon    schedule 10.07.2009    source источник


Ответы (5)


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

  Set objDeletedItem = objDeletedItem.Move(DeletedFolder)
  objDeletedItem.Delete

способ CDO

Set objCDOSession = CreateObject("MAPI.Session")
objCDOSession.Logon "", "", False, False
Set objMail = objCDOSession.GetMessage(objItem.EntryID, objItem.Parent.StoreID)
objMail.Delete

RDO

set objRDOSession = CreateObject("Redemption.RDOSession")
objRDOSession.MAPIOBJECT = objItem.Session.MAPIOBJECT 
set objMail = objRDOSession.GetMessageFromID(objItem.EntryID>)
objMail.Delete

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

objMail.UserProperties.Add "Deleted", olText
objMail.Save
objMail.Delete

прокручивайте удаленные элементы, ищите этот userprop

 Set objDeletedFolder = myNameSpace.GetDefaultFolder(olFolderDeletedItems)
    For Each objItem In objDeletedFolder.Items
        Set objProperty = objItem.UserProperties.Find("Deleted")
        If TypeName(objProperty) <> "Nothing" Then
            objItem.Delete
        End If
    Next
person 76mel    schedule 10.07.2009
comment
Я бы предпочел не использовать CDO или RDO, потому что вся моя цель здесь заключалась в том, чтобы уменьшить сложность кода, и я бы не хотел вводить все новые зависимости. Второе — это в основном то, чем я сейчас занимаюсь. Сначала я делаю (псевдо): для каждого сообщения в папке «Входящие» msg.delete '// переходит к удаленным элементам, следующим для каждого сообщения в файле deleteItems msg.delete '// удаляет навсегда, тогда как я хотел бы сделать что-то вроде: для каждого сообщения в папке «Входящие» msg.delete(permanent = true) следующий - person eidylon; 10.07.2009
comment
В 2000 такого метода нет. Вам придется создать свою функцию в VBA. Что не так с перемещением-удалением или вашим циклом? это производительность? - person 76mel; 10.07.2009
comment
В этом нет ничего плохого, я просто искал способ сделать это более чисто, чем полагаться на два цикла. Все равно спасибо. - person eidylon; 14.07.2009
comment
Для RDO можно заменить строку objRDOSession.Logon на objRDOSession.MAPIOBJECT = Application.Sessionn.MAPIOBJECT - person Dmitry Streblechenko; 05.03.2014

Самое простое решение, похожее на первый способ:

  FindID = deleteme.EntryID
  deleteme.Delete
  set deleteme = NameSpace.GetItemFromID(FindID)
  deleteme.Delete

Сделайте это дважды, и это исчезнет навсегда, и не будет петли, убивающей производительность. (NameSpace может быть определенной переменной пространства имен, если она не находится в хранилище по умолчанию.) Обратите внимание, что это работает, только если вы не удаляете данные из разных хранилищ, что может изменить EntryID или полностью удалить его.

person SilverbackNet    schedule 21.04.2010
comment
Это будет работать только для хранилища PST, где идентификатор записи сообщения не изменяется при перемещении в другую папку. Он не будет работать в магазине Exchange (ни в кэше, ни в сети). - person Dmitry Streblechenko; 05.03.2014
comment
Это изменилось в последнее время? Первоначально я сделал это для почтовых ящиков Exchange 2007. - person SilverbackNet; 05.03.2014
comment
Нет, так всегда было с магазинами PST и Exchange. - person Dmitry Streblechenko; 05.03.2014

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

While oFilteredItems.Count > 0
    Debug.Print "   " & oFilteredItems.GetFirst.Subject
    oFilteredItems.Remove 1
Wend

Я начинаю со списка элементов, которые были отфильтрованы по некоторым критериям. Затем я просто удаляю по одному, пока он не исчезнет.

ХТН

person end-user    schedule 14.09.2012
comment
Здорово! Я подтверждаю, что это работает для меня. Я использую Application.ActiveExplorer.CurrentFolder.Items.Remove(1) в тестовой папке в макросе VBA. - person Andrei Smolin - Add-in Express; 26.12.2013

Вы можете использовать следующий подход: в основном вы удаляете все свои сообщения электронной почты, как вы это делаете сейчас, а затем вызываете эту одну строку, чтобы очистить папку удаленных элементов. Код в jscript, но я могу перевести, если вам это действительно нужно :)

var app = GetObject("", "Outlook.Application"); //use new ActiveXObject if fails

app.ActiveExplorer().CommandBars("Menu Bar").Controls("Tools").Controls('Empty "Deleted Items" Folder').Execute();
person Marcus Pope    schedule 21.10.2009
comment
+1, но я бы использовал идентификатор FindControl, чтобы убедиться, что он работает в неанглийских версиях Outlook. - person JimmyPena; 18.11.2011

Недавно мне пришлось навсегда удалить все контакты. Это сработало для меня (Outlook 2016). Вы получили новую ссылку на элемент в папке корзины, в противном случае он говорит «уже удален» или что-то в этом роде. Просто перейдите с конца, и недавно перемещенные элементы будут там. Затем вызов Delete приводит к постоянному удалению. Этот фрагмент можно использовать в цикле.

    myContacts(i).Move (trashFolder)
    trashCount = trashFolder.Items.Count
    For j = trashCount To 1 Step -1
        Set trashItem = trashFolder.Items(j)
        If trashItem.MessageClass = "IPM.Contact" Then
            trashItem.Delete
        Else
            Exit For
        End If
    Next
person Mr. TA    schedule 02.10.2019