过去,我使用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作为可行的示例。
答案 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);