Я пытаюсь отправить электронную почту из приложения .NET с помощью объектной модели Outlook.
В моем приложении отображается окно сообщения Outlook, чтобы пользователь мог видеть, что мы отправляем, и сначала его редактировать.Когда пользователь нажимает кнопку «Отправить», окно Outlook закрывается, и сообщение отправляется.Это прекрасно работает, если приложение Outlook уже запущено.
Если приложение Outlook еще не запущено, сообщение застревает в папке «Исходящие» и не будет отправлено до тех пор, пока я не запущу Outlook.Когда я запускаю Outlook, я вижу сообщение, находящееся в папке «Исходящие» в течение нескольких секунд, затем оно отправляется.Мне нужно показать форму «Новое сообщение» пользователю Outlook, чтобы выбрать получателя (ей) и, возможно, отредактировать сообщение перед отправкой.
Примечание : я знаю, что этот вопрос уже задавался здесь Электронная почта, отправленная с помощью объектной модели Outlook, остается в папке «Исходящие» до тех пор, пока я не запускаю Outlook , и решение существует, но оно не предоставляется (предоставляется только небольшая подсказка), и, к сожалению, я не могу попросить пример пояснения / кода, потому что я недостаточно "репутации".Я пытался написать свою собственную реализацию предоставленной подсказки, но событие SyncEnd вызывается только , когда Outlook уже открыт (напомню, вопрос касается случая, после которого Outlook закрывается).Мой код ниже.Что не так?
using Microsoft.Office.Interop.Outlook;
using OutlookApp = Microsoft.Office.Interop.Outlook.Application;
class Mailer
{
AutoResetEvent mailSentEvent = new AutoResetEvent(false);
public void CreateMail()
{
OutlookApp outlookApp = null;
MailItem mailItem = null;
try
{
outlookApp = new OutlookApp();
mailItem = outlookApp.CreateItem(OlItemType.olMailItem);
mailItem.Subject = "Test Message";
mailItem.Body = "This is the message.";
string reportPath = @"C:\temp\aaaaa.pdf";
mailItem.Attachments.Add(reportPath);
mailItem.Display(true);
StartSync(outlookApp);
bool result = mailSentEvent.WaitOne();
}
catch (System.Exception)
{
throw;
}
finally
{
if (mailItem != null) Marshal.ReleaseComObject(mailItem);
if (outlookApp != null) Marshal.ReleaseComObject(outlookApp);
}
}
private static SyncObject _syncObject = null;
private void StartSync(OutlookApp outlookApp)
{
var nameSpace = outlookApp.GetNamespace("MAPI");
_syncObject = nameSpace.SyncObjects[1];
_syncObject.SyncEnd += new Microsoft.Office.Interop.Outlook.SyncObjectEvents_SyncEndEventHandler(OnSyncEnd);
_syncObject.Start();
}
private void OnSyncEnd()
{
mailSentEvent.Set();
}
}