Я создаю аддон для Outlook 2007, который читает почтовый элемент при его получении, а затем переписывает его.Аддон отлично работает и переписывает почту для элементов, у которых нет правила Outlook, которое перемещает их в другую папку.Если есть правило, оно все еще хорошо в 50% случаев.Остальные 50% времени правило перемещает почтовый элемент до того, как мой аддон заканчивает работу.Я получаю следующую ошибку:
"Невозможно выполнить операцию, поскольку объект был удален."
Я использую событие NewMailEx для вызова моей функции перезаписи:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail);
}
В Outlook 2007 NewMailEx предоставляет запись ID для почты.Этот entryID изначально используется, чтобы выяснить, какой почтовый объект использовать:
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; }
Я подумал, что могу взять этот entryID (который работает в приведенном выше коде) и перебрать все мои папки (при обмене нану как на моем компьютере) искал тот же почтовый идентификатор.Когда я, наконец, перехожу туда, где находится почта, EntryID перемещенной почты сильно отличается от entryIDCollection.
Возможно, я поступаю неправильно.Кто-нибудь знает, как остановить распространение события, пока я не закончу, или как отследить перемещенное электронное письмо?
Вот мой код для обхода папок на случай, если кому-то интересно:
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) { }
}
}