Как добавить обработчик событий для чтения или открытия любой почты в Outlook? VSTO

#c# #outlook #vsto #outlook-addin

#c# #outlook #vsto #outlook-добавление

Вопрос:

Идея моего плагина заключается в том, что когда я нажимаю (прочитать) или дважды щелкаю (открыть) на любое электронное письмо в моем почтовом ящике Outlook Explorer, отображается форма Windows. Я понимаю, что я должен поместить обработчик событий в метод ThisAddIn_Startup, чтобы он работал, пока Outlook открыт. Я попробовал следующее:

 Outlook.MailItem mailItem = new Outlook.MailItem();
mailItem.Open  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
mailItem.Read  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
    
Outlook.AppointmentItem Cita = new Outlook.AppointmentItem();
Cita.Open  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
Cita.Read  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
    
Outlook.MeetingItem Reunion = new Outlook.MeetingItem();
Reunion.Open  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
Reunion.Read  = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
  

Но я получаю сообщение об ошибке:

System.Runtime.Службы взаимодействия.COMException (0x80040154): Класс не зарегистрирован (Исключение из HRESULT: 0x80040154

Затем я попробовал это, что нашел в Интернете, но работает только случайное письмо (это даже не первое письмо), а событие чтения выполняется только один раз и не более.

     Outlook.MailItem mailItem;

    private void ThisApplication_Startup (object sender, EventArgs e) {
        Outlook.NameSpace ns = this.Session;
        Outlook.MAPIFolder inbox =
            ns.GetDefaultFolder (
                Outlook.OlDefaultFolders.olFolderInbox);

        foreach (object o in inbox.Items) {
            mailItem = o as Outlook.MailItem;
            if (mailItem != null) {
                break;
            }
        }

        if (mailItem == null) {
            MessageBox.Show ("Couldn't find a mail item to connect to.");
        } else {
            MessageBox.Show (String.Format (
                    "Connected to the mail item with subject {0}.",
                    mailItem.Subject);

                mailItem.Read  = new Outlook.ItemEvents_10_ReadEventHandler (
                    MailItem_Read);

                mailItem.Open  = new Outlook.ItemEvents_10_OpenEventHandler (
                    MailItem_Open);

                mailItem.Write  = new Outlook.ItemEvents_10_WriteEventHandler (
                    MailItem_Write);

                ((Outlook.ItemEvents_10_Event) mailItem).Close  = new Outlook.ItemEvents_10_CloseEventHandler (
                    MailItem_Close);
            }
        }
    }

    void MailItem_Read() {
        MessageBox.Show("Read");
    }

    void MailItem_Open(ref bool cancel) {
        MessageBox.Show("Open");
    }

    void MailItem_Write(ref bool cancel) {
        MessageBox.Show("Write");
    }

    void MailItem_Close(ref bool cancel) {
        MessageBox.Show("Close");
    }
  

Что мне делать?
Должен ли я просматривать все электронные письма и назначать им обработчик событий? Если да, то как бы вы поступили с входящими электронными письмами, должен ли я добавить обработчик событий для входящих электронных писем и в метод добавить обработчик событий для открытия и чтения электронной почты?

Ответ №1:

Не используйте « new » с Outlook.MailItem — этот объект невозможно создать, Outlook.Application есть, но вы все равно получаете экземпляр этого объекта (доверенную версию) из Outlook.

Я подозреваю, что вам нужно отслеживать Exploer.SelectionChange событие ( Explorer может быть получено из Applica5tion.ActiveExplorer и Application.Explorers.NewExplorer ) и настраивать обработчики событий для выбранных элементов (Explorer.Выбор).

Убедитесь, что объекты, вызывающие события ( Explorer и Explorers ), на которые ссылаются, не являются мусором.

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

1. Да, вы не можете использовать new, я думал, что его можно создать так же, как интерфейс приложения. Я уже использовал Explorer. SelectionChange но плагин имеет плохое поведение, потому что при использовании form.showdialog Outlook не читает почту, и я хочу, чтобы пользователь мог видеть почту, но не мог выбрать другую почту, пока форма открыта, по этой причине я думаю, что событие чтения — лучший вариант узнать, когда запускать форму.

2. Второй вариант в моем коде работает только для одного электронного письма. Должен ли я просмотреть весь почтовый ящик и назначить ему обработчики событий один за другим? И для входящих писем я должен добавить обработчик событий для входящих писем, а в методе обработчика добавить обработчик событий для открытия и чтения электронной почты?

3. Я думаю, вы упустили мою мысль — используйте событие SelectionChange, чтобы освободить старые приемники событий и установить новые для выбранных элементов, чтобы вы могли обработать событие Open для выбранных элементов.