Приложение 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;
}
У меня создалось впечатление, что он в основном просто сохранил его в локальной переменной для возврата [ссылка] (http://stackoverflow.com/questions/421797/what-really-happens-in-a-try-return- х-наконец-х-нуль-оператор). В любом случае, я обычно избегаю определять вещи в блоке try, поэтому я вытащил его из try и получил то же поведение, а затем переместил его в глобальный класс и все равно получил такое же поведение. Я даже попытался перенести объект приложения на случай, если он будет удален, или что-то сделало с ним отправленную папку. Не повезло. – HiGravity
Могу ли я увидеть ваш код сейчас? –
У меня может быть решение, но я не знаю причины. Добавление блока к отображению входящих сообщений, похоже, сработает. Однако в настоящее время он остается открытым даже после очистки моих объектов, созданных здесь. P.S. Я, по сути, открываю полный экземпляр внешнего вида, свернутый вместо «автоматизированного» использования. – HiGravity