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