2009-01-16 191 views
5

用例很简单。在一定的时间点,我需要能够与如何使用用户的默认电子邮件客户端弹出撰写/创建邮件对话框?

  • 领域的,像,主题已经充满了一定的应用确定的值显示给用户他所熟悉的撰写电子邮件对话框(Outlook或其他)。
  • 电子邮件也会随附一个附件。

邮件不应该发送,除非用户明确地确定它。

我曾经在OL'VB6的日子回来过..现在不知道现在怎么做..我只记得这很容易。

托管的应用程序,C#,.NET 3.0+

更新#1:是啊,似乎例如mailto对附件的支持删除(如安全风险吗?)。我试过

您需要包含ShellExecute签名as described here。所有我从这个得到的是一个5 SE_ERR_ACCESSDENIED和2只为一些品种

string sMailToLink = @"mailto:[email protected]?subject=Hey&body= yeah yeah yeah"; 
IntPtr result = ShellExecute(IntPtr.Zero, "open", sMailToLink, "", "", ShowCommands.SW_SHOWNORMAL); 
Debug.Assert(result.ToInt32() > 32, "Shell Execute failed with return code " + result.ToInt32()); 

同样MailtoLink用的Process.Start工程完美...但只要你不可不提的附件

System.Diagnostics.Process.Start(sMailToLink); 

其他的选项是使用Outlook对象模型来做到这一点..但我已经被告知,这需要您根据所安装的Outlook的确切版本添加组件引用。如果用户不喜欢电子邮件,这也会爆炸。

下一个选项是Mapi和Mapi33 ..状态仍在进行中。耳朵仍然接受建议。

回答

2

这可能是而不是最有效或优雅的方式,但是我认为,炮击一个“mailto:”链接将会做你想做的。

编辑:对不起,遗漏了一个非常重要的“不”。

+0

耶发现这个通过谷歌搜索的文件。然而,ShellExecute现在不想和我说话。 :) – Gishu 2009-01-16 12:29:10

1

难道是你使用的mailto:协议?

几乎所有你突出显示的内容都可以完成,但我确信你不能做附件。

Microsoft MailTo Documentation

+0

是啊看起来像它。有点OT ... w.r.t这个例子,不知何故,它在VB6比在.net更容易。 – Gishu 2009-01-16 12:28:33

10

您可以创建一个进程对象,并将它称之为“电子邮件地址:[email protected]主题=我+新+主题”。这将导致系统采用其默认处理程序对mailto执行操作,但是,您可以设置主题,而不会处理添加附件。我会毫不犹豫地承认,我不完全确定如何在不写邮件插件的情况下强制附件。

过程代码:

System.Diagnostics.Process.Start("mailto:[email protected]?subject=My+New+Subject"); 
+0

thx但没有附件:( – Gishu 2009-01-16 12:21:36

2

由于邮寄地址不支持附件,因为MAPI不托管代码中支持,最好的办法就是编写(或请人写)小非管理程序调用可以使用命令行参数调用的MAPI函数。可惜的是,.NET没有一个更清洁的选择。

参见:MAPI and managed code experiences?

+0

是的,我在想同样的事情..我的意思是全能的.net框架无法获得发送电子邮件对话框,它有多难?:)这是一个小时前。 – Gishu 2009-01-16 12:27:21

0

你正在做的假设,他们将不得不安装一个电子邮件客户端,当然。

我过去采用的选项(在每个人至少安装一个版本的Outlook的企业环境中)是使用Outlook互操作 - 您只需引用您需要支持的最早版本。

你可以看看P/Invoking MAPISendDocuments(我试图避免,个人),或另一种选择是创建自己的“撰写”窗体并使用System.Net.Mail命名空间中的对象。

+0

滚动自己的写作形式是走了一条非常漫长而棘手的道路的第一步。对于一个网络应用程序来说可能是可以的,但在桌面上,很多事情都可以正确地提出要求。多个邮件地址,地址簿支持,发件箱中的邮件副本,帐户管理以及我​​没有字符。 – Ishmaeel 2009-01-16 15:04:43

0

开始处理mailto:参数是最简单的方法。但是,它不允许任何复杂的事情。

略有不同的方法涉及创建电子邮件模板,然后将其送入的Process.Start

var client = new SmtpClient(); 

var folder = new RandomTempFolder(); 
client.DeliveryMethod = 
    SmtpDeliveryMethod.SpecifiedPickupDirectory; 

client.PickupDirectoryLocation = folder.FullName; 

var message = new MailMessage("[email protected]", 
    "[email protected]", "Subject","Hi and bye"); 

// add attachments here, if needed 
// need this to open email in Edit mode in OE 
message.Headers.Add("X-Unsent", "1"); 

client.Send(message); 

var files = folder.GetFiles(); 

Process.Start(files[0].FullName); 

方案默认电子邮件处理程序:

  • Outlook Express中打开
  • 的Windows :Outlook - 默认情况下不处理,而是调用Outlook Express
  • Windows:蝙蝠! - 消息打开查看,点击Shift-F6并回车发送

我也测试过单声道,它的工作或多或少。

其他细节在这个岗位可供选择:Information integration - simplest approach for templated emails

PS:到底我去稍微复杂的场景:

    上述
  • 定义的接口IEmailIntegraton
  • 代码走进DefaultEmailIntegration
  • 为OutlookEmailIntegration(自动化)和theBat添加了实现!电子邮件整合(使用他们的模板格式)。
  • 的的SmartClient的允许用户选择从下拉的情况下(或者这可能已经被实现为“检查系统默认的邮件处理程序,并自动决定”)
-1

可以使用如果您打算使用Outlook [此代码基于Outlook 2010 [v14.0.0。]] 创建Outlook MailItem 并传输文件(即下载) 如果用户打开文件(。MSG)撰写消息对话框这里自动打开

是代码...

Microsoft.Office.Interop.Outlook.Application outapp = new Application(); 
    try 
    { 

     _NameSpace np = outapp.GetNamespace("MAPI"); 
     MailItem oMsg = (MailItem)outapp.CreateItem(OlItemType.olMailItem); 
     oMsg.To = "[email protected]"; 
     oMsg.Subject = "Subject"; 

     //add detail 

     oMsg.SaveAs("C:\\Doc.msg", OlSaveAsType.olMSGUnicode);//your path 
     oMsg.Close(OlInspectorClose.olSave); 
    } 
    catch (System.Exception e) 
    { 
     status = false; 
    } 
    finally 
    { 
     outapp.Quit(); 
    } 

然后发送创建你说“Doc.msg”

string filename ="Doc.msg";//file name created previously 
    path = "C:\\" + filename; //full path ; 
    Response.ContentType="application/outlook"; 
    Response.AppendHeader("Content-Disposition", "filename=\"" + filename + "\""); 
    FileInfo fl = new FileInfo(path); 
    Response.AddHeader("Content-Length", fl.Length.ToString()); 
    Response.TransmitFile(path,0,fl.Length); 
    Response.End(); 
相关问题