2015-02-02 2 views
1

Приложение My C# позволяет пользователю выбрать файл для отправки по электронной почте. Им нужно выбрать получателя из своих контактов/обмена, потому что мы управляем/синхронизируем список контактов для компании.Outlook SentFolder ItemAdded событие не запускается, если Outlook не открыт

После отправки мне нужно захватить файл msg и сохранить его где-нибудь, используя информацию получателя.

Информация о получателе недоступна во время отправки, поэтому я нашел код для использования отправленной папки ItemAdded.

Все это прекрасно работало, пока кто-то не запустил его без возможности просмотра внешнего вида, и в этом случае это событие никогда не запускается. Application.ItemSend(), Inspector.Close() и т. Д. Весь огонь, но не тот, который мне нужен, чтобы получить информацию о получателе.

У кого-нибудь есть идеи, почему это не работает?

Примечание: Есть несколько вопросов о аналогичной проблеме, где они позволяют переменной Items выйти из области видимости. Я фактически возвращаю это и жду, пока он будет выполнен, который отлично работал, когда Outlook открыт, и в конце концов событие срабатывает.

Это мой метод, Outlook - это просто псевдоним для Microsoft.Office.Interop.Outlook.

public Outlook.Items Send(string subject, string body) { 
    try { 
     // Create the Outlook application. 
     Outlook.Application oApp = new Outlook.Application(); 
     Outlook.MAPIFolder sentFolder = oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail); 
     Outlook.Items itmsSentFolder = sentFolder.Items; 
     itmsSentFolder.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd); 
     Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem); 
     _inspector = oMsg.GetInspector; 
     oMsg.Subject = subject; 
     oMsg.Body = body; 
     int iAttachType = (int)Outlook.OlAttachmentType.olByValue; 
     foreach (string file in _attachments) { 
      Outlook.Attachment oAttach = oMsg.Attachments.Add(file, iAttachType, 1, Path.GetFileName(file)); 
     } 

     ((Outlook.InspectorEvents_10_Event)_inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inspector_Close); 
     oMsg.Mileage = MESSAGE_FLAG; 
     oMsg.Display(false); 
     oMsg = null; 
     oApp = null; 

     return itmsSentFolder; 
    } catch (Exception ex) { 
     _log.Error("Error sending attachments to Outlook", ex); 
     throw; 
    } 
} 

Обновлено:

public Outlook.Items Send(string subject, string body) { 

try { 
    _sent = false; 
    try { 
     _oApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application"); 
     _closeOutlook = false; 
    } catch { 
     _oApp = new Outlook.Application(); 
     _closeOutlook = true; 
    } 
    if (_oApp.Explorers.Count <= 0) { 
     _oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Display(); 
     _oApp.ActiveExplorer().WindowState = Outlook.OlWindowState.olMinimized; 
    } 
    _sentFolder = _oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail); 
    _itmsSentFolder = _sentFolder.Items; 
    _itmsSentFolder.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd); 
    _oMsg = (Outlook.MailItem)_oApp.CreateItem(Outlook.OlItemType.olMailItem); 
    _inspector = _oMsg.GetInspector; 
    _oMsg.Subject = subject; 
    _oMsg.Body = body; 

    ((Outlook.ItemEvents_10_Event)_oMsg).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(MailItem_Send); 
    ((Outlook.ItemEvents_10_Event)_oMsg).Write += new Microsoft.Office.Interop.Outlook.ItemEvents_10_WriteEventHandler(MailItem_Write); 

    int iAttachType = (int)Outlook.OlAttachmentType.olByValue; 
    foreach (string file in _attachments) { 
     Outlook.Attachment oAttach = _oMsg.Attachments.Add(file, iAttachType, 1, Path.GetFileName(file)); 
    } 

    ((Outlook.InspectorEvents_10_Event)_inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inspector_Close); 
    _oMsg.Mileage = MESSAGE_FLAG; 
    _oMsg.Display(true); 
} catch (Exception ex) { 
    _log.Error("Error sending attachments to Outlook", ex); 
    throw; 
} 
return _itmsSentFolder; 

}

ответ

0

Исходный объект прокатывается сборщиком мусора. То есть событие ItemAdd не запускается, поскольку область действия исходного объекта ограничена блоком try/catch. Вам нужно объявить объект в глобальной области действия и убедиться, что он все еще жив.

P.S. Помните, что событие ItemAdd не запускается, когда одновременно добавляются несколько элементов (более 16). Это хорошо известная проблема в Outlook.

+0

У меня создалось впечатление, что он в основном просто сохранил его в локальной переменной для возврата [ссылка] (http://stackoverflow.com/questions/421797/what-really-happens-in-a-try-return- х-наконец-х-нуль-оператор). В любом случае, я обычно избегаю определять вещи в блоке try, поэтому я вытащил его из try и получил то же поведение, а затем переместил его в глобальный класс и все равно получил такое же поведение. Я даже попытался перенести объект приложения на случай, если он будет удален, или что-то сделало с ним отправленную папку. Не повезло. – HiGravity

+0

Могу ли я увидеть ваш код сейчас? –

+0

У меня может быть решение, но я не знаю причины. Добавление блока к отображению входящих сообщений, похоже, сработает. Однако в настоящее время он остается открытым даже после очистки моих объектов, созданных здесь. P.S. Я, по сути, открываю полный экземпляр внешнего вида, свернутый вместо «автоматизированного» использования. – HiGravity

0

Добавлено обновление к моему оригинальному сообщению с решением. Это может быть проблемой с Outlook 2013, поскольку я нашел более старый продукт, который делает что-то подобное, и теперь он зависает, когда он тоже должен ждать события ItemAdded.

ПРИМЕЧАНИЕ: После этого вы должны очистить все ссылки, и это включает в себя знание, нужно ли закрыть Outlook, когда это будет сделано. Вызов oApp.Quit() выйдет из Outlook, даже если он уже открыт.