如果Outlook关闭直到下一次Outlook启动,则从C#OOM发送的电子邮件将保留在发件箱中

时间:2018-05-31 18:00:39

标签: email outlook outlook-object-model

我尝试使用Outlook对象模型从.NET应用程序发送电子邮件。

我的应用程序显示Outlook消息窗口,以便用户可以首先查看我们发送和编辑的内容。当用户点击“发送”按钮时,Outlook窗口将关闭,并发送消息。只要Outlook应用程序已在运行,这就完美无缺。

如果Outlook应用程序尚未运行,则邮件会卡在“发件箱”中,并且在我启动Outlook之前不会发送。当我启动Outlook时,我可以看到发件箱文件夹中的消息几秒钟,然后它就会被发送。 我需要向Outlook用户显示“新邮件”表单以选择收件人,并可能在发送之前编辑邮件。

注意:我知道这个问题已经在这里被问到Email sent with Outlook Object Model stays in Outbox until I start Outlook 并且解决方案存在,但没有提供(只提供了小提示),不幸的是我不能要求澄清/代码示例,因为我没有足够的"声誉"。 我尝试编写自己提供的提示的实现,但是当Outlook已经打开时,SyncEnd事件被解除(只是为了提醒,问题是关于案例,然后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 :(得分:0)

  

只有在Outlook已经打开时才会触发SyncEnd事件

事实并非如此。 SyncObjects集合包含所有Send \ Receive组。您需要迭代集合中的所有对象并调用HttpClient方法,例如:

Start