6

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

我需要在 C# 应用程序中做同样的事情,并让它在 XP、Vista、Server 2008(我想是 Windows 7)上运行时工作。

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

我知道 Microsoft Word 和 Adob​​e Reader 9 都可以在 Vista 下启动带有附件的 Outlook。

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

编辑:

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

4

5 回答 5

5

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

下面是我们在带有 Outlook 2007 的 VISTA 上运行的一些行的片段:(代码在 VB.net 中)。

请注意,在对 Outlook 对象执行某些操作时,该用法是安全锁定的。(将地址、身体和其他财产标记为安全风险)。我们使用第 3 方组件(赎回)来绕过这种安全性。如果您不使用某种安全管理器,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。

祝你好运。

于 2009-05-21T12:03:42.287 回答
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
于 2009-07-16T17:31:16.343 回答
1

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

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

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

于 2009-04-24T08:43:40.350 回答
1

我不确定您是否需要在 Outlook 中打开电子邮件,或者您是否只想从 c# 发送带有附件的电子邮件。我知道你在 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);

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

于 2009-05-26T09:36:03.587 回答
0

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

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

mailItem.Display(false);
于 2009-07-07T20:01:19.813 回答