Je crée un addon pour Outlook 2007 qui lit un élément de courrier lorsqu'il est reçu, puis le réécrit. L'extension fonctionne très bien et réécrit le courrier pour les éléments qui n'ont pas de règle Outlook qui les déplace dans un autre dossier. S'il y a une règle, c'est toujours correct dans environ 50% des cas. L'autre 50% du temps, la règle déplace l'article de courrier avant la fin de mon addon. Je reçois l'erreur suivante:VSTO: traiter le courrier en utilisant newmailex avant que les règles d'Outlook ne déplacent le courrier
"The operation cannot be performed because the object has been deleted."
J'utilise événement NewMailEx pour appeler ma fonction de réécriture:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail);
}
Dans Outlook 2007, NewMailEx donne un ENTRYID pour le courrier. Ce ENTRYID est utilisé d'abord pour savoir quel objet de messagerie à utiliser:
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; }
Je pensais que je pouvais prendre ce ENTRYID (que le code ci-dessus fonctionne), et itérer tous mes dossiers (sur l'échange ainsi que sur mon ordinateur) à la recherche du même identifiant mail. Lorsque j'effectue enfin une itération à l'endroit où se trouve le mail, l'identifiant EntryID du mail déplacé est très différent de l'identifiant entryIDCollection. Peut-être que je vais à ce sujet dans le mauvais sens. Est-ce que quelqu'un sait comment empêcher l'événement de se propager jusqu'à ce que j'ai fini, ou comment traquer l'email déplacé?
Voici mon code pour parcourir les dossiers au cas où quelqu'un est curieux:
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) { }
}
}
Super, ça l'a fait! Je l'ai fait saisir le PR_SEARCH_KEY juste quand le message est entré. J'ai également saisi le corps et le sujet. Puis j'ai modifié le sujet et le corps. Lorsque j'essaie de mettre à jour le corps/le sujet, et qu'il échoue, je le fais ensuite rechercher dans les dossiers et trouver le courrier correspondant. Bien que PR_SEARCH_KEY ne soit pas unique si l'article de courrier est copié (les deux copies peuvent partager le même PR_SEARCH_KEY), c'est très bien, parce que quand il arrive, je n'ai encore fait aucune copie. J'ai essayé de voter, mais je suis trop nouveau pour voter :(Je posterai mon code ci-dessous (à court de caractères de commentaire) – mdiehl13