Tworzę dodatek do programu Outlook 2007, który odczytuje element poczty po otrzymaniu, a następnie przepisuje go. Dodatek działa świetnie i przepisuje pocztę dla elementów, które nie mają reguły programu Outlook, która przenosi je do innego folderu. Jeśli istnieje zasada, nadal jest w porządku w 50% przypadków. Pozostałe 50% czasu, reguła przesuwa element poczty, zanim mój dodatek się skończy. Pojawia się następujący błąd:VSTO: przetwarzanie poczty za pomocą newmailex przed przeniesieniem reguł programu Outlook
"The operation cannot be performed because the object has been deleted."
Używam zdarzenie NewMailEx zadzwonić mojej funkcji przepisywanie:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail);
}
W programie Outlook 2007 NewMailEx daje entryID dla poczty. Ten entryID służy początkowo, aby dowiedzieć się, który obiekt mail aby użyć:
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; }
Myślałem, że mogę wykorzystać tę entryID (co powyższy kod działa), a iterację wszystkich moich folderach (na wymianę, jak również na moim komputerze) szukając tego samego identyfikatora poczty. Kiedy w końcu przejdę do miejsca, w którym znajduje się poczta, adres EntryID przeniesionej poczty bardzo różni się od entryIDCollection.
Może idę o tym w niewłaściwy sposób. Czy ktokolwiek wie, jak zatrzymać rozprzestrzenianie się zdarzenia, dopóki nie skończę, lub jak wyśledzić przeniesiony e-mail?
Oto mój kod na przejeżdżające foldery w przypadku niczyich ciekawy:
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) { }
}
}
Świetnie, udało się! Miałem to chwycić PR_SEARCH_KEY prawo, kiedy wiadomość wszedł. Ja też chwyciłem ciało i temat. Potem zmodyfikowałem temat i ciało. Kiedy próbuję zaktualizować ciało/obiekt i nie powiedzie się, będę musiał przeszukać foldery i znaleźć pasującą pocztę. Chociaż PR_SEARCH_KEY nie jest unikalne, jeśli element poczty jest kopiowany (obie kopie mogą współdzielić to samo PR_SEARCH_KEY), to jest zupełnie w porządku, ponieważ kiedy to nastąpi, nie utworzyłem jeszcze żadnych kopii. Próbowałem to zagłosować, ale jestem za nowy, by głosować :(opublikuję mój kod poniżej (kończą się znaki komentarza) – mdiehl13