Sto creando un addon per Outlook 2007 che legge un elemento di posta quando viene ricevuto e quindi lo riscrive. L'addon funziona alla grande e riscrive la posta per gli elementi che non hanno una regola di Outlook che li sposta in un'altra cartella. Se c'è una regola, va ancora bene circa il 50% delle volte. L'altro 50% delle volte, la regola sposta l'oggetto prima che il mio addon termini. Ottengo il seguente errore:VSTO: elabora la posta utilizzando newmailex prima delle regole di Outlook sposta la posta
"The operation cannot be performed because the object has been deleted."
Sto usando evento NewMailEx chiamare la mia funzione di riscrittura:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail);
}
In Outlook 2007, NewMailEx dà un entryID per la posta. Questo entryID è utilizzato inizialmente per capire quale oggetto posta elettronica da utilizzare:
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; }
ho pensato che avrei potuto prendere questa entryID (che funziona il codice di cui sopra), e scorrere tutte le mie cartelle (sullo scambio così come sul mio computer) cercando lo stesso ID di posta. Quando finalmente eseguo l'iterazione su dove si trova la posta, il EntryID della posta spostata è molto diverso da entryIDCollection.
Forse sto andando su questo nel modo sbagliato. Qualcuno sa come fermare la propagazione dell'evento fino a quando non ho finito, o come rintracciare l'email spostata?
Ecco il mio codice per attraversare le cartelle nel caso qualcuno di curioso:
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) { }
}
}
Ottimo, è stato così! Ho avuto afferrare la PR_SEARCH_KEY proprio quando è arrivato il messaggio. Ho anche afferrato il corpo e il soggetto. Poi ho modificato il soggetto e il corpo. Quando provo ad aggiornare il corpo/soggetto, e fallisce, allora lo faccio cercare nelle cartelle e trovare la corrispondenza corrispondente. Sebbene PR_SEARCH_KEY non sia univoco SE l'elemento di posta viene copiato (entrambe le copie possono condividere lo stesso PR_SEARCH_KEY), ciò è perfettamente corretto, perché quando viene inserito, non ho ancora fatto nessuna copia. Ho provato a votare, ma sono troppo nuovo per votare :(Pubblicherò il mio codice di seguito (a corto di caratteri di commento) – mdiehl13