Новое почтовое оповещение для общего почтового ящика outlook 2007 - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь создать всплывающее почтовое оповещение для общего почтового ящика в Outlook 2007. Следующий код не работает.почему?

private Microsoft.Office.Interop.Outlook._Explorers Explorers;
private Microsoft.Office.Interop.Outlook.NameSpace outlookNamespace;
private Microsoft.Office.Interop.Outlook.MAPIFolder mFolder;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
  Explorers = this.Application.Explorers;         
  outlookNamespace = this.Application.GetNamespace("MAPI");         
  mFolder = outlookNamespace.Folders["Mailbox -AdditionalMailBox"].Folders["Inbox"];  
  mFolder.Application.NewMailEx += new  ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx );
}
private void Application_NewMailEx(string EntryID)
{
  MessageBox.Show("New MailReceived!");
}

1 Ответ

1 голос
/ 13 марта 2012

Чтобы ваши обработчики событий могли выжить при сборке мусора - вам нужно обеспечить поддержку объектов, содержащих ваши события, добавив их в качестве закрытой переменной-члена. Попробуйте добавить переменную частного класса Application, и ваша подписка на события должна работать нормально. См. связанный SO сообщение для более подробной информации.

private Microsoft.Office.Interop.Outlook.Application application;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    application = this.Application;
    Explorers = application.Explorers;         
    // ...         
    application.NewMailEx += new  ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx );
}

Другая обнаруженная вами проблема заключается в том, что NewMailEx срабатывает только для вашего основного почтового ящика, а не для вторичных почтовых ящиков, как подтверждено в этом сообщении на форуме . Вам нужно будет положиться на Folder.Items событие ItemAdd.

private Outlook.Items mFolderItems;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    // ...
    mFolderItems = mFolder.Items; // avoid GC for ItemAdd event
    mFolderItems.ItemAdd += new ItemsEvents_ItemAddEventHandler(mFolder_ItemAdd);
    // ...
}        
private void mFolder_ItemAdd(object addedItem)
{
  Outlook.MailItem newItem = addedItem as Outlook.MailItem;
}
...