代码之家  ›  专栏  ›  技术社区  ›  Steven

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

  •  6
  • Steven  · 技术社区  · 15 年前

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

    我需要从C应用程序中做同样的工作,并在XP、Vista、Server2008(我想是Windows7)上运行时让它工作。

    在Vista/2008中,mapisendmail是一个不允许的工具,因为当Outlook运行时,它总是返回mapi_ue_故障,并且托管代码中不支持mapi。 即使检查了此修复程序: http://support.microsoft.com/kb/939718 我不能让它可靠地工作。

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

    最好使用C兼容的解决方案,但我对任何有效的解决方案都很满意(不必使用MAPI)。我似乎找不到当前的“解决方案”。堆栈溢出上的现有答案似乎也没有覆盖这一点。

    编辑:

    我知道MAPI和C不合作,所以我将采取C/C++解决方案在Vista和Server 2008中工作。 不是 以管理员身份运行。请参阅Adobe Reader 9&Microsoft Word作为示例。

    5 回复  |  直到 15 年前
        1
  •  5
  •   AnotherDan    15 年前

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

    下面是我们在Vista和Outlook2007上运行的一些代码片段:(代码在vb.net中)。

    请注意,当对Outlook对象执行某些操作时,使用是安全锁定的。(处理标记为安全风险的机构和其他财产)。我们使用第三方组件(赎回)来解决此安全问题。如果您不使用某种类型的安全管理器,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。

    祝你好运。

        2
  •  2
  •   Corwin Joy    15 年前

    如果您只是在电子邮件中设置属性而不阅读它们,就不需要像上面建议的那样兑换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
    
        3
  •  1
  •   Robert MacLean    15 年前

    Bit Lowtech方法,但使用mailto处理程序可以做到这一点

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

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

        4
  •  1
  •   PeteT    15 年前

    我不确定您是需要在Outlook中打开电子邮件,还是只想发送一封包含附件的电子邮件。我知道你在Outlook中写的是open,但你可能认为这是唯一的方法。如果你只想发送一封带有附件的电子邮件,可以做如下的事情。

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

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

        5
  •  0
  •   RichieHindle    13 年前

    C代码通过Outlook发送电子邮件;不会出现安全警告。

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