【问题标题】:Outlook does not fire the AttachmentAdd event except for one email when multiple emails are composed at the same time当同时撰写多封电子邮件时,Outlook 不会触发 AttachmentAdd 事件,但一封电子邮件除外
【发布时间】:2021-06-16 12:49:25
【问题描述】:

我正在编写一个 Outlook 加载项,并且正在连接到 mailItem 的 AttachmentAdd 事件。当撰写一封电子邮件但同时撰写多封电子邮件时,它按预期工作,似乎 AttachmentAdd 事件仅针对添加附件的第一封电子邮件触发。

我不确定这是否与 RCW 超出范围有关。

如果有帮助,我正在使用 Outlook 365 64 位。

代码如下:

public partial class MyAddIn
{
    private void OutlookAddIn_Startup(object sender, System.EventArgs e)
    {
            Application.ItemLoad += NewItem_Load;
    }

    private void NewItem_Load(object item)
    {
        Outlook.MailItem newMailItem = null;

        newMailItem = item as Outlook.MailItem;
        if (newMailItem != null)
        {
            newMailItem.AttachmentAdd -= MailItem_AttachmentAdd;
            newMailItem.AttachmentAdd += MailItem_AttachmentAdd;
        }
    }

    // This gets called only for one email.
    private void MailItem_AttachmentAdd(Outlook.Attachment attachment)
    {
       // Do some stuff here.
    }

    private void OutlookAddIn_Shutdown(object sender, System.EventArgs e)
    {
        Application.ItemLoad -= NewItem_Load;
        // Log
    }

    protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        return new MyRibbon(this);
    }

    #region VSTO generated code

    
    private void InternalStartup()
    {
        this.Startup += new System.EventHandler(OutlookAddIn_Startup);
        this.Shutdown += new System.EventHandler(OutlookAddIn_Shutdown);
       
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }       
}

【问题讨论】:

    标签: c# events event-handling vsto outlook-addin


    【解决方案1】:

    您正在为局部变量 (newMailItem) 设置事件处理程序,该事件将在 NewItem_Load() 退出后的某个时间点释放。

    变量必须保持活动状态才能引发事件。您可以将声明移至班级级别,但您可以拥有多个未清项目。尝试创建一个包含 MailItem 作为其成员的包装器类,并将该包装器存储在一个列表中。

    【讨论】:

    • 我确实考虑过,但问题是我不知道何时释放mailItem 引用。当我将 mailItem 保存在列表中时,它确实有效。另外,在这种情况下,当我真的想挂接到新的邮件创建事件时,我会挂接到 ItemLoad 事件。
    • 你可以使用MailItem.Close事件。对于新项目,请使用 Inspectors.NewInspector 事件。
    • 顺便说一句,当回复/replyall/forward 被点击并从资源管理器中加载电子邮件时是否有事件?
    • 是的。 Explorer.InlineResponseExplorer.InlineResponseClose 事件。您可以在 OutlookSpy (dimastr.com/outspy) 中实时查看这些事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多