从C#在Windows桌面电子邮件客户端中打开新的电子邮件窗口

时间:2017-04-12 11:06:10

标签: c# .net email outlook mapi

我正在尝试使用下面的方法打开一个填充的电子邮件窗口,该窗口是从单独的STA线程调用的。

    private void SendMailMessage(object ignore)
    {
        MAPIHelperInterop.MapiMessage message = new MAPIHelperInterop.MapiMessage();

        using(RecipientCollection.InteropRecipientCollection interopRecipients
            = fRecipientCollection.GetInteropRepresentation())
        {
            message.Subject = fSubject;
            message.NoteText = fBody;

            message.Recipients = interopRecipients.Handle;
            message.RecipientCount = fRecipientCollection.Count;

            // Check if we need to add attachments
            if(fFiles.Count > 0)
            {
                // Add attachments
                message.Files = AllocateFileAttachments(out message.FileCount);
            }

            // Signal the creating thread (make the remaining code async)
            fManualResetEvent.Set();

            int error = MAPIHelperInterop.MAPISendMailW(IntPtr.Zero, IntPtr.Zero, message, 0x8, 0);

            if(fFiles.Count > 0)
            {
                // Deallocate the files
                DeallocateFileAttachments(message);
            }

            // Check for error
            if(error != SUCCESS_SUCCESS)
            {
                LogMAPIError(error);
            }
        }
  }

我一直在使用Outlook进行测试,并且我一直收到错误代码2(MAPI_E_FAILURE)并且Outlook中没有任何可见的内容(最终它应该适用于任何邮件客户端,但Outlook是主要的用例,因此可扩展的解决方案有效对于Outlook将是一个很好的第一步)。它只有在我以管理员身份启动Outlook或在运行代码时关闭Outlook时才有效。我尝试使用Outlook的句柄调用MAPISendMailW,并使用不同的标志组合,但这也不起作用。

我发现问题的最近点是https://social.msdn.microsoft.com/Forums/office/en-US/63e9f5b2-f5f2-4cf8-bdc2-ca1fad88ebe5/problem-with-outlook-and-mapisendmail-returns-mapiefailure-when-outlook-is-running?forum=outlookdev。为了遵循建议的解决方案,尝试在单独的AppDomain中运行SendMailMessage方法,如下所示:

     public void ShowDialog()
    {
        Evidence e = new Evidence();
        e.AddHostEvidence(new Zone(SecurityZone.MyComputer));           
        AppDomain appDomain = AppDomain.CreateDomain("Outlook Launcher", e);            
        appDomain.DoCallBack(SendMailMessage);                     
    }

如果我使用" SecurityZone.MyComputer"然后我得到与以前相同的错误,如果我使用任何其他SecurityZone,我收到此错误消息:"请求类型&System; System.Security.Permissions.ReflectionPermission,mscorlib,Version = 4.0.0.0的权限,Culture = neutral,PublicKeyToken = b77a5c561934e089'失败&#34。也许这不是他们在上面的帖子中所建议的,但这是我能想到的任何事情。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我过去使用过MAPI,在不同的Outlook版本中运行良好可能会很麻烦。

一个非常简单的解决方法是使用mailto链接。优点是它可以自动与不同的邮件客户端一起使用。

 Process.Start("mailto:hello@test.com&subject=This is the subject&body=This is the body");

这将打开您的默认邮件客户端,主题和正文已填写。