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

时间:2009-04-24 08:36:14

标签: c# c++ email outlook mapi

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

我需要在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。

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

编辑:

我知道MAPI和C#不能一起工作,因此当 NOT 以管理员身份运行时,我将采用适用于Vista和Server 2008的C / C ++解决方案。见Adobe Reader 9& Microsoft Word作为可行的示例。

5 个答案:

答案 0 :(得分:5)

在工作中,我们使用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。

祝你好运。

答案 1 :(得分:2)

如上所述,只要您只是在电子邮件中设置属性而不是阅读它们,就不需要对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

答案 2 :(得分:1)

Bit lowtech方法,但使用mailto处理程序可以执行此操作

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

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

答案 3 :(得分:1)

我不确定您是否需要在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);

您也可以在没有身份验证位的情况下执行此操作,具体取决于您的电子邮件服务器。

答案 4 :(得分:0)

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

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

mailItem.Display(false);