10

我正在寻找一种使用 VBA 代码从 Outlook 2000 中永久删除 MailMessage 的方法。我想这样做而不必进行第二次循环来清空已删除的项目。

本质上,我正在寻找与单击消息并单击SHIFT+的 UI 方法等效的代码DELETE

有这样的事吗?

4

5 回答 5

14

尝试先移动它然后删除它(适用于 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

您也可以先标记该消息,然后再删除它,然后循环遍历已删除的项目文件夹,然后再次调用 delete 找到它。使用 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
于 2009-07-10T18:03:04.370 回答
2

最简单的解决方案,类似于第一种方式:

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

做两次,它就会永远消失,并且没有性能杀伤循环。(如果不在默认存储中,NameSpace 可以是特定的命名空间变量。)请注意,这仅在您不跨存储删除时才有效,这可能会更改 EntryID 或将其完全删除。

于 2010-04-21T05:08:18.530 回答
2

I know this is an old thread, but since I recently had cause to write a macro that does this, I thought I'd share. I found that the Remove method appears to be a permanent deletion. I'm using this snippet:

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

I begin with a list of items that have been filtered by some criteria. Then, I just delete one at a time until it's gone.

HTH

于 2012-09-14T14:10:17.213 回答
1

您可以使用以下方法,基本上您可以像当前一样删除所有电子邮件,然后调用这一行来清空已删除的项目文件夹。代码在 jscript 中,但如果你真的需要我,我可以翻译 :)

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

app.ActiveExplorer().CommandBars("Menu Bar").Controls("Tools").Controls('Empty "Deleted Items" Folder').Execute();
于 2009-10-21T03:11:40.030 回答
1

最近我不得不永久删除所有联系人。这对我有用(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
于 2019-10-02T14:16:59.287 回答