首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果在下次C#启动之前关闭Outlook,则从Outlook发送的电子邮件将保留在发件箱中

如果在下次C#启动之前关闭Outlook,则从Outlook发送的电子邮件将保留在发件箱中
EN

Stack Overflow用户
提问于 2018-06-01 02:00:39
回答 1查看 790关注 0票数 0

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

我的应用程序显示Outlook消息窗口,这样用户就可以看到我们正在发送的内容,并首先对其进行编辑。当用户单击“发送”按钮时,Outlook窗口将关闭,邮件将被发送。只要Outlook应用程序已经在运行,它就可以完美地工作。

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

注:我知道这个问题已经被问到这里Email sent with Outlook Object Model stays in Outbox until I start Outlook 和解决方案存在,但它没有提供(只提供了小提示),不幸的是,我不能要求澄清/代码示例,因为我没有足够的“声誉”。我试图编写我自己的实现所提供的提示,但SyncEnd事件被激发当Outlook已经打开时(只是提醒一下,问题是关于Outlook关闭的情况)。下面是我的代码。怎么啦?

代码语言:javascript
复制
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();
  }
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-01 04:19:30

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

这不是真的。SyncObjects集合包含所有发送\接收组。您需要迭代集合中的所有对象并调用Start方法,例如:

代码语言:javascript
复制
  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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50630246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档