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

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

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

есть ли такая вещь?

4 ответов


попробуйте сначала переместить его, а затем удалить (работает на некоторых патчах в 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.Logon 
set objMail = objRDOSession.GetMessageFromID(objItem.EntryID>)
objMail.Delete

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

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

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

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

app.ActiveExplorer().CommandBars("Menu Bar").Controls("Tools").Controls('Empty "Deleted Items" Folder').Execute();

самое простое решение из всех, подобное первому способу:

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

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


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

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

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

HTH