Outlook ItemAdd事件未触发 - c#

我们已经编写了一个Outlook加载项,它在发送电子邮件后便开始执行操作。仅当在撰写电子邮件期间设置了标志时,才应执行该操作。通过单击切换按钮来设置标志。发送电子邮件时,会触发一个事件,我们将电子邮件的ID存储在队列中。如果邮件出现在已发送的文件夹中,则将触发一个事件,并且如果在队列中发现了相同的ID,则应执行一个操作。

下面我有两种方法。发送电子邮件时会发生Application_ItemSend,并且在该方法中,在SentItemsQueue上调用EnQueue。 EnQueue方法将事件附加到“已发送邮件”文件夹,并且在添加项目时应触发一个事件,该事件将开始我们的操作。

在Outlook中编写和发送电子邮件时,一切都很好。如果我们从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);
    }
...

参考方案

引发事件的对象(Items集合)必须保持活动状态才能引发事件。您正在使用多个点表示法,并且由编译器创建的隐式变量一旦超出范围并被垃圾回收,将不会引发任何事件:

public class SentItemsArchiveQueue 
{
  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);
    }

如何使用与PHP mail()中相同的机制在Java中发送邮件 - java

我无法从应用程序发送邮件。我不能在应用程序上使用简单的SMTP服务器。而且不知道如何处理JAVA中的邮件发送。我应该使用与PHP的mail()使用相同/相似的机制。不幸的是我不知道该怎么做。 java大神给出的解决方案 您需要检出JavaMail API,并且按照PHP的mail()的要求,它将需要SMTP服务器来发送该电子邮件。如果您需要SMTP服务器,建…

C#使用Microsoft.Office.Interop.Excel读取Excel单元格值 - c#

我正在尝试提取Excel单元格值。我能够成功提取行值。我应该怎么做才能将每​​个单元格值从行中拉出?using Microsoft.Office.Interop.Excel; string pathToExcelFile = @"C:\Users\MyName\Desktop\Log.xls"; Application xlApp = n…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可