Письмо, отправленное с C # OOM, остается в папке «Исходящие», если Outlook закрыт до следующего запуска Outlook - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь отправить электронную почту из приложения .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();
  }
}

1 Ответ

0 голосов
/ 31 мая 2018

событие SyncEnd вызывается только тогда, когда Outlook уже открыт

Это не так.Коллекция SyncObjects содержит все группы отправки \ получения.Вам нужно перебрать все объекты в коллекции и вызвать метод Start, например:

  Set sycs = nsp.SyncObjects 
  For i = 1 To sycs.Count 
    Set syc = sycs.Item(i) 
    strPrompt = MsgBox("Do you wish to synchronize " &; syc.Name &;"?", vbYesNo) 
    If strPrompt = vbYes Then 
      syc.Start 
    End If 
  Next 
...