从C#启动电子邮件应用程序(MAPI)(带附件)

在过去,我使用MAPISendMail从带有文件附件的C ++应用程序启动Outlook(或任何所需的MAPI电子邮件应用程序)。 (类似于Microsoft Word的发送电子邮件function)。

我需要在C#应用程序中执行相同的操作,并在XP,Vista,Server 2008(以及我认为的Windows 7)上运行时使其工作。

MAPISendMail在Vista / 2008下是不可取的,因为它在Outlook运行时始终返回MAPI_ E_FAILURE,并且托管代码中不支持MAPI。 即使在检查此修复程序后: http : //support.microsoft.com/kb/939718我无法让它可靠地工作。

我知道Microsoft Word和Adobe Reader 9都可以在Vista下使用附件启动Outlook。

AC#兼容的解决方案将是首选,但我会对任何有效的(不必使用MAPI)感到满意。 我似乎无法找到当前的“解决方案”。 Stack Overflow上现有的答案似乎也没有涵盖这一点。

编辑:

我知道MAPI和C#不能一起工作,因此我将采用在Vista和Server 2008中运行的C / C ++解决方案,而不是以管理员身份运行。 请参阅Adobe Reader 9和Microsoft Word作为有效的示例。

在工作中,我们使用VSTO成功完成了这项工作。

以下是我们使用Outlook 2007在VISTA上运行的一些行的代码:(代码在VB.net中)。

请注意,在对outlook对象执行某些操作时,用法是安全锁定的。 (标明为安全风险的地址,正文和其他财产)。 我们使用第三方组件(Redemption)来绕过此安全性。 如果你不使用某种类型的安全管理器,outlook会给出一些弹出窗口,外面的东西试图访问它,你可以在一段时间内给它访问权限。

导入Outlook界面。

Imports Outlook = Microsoft.Office.Interop.Outlook 

这个例子是给你一些方向,而不是一个完整的工作例子。

 dim MailItem As Microsoft.Office.Interop.Outlook.MailItem ' Lets initialize outlook object ' MailItem = OutlookSession.Application.CreateItem(Outlook.OlItemType.olMailItem) MailItem.To = mailto MailItem.Subject = communication.Subject MailItem.BodyFormat = Outlook.OlBodyFormat.olFormatHTML MailItem.HTMLBody = htmlBody MailItem.Attachments.Add(filename, Outlook.OlAttachmentType.olByValue) ' If True is supplied to Display it will act as modal and is executed sequential. ' SafeMail.Display(True) 

上例中的OutlookSession来自此属性:

  Public ReadOnly Property OutlookSession() As Outlook.NameSpace Get If Not OutlookApplication Is Nothing Then Return OutlookApplication.GetNamespace ("MAPI") Else Return Nothing End If End Get End Property 

正如您所看到的,它正在使用MAPI。

祝它好运。

只要您只是在电子邮件中设置属性而不是阅读它们,您就不需要像上面建议的那样兑换VB。 这是一个简单的VB函数,通过outlook附件显示/发送电子邮件。 (此代码引用Microsoft Outlook 12.0对象库,例如“C:\ Program Files \ Microsoft Office \ Office12 \ MSOUTL.OLB”)。

 Sub DoMail() Set objOL = CreateObject("Outlook.Application") Set objNewMail = objOL.CreateItem(olMailItem) Dim filename As String filename = "C:\\temp\\example.txt" With objNewMail .To = "cjoy@spam_me_not.com" .Subject = "test" .Body = "Test Body" .Attachments.Add filename, Outlook.OlAttachmentType.olByValue End With objNewMail.Display 'objNewMail.Send End Sub 

比特低技术方法,但使用mailto处理程序,你可以做到这一点

 System.Diagnostics.Process.Start("mailto:something@somewhere.com?subject=hello&attachment=c:\\chicken.xls"); 

注意 :正如所指出的,这可能不适用于所有客户端,因为它不是mailto URL规范的一部分 。 最重要的是(至少在我的世界中)是Outlook 2007不支持它,而旧版本则支持它。

我不确定您是否需要在Outlook中打开电子邮件,或者您只是想发送带有来自c#的附件的电子邮件。 我知道你在outlook中写了开放,但你可能认为这是唯一的方法。 如果您只想发送带附件的电子邮件,可以执行以下操作。

 #using System.Net.Mail; SmtpClient smtpClient = new SmtpClient(host, port); MailMessage message = new MailMessage(from, to, subject, body); Attachment attachment = new Attachment(@"H:\attachment.jpg"); message.Attachments.Add(attachment); System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential(username, password); smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = SMTPUserInfo; smtpClient.Send(message); 

根据您的电子邮件服务器,您也可以在没有身份validation位的情况下执

C#代码通过Outlook发送电子邮件; 没有安全警告。

 var outlook = new ApplicationClass(); MailItem mailItem = (MailItem)outlook.Session.Application.CreateItem(Outlook.OlItemType.olMailItem); mailItem.Display(false);