我正在尝试使用下面的方法打开一个填充的电子邮件窗口,该窗口是从单独的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。也许这不是他们在上面的帖子中所建议的,但这是我能想到的任何事情。
感谢您的帮助。
答案 0 :(得分:1)
我过去使用过MAPI,在不同的Outlook版本中运行良好可能会很麻烦。
一个非常简单的解决方法是使用mailto链接。优点是它可以自动与不同的邮件客户端一起使用。
Process.Start("mailto:hello@test.com&subject=This is the subject&body=This is the body");
这将打开您的默认邮件客户端,主题和正文已填写。