2016-01-05 8 views
0

Я пытаюсь отправить электронные письма из приложения .NET с помощью объектной модели Outlook.Электронная почта, отправленная с объектной моделью Outlook, остается в папке «Исходящие», пока я не запустил Outlook

Мое приложение отображает окно сообщения Outlook, чтобы пользователь мог видеть, что мы отправляем, и сначала его редактировать. Когда пользователь нажимает кнопку «Отправить», окно Outlook закрывается, и сообщение отправляется. Это работает отлично, пока приложение Outlook уже запущено.

Если приложение Outlook еще не запущено, сообщение застревает в папке «Исходящие» и не отправляется до запуска Outlook. Когда я запускаю Outlook, я могу увидеть сообщение, сидящее в папке «Исходящие» в течение нескольких секунд, затем оно отправляется.

Вот упрощенная версия коды, я использую для отправки электронной почты:

Outlook.Application app = new Outlook.Application(); 
var ns = app.GetNamespace("MAPI"); 

// (ref: https://msdn.microsoft.com/en-us/library/office/ff861594.aspx) 
// If outlook is already running, this does nothing. If it isn't, this has the 
// side-effect of initializing MAPI to use the default profile and make the object 
// model fully functional 
var mailFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 

var mailItem = (Outlook.MailItem)ns.Application.CreateItem(Outlook.OlItemType.olMailItem); 
mailItem.To = "[email protected]"; 
mailItem.Subject = "This is a test"; 
mailItem.HTMLBody = "<html>A bunch of HTML</html>"; 

mailItem.Display(true); 

Примечание: Если я заменяю вызов mailItem.Display() с mailItem.Send(), работает ли перспектива работает или нет. К сожалению, это не вариант, потому что мне нужно, чтобы пользователь мог редактировать сообщение перед его отправкой.

Я думаю, мне нужно найти способ, когда сообщение закончит отправку, и сохранить объект до тех пор ... но я не уверен, как это сделать. Мое приложение - это консольное приложение, которое необходимо выполнить после отправки электронной почты. Надевание нити на некоторое время не делает этого (возможно, потому, что все, что я ожидаю, происходит в этом же потоке).

ответ

1

Outlook выйдет, если больше окон (исследователей или инспекторов) не открыты или не указаны.

Обратитесь к объекту инспектора, чтобы получить первый объект SyncObject из пространства имен.SyncObjects и дождитесь запуска события SyncObject.SyncEnd.

insp = mailItem.GetInspector; 
insp.Display(true); 
//keep insp referenced 
+0

Ожидание события SyncEnd, похоже, делает трюк. –