从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);