2009-07-10 15 views
8

Ich suche nach einer Möglichkeit, eine MailMessage aus Outlook 2000 mit VBA-Code dauerhaft zu löschen. Ich möchte dies tun, ohne eine zweite Schleife zu machen, um die gelöschten Objekte zu leeren.MailMessage in Outlook mit VBA dauerhaft löschen?

Im Wesentlichen, ich suche nach einem Code entspricht das UI-Verfahren zur Herstellung eine Nachricht klicken und das Schlagen SHIFT + DELETE.

Gibt es so etwas?

Antwort

11

Versuchen Sie es zuerst, dann bewegt es zu löschen (funktioniert bei einigen patchs im Jahr 2000) oder RDO oder CDO verwenden, um die Arbeit zu erledigen für Sie (Sie sie müssen installieren)

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

CDO Weg

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 

Sie könnten markieren auch die Nachricht zuerst, bevor Sie es und th löschen Blättern Sie durch den Ordner "Gelöschte Objekte" und finden Sie ihn erneut. Markieren Sie es mit einer Benutzereigenschaft.

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

Schleife durch Sie gelöschte Elemente für dieses userprop suchen

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 
+0

Ich möchte lieber nicht CDO oder RDO gehen, Cuz meine ganze Punkt hier war die Komplexität des Codes zu reduzieren, und ich möchte lieber gehen nicht alle neuen Abhängigkeiten einzuführen. Die zweite ist grundlegend was ich gerade mache. Ich zuerst (Pseudo): für jede Nachricht im Posteingang msg.delete '// bewegt sich zu gelöschten Elementen nächste für jede msg in deletedItems msg.löschen ‚// permanent nächst während das, was löscht Sie mag, etwas zu tun, würde wie: für jede msg in Posteingang msg.delete (permanent = true) nächsten – eidylon

+0

Es gibt kein solches Verfahren im Jahr 2000. Sie müssen Ihre eigene Funktion in VBA erstellen. Was ist los mit dem Verschieben-Löschen oder deiner Schleife? ist es Leistung? – 76mel

+0

Nichts von Natur aus "falsch", ich war nur auf der Suche nach einer Möglichkeit, es sauberer zu tun als auf zwei Schleifen. Trotzdem danke. – eidylon

1

Sie den folgenden Ansatz verwenden können, im Grunde Sie alle Ihre E-Mail-Nachrichten löschen, wie Sie zur Zeit tun werden, dann rufen diese eine Zeile Leeren Sie den Ordner für gelöschte Objekte. Der Code ist in JScript, aber ich kann übersetzen, wenn du mich brauchst wirklich :)

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

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

+1 ersetzen, aber ich würde die FindControl ID verwenden, um sicherzustellen, dass es auf nicht-englischen Versionen von Outlook funktioniert. – JimmyPena

1

Simplest Lösung von allen, ähnlich der ersten Art und Weise:

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

es zweimal tun und es wird für immer weg sein, und keine Performance-Killer-Schleife. (NameSpace kann eine bestimmte Namespacevariable sein, wenn nicht im Standardspeicher.) Beachten Sie, dass dies nur funktioniert, wenn Sie nicht zwischen Filialen löschen, wodurch die EntryID geändert oder vollständig entfernt werden kann.

+0

Dies funktioniert nur für einen PST-Speicher, in dem die Nachrichteneingangs-ID nicht geändert wird, wenn sie in einen anderen Ordner verschoben wird. Es funktioniert nicht un Exchange-Speicher (entweder zwischengespeichert oder online). –

+0

Hat sich das in letzter Zeit geändert? Ich habe dies ursprünglich für Exchange 2007-Postfächer getan. – SilverbackNet

+0

Nein, das war bei PST Stores gegen Exchange immer der Fall. –

1

Ich weiß, dass dies ein alter Thread ist, aber da ich kürzlich einen Grund hatte, ein Makro zu schreiben, das das tut, dachte ich, ich würde teilen. Ich habe festgestellt, dass die Remove-Methode eine permanente Löschung ist. Ich verwende dieses Codefragment:

Ich beginne mit einer Liste von Elementen, die nach bestimmten Kriterien gefiltert wurden. Dann lösche ich einfach eine nach der anderen, bis sie weg ist.

HTH

+0

Großartig! Ich bestätige, dass es für mich funktioniert. Ich verwende Application.ActiveExplorer.CurrentFolder.Items.Remove (1) in einem Testordner in einem VBA-Makro. –