una remitente reglas que por organizar ordenar mover los lleguen hacer fecha eliminar crear correos como carpetas carpeta año automaticamente outlook vsto

remitente - VSTO: procesa el correo usando newmailex antes de que las reglas de Outlook muevan el correo



ordenar correos outlook por fecha (2)

Estoy creando un complemento para Outlook 2007 que lee un elemento de correo cuando se recibe y luego lo reescribe. El complemento funciona muy bien y reescribe el correo para los elementos que no tienen una regla de Outlook que los mueve a otra carpeta. Si hay una regla, todavía está bien aproximadamente el 50% del tiempo. El otro 50% de las veces, la regla mueve el elemento de correo antes de que termine mi complemento. Obtuve el siguiente error:

"La operación no se puede realizar porque el objeto se ha eliminado".

Estoy usando el evento NewMailEx para llamar a mi función de reescritura:

private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail); }

En Outlook 2007, NewMailEx da un entryID para el correo. Este entryID se usa inicialmente para descubrir qué objeto de correo usar:

Outlook.NameSpace outlookNS = this.Application.GetNamespace("MAPI"); Outlook.MAPIFolder mFolder = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); Outlook.MailItem mail; try { mail = (Outlook.MailItem)outlookNS.GetItemFromID(entryIDCollection, Type.Missing); } catch (Exception e) { Debug.WriteLine("exception with non-mail item " + entryIDCollection + ": " + e.ToString()); return; }

Pensé que podría tomar este entryID (que funciona el código anterior), e iterar a través de todas mis carpetas (tanto en el intercambio como en mi computadora) buscando el mismo ID de correo. Cuando finalmente repito hasta donde está el correo, el EntryID del correo movido es muy diferente al entryIDCollection.

Tal vez estoy haciendo esto de la manera incorrecta. ¿Alguien sabe cómo evitar que el evento se propague hasta que termine o cómo rastrear el correo electrónico movido?

Aquí está mi código para atravesar las carpetas por si alguien tiene curiosidad:

try { mail.Subject = new_subj; mail.Body = ""; mail.HTMLBody = text; mail.ClearConversationIndex(); mail.Save(); } catch (Exception ex) { //It wasn''t caught in time, so we need to find the mail: ArrayList unreadFolders = new ArrayList(); foreach (Outlook.Folder f in outlookNS.Folders) unreadFolders.Add(f); while (unreadFolders.Count > 0) { Outlook.Folder currentFolder = unreadFolders[0] as Outlook.Folder; Debug.WriteLine("reading folder: " + currentFolder.Name); unreadFolders.RemoveAt(0); foreach (Outlook.Folder f in currentFolder.Folders) unreadFolders.Add(f); try { Outlook.Items items = currentFolder.Items.Restrict("[UnRead] = true"); for (int itemNum = 1; itemNum <= items.Count; itemNum++) { if (!(items[itemNum] is Outlook.MailItem)) continue; Outlook.MailItem m = items[itemNum]; if (m.EntryID == entryIDCollection) { m.Subject = new_subj; m.Body = ""; m.HTMLBody = text; m.ClearConversationIndex(); m.Save(); return; } } } catch (Exception exc) { } } }


Idea no probada: si obtiene el evento NewMailEx de manera confiable, marque el Correo con una propiedad de usuario o kilometraje con un GUID y luego use Buscar para eso.

Es posible que esto no funcione ya que es posible que no pueda ingresar antes de que la Regla mueva el correo.

Como ha calculado, EntryId cambia cuando se mueve el elemento.

De otra manera, debe ver los accesorios de MAPI para obtener PR_SEARCH_KEY que dosent cambia cuando se mueve el correo.


La respuesta de 76mel funcionó muy bien. Estoy publicando mi código resultante solo en caso de que otros quieran hacer algo similar (soy nuevo y no estoy seguro sobre las reglas de publicar mucho código, así que lo siento si va en contra de las reglas):

private string getPRSearchKey(Outlook.MailItem m) { return m.PropertyAccessor.BinaryToString(m.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x300B0102")); } private void olApp_NewMail(string entryIDCollection) { Outlook.NameSpace outlookNS = this.Application.GetNamespace("MAPI"); Outlook.MAPIFolder mFolder = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); Outlook.MailItem mail; string pr_search_key; string old_subj; string old_body; try { mail = (Outlook.MailItem)outlookNS.GetItemFromID(entryIDCollection, Type.Missing); pr_search_key = getPRSearchKey(mail); //save the pr_search_key, subject, and body before the mailItem gets moved // then we can work on it without worrying about them disappearing old_subj = mail.Subject; old_body = mail.Body; } catch (Exception e) { Debug.WriteLine("exception with non-mail item " + entryIDCollection + ": " + e.ToString()); return; } // // ... do stuff with the mail''s body and subject // try { mail.Subject = new_subj; mail.Body = ""; mail.HTMLBody = text; mail.ClearConversationIndex(); mail.Save(); } catch (Exception ex) { //It wasn''t caught in time, so we need to find the mail: ArrayList unreadFolders = new ArrayList(); foreach (Outlook.Folder f in outlookNS.Folders) unreadFolders.Add(f); while (unreadFolders.Count > 0) { Outlook.Folder currentFolder = unreadFolders[unreadFolders.Count-1] as Outlook.Folder; Debug.WriteLine("reading folder: " + currentFolder.Name); unreadFolders.RemoveAt(unreadFolders.Count - 1); foreach (Outlook.Folder f in currentFolder.Folders) unreadFolders.Add(f); try { Outlook.Items items = currentFolder.Items.Restrict("[UnRead] = true"); for (int itemNum = 1; itemNum <= items.Count; itemNum++) { if (!(items[itemNum] is Outlook.MailItem)) continue; Outlook.MailItem m = items[itemNum]; if (getPRSearchKey(m) == pr_search_key) { m.Subject = new_subj; m.Body = ""; m.HTMLBody = text; m.ClearConversationIndex(); //don''t think this works m.Save(); return; } } } catch (Exception exc) { } } } }

Por cierto, algo que probablemente cambie es omitir consultar ciertas carpetas para acelerarlo un poco (Diario, Elementos eliminados, Correo electrónico no deseado, Borradores, Fuentes RSS, Microsoft en el hogar, Tareas, Notas, Contactos, Calendario, Enviado Artículos, Bandeja de salida).