Outlook的ItemAdd事件未被触发。

4
我们编写了一个 Outlook 插件,当电子邮件被发送时启动一个操作。该操作只有在电子邮件的撰写过程中设置了标志时才会发生。通过单击切换按钮来设置标志。当电子邮件正在发送时,会触发一个事件并将电子邮件的 ID 存储在队列中。如果邮件出现在已发送文件夹中,则应触发一个事件,并且如果在队列中发现相同的 ID,则应发生某个操作。
以下是两种方法。当电子邮件被发送时,Application_ItemSend 将发生,在该方法中调用 SentItemsQueue 上的 EnQueue。EnQueue 方法会将事件附加到“已发送项目”文件夹上,当添加项目时,它应该触发一个事件,从而启动我们的操作。
当我们从外部程序(如 Word)开始电子邮件时,这一切都可以正常工作。但是,如果我们从外部程序(如 Word)开始电子邮件,则会执行 Application_ItemSend,但 EMailFoundInSentItems(附加在 EnQueue 中)永远不会触发。为什么事件永远不会触发?
public partial class ThisAddIn {    

  void Application_ItemSend(object item, ref bool cancel)
    {
       try
       {
         Trace.TraceInformation("E-mail is being sent. Checking for archive flag.");
         MailItem mail = item as MailItem;
         bool? archive = mail.GetArchiveFlag();

         if (archive == true)
         {
           Trace.TraceInformation("Archive flag was set, going to queue e-mail for archiving.");
           this.SentItemsQueue.EnQueue(mail);
         }

         Marshal.ReleaseComObject(mail);
       }
       catch (System.Exception ex)
       {
         Trace.TraceError("An exception was thrown while trying to archive a sent mail item. Exception: {0}.", ex.ToString());
       }
    }
...

public class SentItemsArchiveQueue 
{
  public void EnQueue(MailItem mail)
    {
      // remove and re-add handler (remove first, so it's not registered twice)
      mail.SaveSentMessageFolder.Items.ItemAdd -= new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems);
      mail.SaveSentMessageFolder.Items.ItemAdd += new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems);

      this.Queue.Add(mail.ConversationIndex);
      Trace.TraceInformation("Queue ConversationIndex is {0}", mail.ConversationIndex);
    }
...

这个回答解决了你的问题吗?Outlook 2016 VSTO文件夹添加事件只触发一次 - smirne
是的,它确实有用,但Dmitry已经6年前回答了我的问题。 - Guido Neele
1个回答

12

引发事件的对象(Items集合)必须保持存在才能够引发事件。如果您使用了多个点符号,并且编译器生成的隐式变量超出作用域并被垃圾收集,那么就不会引发任何事件:

public class SentItemsArchiveQueue 
{
  private Items _items;

  public void EnQueue(MailItem mail)
    {
      _items = mail.SaveSentMessageFolder.Items;
      _items.ItemAdd += new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems);

      this.Queue.Add(mail.ConversationIndex);
      Trace.TraceInformation("Queue ConversationIndex is {0}", mail.ConversationIndex);
    }

1
谢谢。我将Items变量移动到ThisAddIn.cs文件中,以确保它永远不会超出范围。问题解决了。 - Guido Neele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接