2009-04-24 30 views
6

Trước đây tôi đã sử dụng MAPISendMail để khởi chạy Outlook (hoặc bất kỳ ứng dụng email MAPI mong muốn nào) từ một ứng dụng C++ có tệp đính kèm. (Tương tự như chức năng Gửi Email của Microsoft Word).Khởi chạy ứng dụng email (MAPI) từ C# (có tệp đính kèm)

Tôi cần thực hiện tương đương từ ứng dụng C# và để ứng dụng hoạt động khi chạy trên XP, Vista, Server 2008 (và Windows 7 tôi giả sử).

MAPISendMail là không đi theo Vista/2008 vì nó luôn trả về MAPI_ E_FAILURE khi Outlook đang chạy và MAPI không được hỗ trợ trong mã được quản lý. Ngay cả sau khi kiểm tra sửa lỗi này: http://support.microsoft.com/kb/939718 Tôi không thể làm cho nó hoạt động đáng tin cậy.

Tôi biết rằng Microsoft Word & Adobe Reader 9 có thể vừa khởi chạy Outlook với tệp đính kèm trong Vista.

Giải pháp tương thích C# sẽ được ưu tiên nhưng tôi sẽ hài lòng với bất kỳ thứ gì hoạt động (không phải sử dụng MAPI). Tôi dường như không thể tìm thấy "giải pháp" hiện tại là gì. Không có câu trả lời hiện có nào trên Stack Overflow dường như bao gồm cả điều này.

Edit:

Tôi biết MAPI và C# không làm việc cùng nhau, vì vậy tôi sẽ mất một C/C++ giải pháp mà làm việc trong Vista và Server 2008 khi KHÔNG chạy as administrator. Xem Adobe Reader 9 & Microsoft Word làm ví dụ hoạt động.

+0

Tôi e rằng mình không có tin vui cho bạn. Bài đăng này dường như chỉ ra rằng bạn không nên sử dụng MAPI hoặc CDO với .net ở tất cả: 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

+0

@JMarsch, yep đọc trước đó. Như tôi đã đề cập trong câu hỏi, tôi hài lòng với câu trả lời không .NET. Tôi không thể nhận MAPISendMail hoạt động AT ALL trong Vista hoặc Server 2008. – Steven

+0

Bạn có thực sự muốn chỉ gửi một email có tệp đính kèm không. Hoặc người dùng cuối thực sự cần phải có điều này mở trong triển vọng? – PeteT

Trả lời

5

Tại nơi làm việc, chúng tôi đã thực hiện thành công việc này bằng VSTO.

Dưới đây là một đoạn trích của một số dòng chúng tôi đã chạy trên VISTA với Outlook 2007: (mã nằm trong VB.net).

Lưu ý rằng việc sử dụng được khóa bảo mật khi thực hiện một số việc nhất định với đối tượng outlook. (để giải quyết, cơ thể và các tài sản khác được đánh dấu là rủi ro bảo mật). Chúng tôi sử dụng một thành phần của bên thứ 3 (Redemption) để bảo vệ an ninh này. Nếu bạn không sử dụng một trình quản lý bảo mật của một số loại, triển vọng sẽ cung cấp cho một popup nhỏ mà một cái gì đó bên ngoài đang cố gắng truy cập nó và bạn có thể cung cấp cho nó truy cập trong một khoảng thời gian.

Nhập khẩu giao diện Outlook.

Imports Outlook = Microsoft.Office.Interop.Outlook 

Ví dụ này là cung cấp cho bạn một số hướng, không phải là ví dụ làm việc đầy đủ.

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) 

Các OutlookSession trong ví dụ trên là xuất phát từ tài sản này:

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 

Như bạn có thể nhìn thấy nó được sử dụng MAPI bên trong cho việc này.

Chúc bạn may mắn với nó.

+0

Với Outlook 2007 trên Vista nếu bạn có chương trình Anti-Virus đang hoạt động, bạn sẽ không nhận được lời nhắc bảo mật Outlook. – CoderDennis

+0

Tôi sẽ kiểm tra điều này và xem nó hoạt động, cảm ơn. – Steven

1

phương pháp Bit lowtech, nhưng sử dụng mailto xử lý bạn có thể làm điều này

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

Note: Như đã chỉ ra điều này có thể không hoạt động trên tất cả các khách hàng vì nó không phải là một phần của mailto URL spec. Quan trọng nhất (trong thế giới của tôi ít nhất) là Outlook 2007 không hỗ trợ nó, trong khi các phiên bản cũ hơn đã làm.

+3

Rất tiếc tệp đính kèm không hoạt động qua mailto. – Steven

+0

@Steven, việc sử dụng phụ thuộc vào ứng dụng thư khách. Ví dụ, Outlook 2007 không hỗ trợ nó, trong khi các phiên bản cũ hơn đã làm. –

+0

@Steven, tôi đã cập nhật câu trả lời để phản ánh điều này vì tôi nghĩ đó là câu trả lời hữu ích với những rủi ro được xác định. –

1

Tôi không chắc chắn nếu bạn cần email để mở trong triển vọng hoặc nếu bạn chỉ muốn gửi email có tệp đính kèm từ C#. Tôi biết bạn đã viết mở trong triển vọng nhưng bạn có thể giả định đây là cách duy nhất để làm điều đó. Nếu bạn chỉ muốn gửi một email với một tập tin đính kèm nó có thể được thực hiện một cái gì đó như dưới đây.

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

Bạn cũng có thể làm điều đó mà không cần bit xác thực tùy thuộc vào máy chủ email của bạn.

0

Mã C# để gửi email qua Outlook; không có cảnh báo bảo mật nào xảy ra.

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

mailItem.Display(false); 
2

Bạn không thực sự cần đổi quà cho VB như được đề xuất ở trên miễn là bạn chỉ cần đặt thuộc tính trong email và không đọc chúng. Đây là một hàm VB đơn giản để hiển thị/gửi e-mail thông qua triển vọng với phần đính kèm. (Mã này tham chiếu Thư viện đối tượng Microsoft Outlook 12.0, ví dụ: "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 
+0

Một nhận xét khác. Nếu bạn đang làm việc trong hình ảnh C++, MFC có một phương pháp để chỉ đơn giản là gửi một e-mail với một tài liệu đính kèm bằng cách sử dụng MAPI. Phương thức này là CDocument :: OnFileSendMail(). Mã này cũng dễ dàng thích ứng để tạo ra "gửi e-mail của bạn với sự gắn bó" của riêng bạn thông qua MAPI. –

Các vấn đề liên quan