2009-01-16 90 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(); 
相關問題