2009-04-24 74 views
6

過去,我使用MAPISendMail從具有文件附件的C++應用程序啓動Outlook(或任何期望的MAPI電子郵件應用程序)。 (類似於說Microsoft Word的發送電子郵件功能)。從C#啓動電子郵件應用程序(MAPI)(附帶附件)

我需要做一個C#應用程序的等價物,並讓它在XP,Vista,Server 2008(以及Windows 7我想)上運行時可以工作。

MAPISendMail在Vista/2008下是不行的,因爲它在Outlook運行時總是返回MAPI_ E_FAILURE,而託管代碼中不支持MAPI。 即使在檢查此修復後: http://support.microsoft.com/kb/939718 我無法讓它可靠地工作。

我知道Microsoft Word & Adob​​e Reader 9可以在Vista下使用附件啓動Outlook。

C#兼容解決方案將是首選,但我會很高興與任何工作(不必使用MAPI)。我似乎無法找到目前的「解決方案」。堆棧溢出現有的答案似乎也沒有涵蓋這一點。

編輯:

我意識到MAPI和C#不在一起工作,所以我會在Vista中工作的C/C++的解決方案和Server 2008時以管理員身份運行。請參閱Adobe Reader 9 & Microsoft Word作爲示例工作。

+0

恐怕我對你沒有任何好消息。這篇文章似乎表明您不應該使用MAPI或CDO與.net在所有:http://blogs.msdn.com/mstehle/archive/2007/10/03/fyi-why-are-mapi-and- cdo-1-21-not-supported-in-managed-net-code.aspx – JMarsch 2009-05-19 22:15:08

+0

@JMarsch,是的,讀之前。正如我在問題中提到的,我很滿意非.NET的解決方案。我無法使MAPISendMail在Vista或Server 2008下全部工作。 – Steven 2009-05-20 04:24:54

+0

您是否真的想發送帶附件的電子郵件?或者最終用戶是否真的需要在Outlook中打開它? – PeteT 2009-05-26 09:19:28

回答

5

在工作中,我們已經使用VSTO成功完成了這項工作。

下面是我們在Outlook 2007上運行的一些代碼片段:(代碼在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。

祝你好運。

1

位lowtech方法,但使用的mailto處理程序,你可以做到這一點

System.Diagnostics.Process.Start("mailto:[email protected]?subject=hello&attachment=c:\\chicken.xls"); 

注意:正如指出的,這可能並不適用於所有客戶的工作,因爲它是不是mailto URL spec的一部分。最重要的是(至少在我的世界裏)是Outlook 2007不支持它,而舊版本則支持。

+3

不幸的是附件不能通過mailto工作。 – Steven 2009-04-24 08:48:07

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

根據您的電子郵件服務器,您也可以在沒有驗證位的情況下執行此操作。

0

通過Outlook發送電子郵件的C#代碼;沒有安全警告發生。

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

mailItem.Display(false); 
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 = "[email protected]_me_not.com" 
     .Subject = "test" 
     .Body = "Test Body" 
     .Attachments.Add filename, Outlook.OlAttachmentType.olByValue 
    End With 

    objNewMail.Display 

    'objNewMail.Send 
End Sub