Outlook не запускает событие AttachmentAdd, за исключением одного сообщения электронной почты, когда одновременно составлено несколько сообщений электронной почты

#c# #events #event-handling #vsto #outlook-addin

Вопрос:

Я пишу надстройку Outlook и подключаюсь к событию AttachmentAdd элемента MailItem. Это работает, как и ожидалось, когда составляется одно электронное письмо, но когда одновременно составляется несколько электронных писем, кажется, что событие AttachmentAdd срабатывает только для первого электронного письма, к которому добавляется вложение.

Я не уверен, имеет ли это какое-либо отношение к тому, что RCW выходит за рамки.

Я использую 64-разрядную версию Outlook 365, если это поможет.

Вот код:

 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;
    }       
}
 

Ответ №1:

Вы настраиваете события обработчиком событий в локальной переменной ( newMailItem ), которая будет выпущена в какой-то момент после NewItem_Load() выхода.

Переменная должна оставаться живой, чтобы вызывать события. Вы можете переместить объявление на уровень класса, но у вас может быть более одного открытого элемента. Попробуйте создать класс-оболочку, который содержит MailItem в качестве своего члена, и сохраните эту оболочку в списке.

Комментарии:

1. Я действительно думал об этом, но проблема в том, что я не знаю, когда выпустить ссылку на MailItem. Это работает, когда я сохраняю элемент почты в списке. Кроме того, в этом случае я подключаюсь к событию загрузки элементов, когда я действительно хочу подключиться к событию создания новой почты.

2. Вы можете использовать MailItem.Close событие. Для новых элементов используйте Inspectors.NewInspector событие.

3. Кстати, есть ли событие, когда будет получен ответ/ответ/переадресация и электронное письмо загрузится из проводника?

4. Да. Explorer.InlineResponse и Explorer.InlineResponseClose события. Вы можете увидеть эти события в прямом эфире в OutlookSpy ( dimastr.com/outspy )