2009-07-10 24 views
8

Estoy buscando una manera de eliminar permanentemente un MailMessage de Outlook 2000 con código VBA. Me gustaría hacer esto sin tener que hacer un segundo ciclo para vaciar los elementos eliminados.¿Eliminar permanentemente MailMessage en Outlook con VBA?

Esencialmente, Busco un código equivalente al método de la interfaz de usuario de hacer clic en un mensaje y golpear SHIFT +BORRAR.

¿Existe tal cosa?

Respuesta

11

Trate de mover primero y luego eliminarlo (funciona en algunos parches en 2000) o utilizar RDO o CDO para hacer el trabajo para usted (que tendrá que instalarlos)

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

CDO manera

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 

también puede marcar el mensaje en primer lugar antes de eliminarlo y TH Haga un bucle en la carpeta de elementos eliminados y búsquela como una llamada para borrarla por segunda vez. Marcarlo usando una propiedad de usuario.

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

bucle a través de que los elementos eliminados buscan que 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 
+0

prefiero no ir CDO o RDO, Porque toda mi punto aquí era reducir la complejidad del código, y yo no quiere ir introduciendo todas las nuevas dependencias. Lo segundo es básicamente lo que estoy haciendo ahora. Primero hago (pseudo): para cada msg en la bandeja de entrada msg.delete '// mueve a los elementos eliminados siguiente para cada msg en deletedItems msg.Eliminar '// borra de forma permanente próxima mientras que lo que me gustaría hacer, es algo así como: para cada msg en la bandeja de entrada msg.delete (permanente = true) próxima – eidylon

+0

No hay tal método en el año 2000. Deberá crear su propia función en VBA. ¿Qué pasa con el movimiento-eliminar o su ciclo? ¿es rendimiento? – 76mel

+0

Nada inherentemente "incorrecto" con él, solo estaba buscando una forma de hacerlo más limpiamente que confiar en dos bucles. Gracias de todos modos. – eidylon

1

Puede utilizar el siguiente enfoque, básicamente borra todos los mensajes de correo electrónico que está haciendo actualmente, a continuación, llamar a esto una línea a vaciar la carpeta de elementos eliminados. El código está en JScript, pero puede traducir si realmente me necesita :)

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 pero utilizaría el ID de FindControl para asegurarse de que funciona en versiones de Outlook que no sean en inglés. – JimmyPena

1

solución más simple de todos, similar a la primera forma:

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

hacerlo dos veces y va se habrá ido para siempre, y no habrá un bucle de muerte de rendimiento. (NameSpace puede ser una variable de espacio de nombres particular, si no está en la tienda predeterminada.) Tenga en cuenta que esto solo funciona si no elimina en las tiendas, lo que puede cambiar el EntryID o eliminarlo por completo.

+0

Esto solo funcionará para una tienda PST donde la identificación de entrada de mensaje no se cambia cuando se mueve a una carpeta diferente. No funcionará en un almacén de Exchange (ya sea en caché o en línea). –

+0

¿Ha cambiado esto recientemente? Originalmente hice esto para los buzones de Exchange 2007. – SilverbackNet

+0

No, ese siempre ha sido el caso con las tiendas PST contra Exchange. –

1

Sé que este es un hilo viejo, pero dado que recientemente tuve motivos para escribir una macro que hace esto, pensé que lo compartiría. Descubrí que el método Eliminar parece ser una eliminación permanente. Estoy usando este fragmento:

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

Comienzo con una lista de elementos que se han filtrado según algunos criterios. Entonces, simplemente borro uno por vez hasta que se va.

HTH

+0

¡Genial! Confirmo que funciona para mí. Uso Application.ActiveExplorer.CurrentFolder.Items.Remove (1) en una carpeta de prueba en una macro de VBA. –

Cuestiones relacionadas