2009-04-24 2 views
6

이전에는 MAPISendMail을 사용하여 첨부 파일이있는 C++ 응용 프로그램에서 Outlook (또는 원하는 MAPI 전자 메일 응용 프로그램이 무엇이든)을 시작했습니다. (Microsoft Word의 Send Email 기능과 비슷합니다).C#에서 전자 메일 응용 프로그램 (MAPI) 시작 (첨부 파일 포함)

C# 응용 프로그램에서 해당 기능을 수행하고 XP, Vista, Server 2008 (및 Windows 7)에서 실행해야합니다.

MAPISendMail은 Outlook이 실행 중이고 관리 코드에서 MAPI가 지원되지 않을 때 MAPI_ E_FAILURE를 항상 반환하기 때문에 Vista/2008에서는 사용할 수 없습니다. 이 수정 사항을 확인한 후에도 : ​​ http://support.microsoft.com/kb/939718 안정적으로 작동하도록 할 수 없습니다.

저는 Microsoft Word &을 알고 있습니다. Adobe Reader 9는 Vista에서 첨부 파일과 함께 Outlook을 시작할 수 있습니다.

는 C#은 호환 솔루션이 선호 될 수 있지만 (MAPI를 사용하지 않음) 작동 아무것도 드리겠습니다. 나는 현재의 "해결책"이 무엇인지 찾아 낼 수 없다. Stack Overflow에 대한 기존 답변 중 어느 것도이 문제를 다루지 않습니다.

편집 :

내가 알고 MAPI 오전 및 C# 함께 작동하지 않는, 그래서 관리자 권한으로 실행하는 C/C++ Vista에서 작동하는 솔루션 및 서버 2008 하지를 취할 것입니다. 작동하는 예제로 Adobe Reader 9 & Microsoft Word를 참조하십시오. 지적으로는 mailto URL spec의 일부가 아니므로이 모든 클라이언트에서 작동하지 않을 수 있습니다

+0

나는 당신에게 좋은 소식이 없습니다. 이 게시물은 .net과 함께 MAPI 또는 CDO를 사용하지 않아야 함을 나타냅니다. 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, 예전에 읽어보십시오. 이 질문에서 언급했듯이, 작동하지 않는 .NET 응답이 만족 스럽습니다. Vista 나 Server 2008에서 MAPISendMail을 AT ALL에서 작동시키지 못합니다. – Steven

+0

첨부 파일이있는 이메일을 실제로 보내시겠습니까? 아니면 최종 사용자가 Outlook에서이 사실을 공개해야합니까? – PeteT

답변

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를 사용하고 볼 수 있듯이.

행운을 빈다.

+0

활성 바이러스 백신 프로그램을 실행중인 경우 Vista에서 Outlook 2007을 사용하면 Outlook 보안 프롬프트가 표시되지 않습니다. – CoderDennis

+0

나는 이것을 시험해보고 작동하는지, 고마워 할 것이다. – Steven

1

비트 lowtech 방법,하지만 흔한를 핸들러를 사용하여이

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

을 할 수 있습니다. 가장 중요한 것은 (적어도 내 세계에서는) Outlook 2007이 지원하지 않는 반면 구형 버전은 지원하지 않습니다.

+3

불행히도 mailto를 통해 첨부 파일이 작동하지 않습니다. – Steven

+0

@Steven, 사용법은 메일 클라이언트에 따라 다릅니다. 예를 들어 Outlook 2007은 이전 버전과 달리 Outlook 2007을 지원하지 않습니다. –

+0

@Steven, 나는 그것이 위험을 식별하는 유용한 대답이라고 생각하는대로 답변을 업데이트했습니다. –

1

Outlook에서 전자 메일을 열어야하는지 또는 C#의 첨부 파일이있는 전자 메일 만 보내려하는지 확실하지 않습니다. 나는 당신이 아웃룩에서 열어 쓴 것을 알고 있지만 이것이 이것을 할 수있는 유일한 방법이라고 가정하고 있을지도 모른다. 첨부 파일이있는 이메일을 보내려는 경우 다음과 같이 할 수 있습니다.

#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을 통해 전자 메일을 보내는 코드입니다. 보안 경고가 발생하지 않습니다.

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

mailItem.Display(false); 
2

단순히 전자 메일의 속성을 설정하고 읽지 않는 한 위에서 제안한대로 VB에서 사용하지 않아도됩니다. 다음은 첨부 파일이있는 Outlook을 통해 전자 메일을 보거나 보내는 간단한 VB 함수입니다. 이 코드는 Microsoft Outlook 12.0 Object Library (예 : "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

한 개의 댓글이 더 있습니다. Visual C++에서 작업하는 경우 MFC에는 MAPI를 사용하여 첨부 된 문서가 포함 된 전자 메일을 보내는 방법이 있습니다. 이 메서드는 CDocument :: OnFileSendMail()입니다. 이 코드는 MAPI를 통해 자신 만의 "첨부 파일이있는 전자 메일 보내기"를 만드는데도 적응하기 쉽습니다. –