【发布时间】:2010-10-23 00:17:32
【问题描述】:
我想使用系统的默认电子邮件客户端(thunderbird、outlook 等)从 .net windows 窗体应用程序发送电子邮件。我想预设主题和正文——我认为有一种方法可以通过向 Windows 资源管理器发送类似的内容来做到这一点:“mailto:test@example.invalid?subject=mysubject&body=mymessage”。你有这方面的例子吗?
【问题讨论】:
我想使用系统的默认电子邮件客户端(thunderbird、outlook 等)从 .net windows 窗体应用程序发送电子邮件。我想预设主题和正文——我认为有一种方法可以通过向 Windows 资源管理器发送类似的内容来做到这一点:“mailto:test@example.invalid?subject=mysubject&body=mymessage”。你有这方面的例子吗?
【问题讨论】:
如果您仅在 MS Windows 环境中工作,则可以使用 MAPI32.DLL。 可以在此处找到托管包装器:
http://www.codeproject.com/KB/IP/SendFileToNET.aspx
代码如下:
MAPI mapi = new MAPI();
mapi.AddAttachment("c:\\temp\\file1.txt");
mapi.AddAttachment("c:\\temp\\file2.txt");
mapi.AddRecipientTo("person1@somewhere.com");
mapi.AddRecipientTo("person2@somewhere.com");
mapi.SendMailPopup("testing", "body text");
// Or if you want try and do a direct send without displaying the mail dialog
// mapi.SendMailDirect("testing", "body text");
【讨论】:
执行此操作的正确方法是使用 MAPI,但使用 MAPI dll 的互操作代码是 not actually a supported nor recommended way to do this。我已经这样做了,只要您对您的互操作代码非常小心,并且不做比打开邮件客户端发送电子邮件更多的交互,您应该没事。
使用“mailto”方法有几个问题,其中至少是您不能附加文件。
【讨论】:
这是我尝试过的:
Process.Start("mailto:demo@example.invalid?subject=" +
HttpUtility.HtmlAttributeEncode("Application error report") +
"&body=" + HttpUtility.HtmlAttributeEncode(memoEdit1.Text));
但如果正文太大,我会遇到异常:
Win32Exception "传递给系统调用的数据区太小"
所以问题仍然存在,因为我需要处理长正文。我不知道这个错误的大小限制。
【讨论】:
试试这个:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "mailto:someone@somewhere.com?subject=hello&body=love my body";
proc.Start();
【讨论】: