문제

관리 코드 내에서 MAPI 함수를 사용하는 것은 공식적으로 지원되지 않습니다.분명히 MAPI는 자체 메모리 관리를 사용하며 관리 코드 내에서 충돌 및 화상을 입습니다(참조: 여기 그리고 여기)

내가 원하는 것은 기본 이메일 클라이언트를 시작하는 것뿐입니다. 주제, 본문, AND 하나 이상의 첨부 파일.

그래서 알아보고 있었는데 MAPIS보내기문서 그리고 그것은 작동하는 것 같습니다.하지만 실제로 프로덕션 코드에서 해당 기능을 사용할 용기가 나지 않았습니다.

이 기능 많이 사용해보신 분 계신가요?무서운 이야기가 있나요?

추신.아니요, 첨부 파일에 대한 명령줄 인수를 사용하여 Outlook.exe를 shellExecute하지 않습니다.

조달청.첨부 파일 지원은 요구 사항 , 따라서 Mailto:솔루션은 나에게 적합하지 않습니다.

도움이 되었습니까?

해결책

필요한 작업을 수행하고 이를 기본 앱에서 호출하는 명령줄 매개변수(또는 StandardInput에 대한 파이프)를 사용하는 별도의 도우미 EXE를 준비하세요.이렇게 하면 MAPI 항목이 기본 앱의 프로세스 공간 외부에 유지됩니다.좋아, 여전히 MAPI와 .NET을 혼합하고 있지만 매우 짧은 프로세스입니다.MAPI와 CLR이 장기 실행 프로세스에 문제를 일으키기 시작한다고 가정합니다.

우리는 Dmitry Streblechenko의 뛰어난 제품을 사용합니다. 상환 데이터 개체 JScript에서 이러한 "shim" 코드를 작성하고 이를 호출할 수 있는 라이브러리입니다. 이는 CLR 및 MAPI 세계를 별도의 프로세스에 유지하지만 지원되는 방식으로 유지합니다.

@Chris Fournier 재.관리되지 않는 DLL을 작성합니다.문제는 MAPI와 관리 코드를 혼합하는 것이므로 작동하지 않습니다. 같은 과정에서.

다른 팁

MAPISendDocuments는 더 이상 사용되지 않으며 제거될 수 있습니다.대신 MAPISendMail을 사용해야 합니다.보다 단순 MAPI

호출 프로세스.에서 시작 메일 수신자:규약 (아래 참조)는 기본 기능을 제공하지만 첨부 파일은 제공하지 않습니다.

Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");

첨부 파일 경로를 사용하여 이 접근 방식을 수행할 수 있지만 이 옵션은 98과 같은 일부 이전 버전의 Outlook에서만 작동합니다.나는 이것이 잠재적인 보안 위험 때문이라고 생각합니다.

누군가 outlook.exe를 사용하는 경우 Outlook 2003(및 설정에 따라 2007)에서 보안 경고가 표시됩니다.

MAPI를 사용하여 원하는 작업을 수행하는 관리되지 않는 DLL을 만든 다음 관리 코드에서 해당 DLL을 호출할 수 있어야 합니다.나는 직접적인 MAPI 래퍼를 작성하지 않고 해당 관리되지 않는 DLL에 포함된 MAPI에 필요한 모든 기능을 수행하는 래퍼를 작성합니다.이는 아마도 관리 코드에서 MAPI를 사용하는 가장 안전한 방법일 것입니다.

당신은 또한 사용할 수 있습니다 Outlook 상환, 관리 코드에서 지원됩니다.간단한 MAPISendDocuments 대체 기능이 있는지 즉시 확신할 수 없지만 질문이 있는 경우 Dmitry가 도움이 됩니다.

"충돌 및 화상"에 관해 MS 지원 담당자의 또 다른 인용문은 다음과 같습니다. 여기

그것은 대부분 작동하는 종류의 것입니다.당신이 그것을 쓰는 동안 그것은 작동할 것입니다.그러면 테스트하는 동안 작동할 것입니다.고객이 평가하는 동안 작동합니다.그런 다음 고객이 배포하자마자 - BAM!그때부터 문제가 발생하기로 결정하게 됩니다.그리고 Microsoft는 처음부터 그렇게 하지 말라고 말했기 때문에 이에 대해 도움을 주지 않을 것입니다.:)

나는 MAPISendMail 함수와 여러 내부 클래스를 사용하여 다른 MAPI 관련 구조 중 일부를 래핑하여 이 작업을 수행했습니다.이것이 유일한 용도인 한, 관리되지 않는 다양한 데이터 유형과 메모리 할당/할당 해제 및 GC에 매우 세심한 주의가 필요하므로 안전하게 수행하는 것이 사소하지는 않지만 가능합니다.아직 지원되지는 않지만 프로덕션 코드에서 이것을 사용하고 있습니다(아직 출시되지는 않았지만).

Matt Stehle에게 이에 대해 물었을 때 제가 받은 답변은 다음과 같습니다.

이 작업을 수행하는 더 좋은 방법은 실제로 알지 못하며 여기서 발생한 모든 문제는 지원되는 시나리오(예:VB6 또는 관리되지 않는 C++)..NET에서 호출되는 이 함수로 인해 문제가 발생하는 시나리오에 직면한 경우 .NET을 사용하지 말라는 다른 권장 사항은 없습니다.

이를 사용하는 것이 축복이라고는 할 수 없지만 관리 코드에서 실제로 이 작업을 수행할 수 있는 다른 옵션이 있다는 것도 언급하지 않았습니다.

다음 코드는 MAPI를 사용하지 않지만 임의의 첨부 파일이 있는 "메일 작성" 창을 엽니다.

(실제로 완전히 테스트되지 않았지만 효과가 있다고 생각되는 응용 프로그램에서 파헤쳤습니다)

using Microsoft.Office;
using Microsoft.Office.Core;

...

Outlook.Application outlook = new Outlook.Application();
Outlook.MailItem mail = (Outlook.MailItem) outlook.CreateItem(Outlook.OlItemType.olMailItem);

mail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
mail.HTMLBody = "stuff";
mail.Subject = "more stuff";
string file = File.ReadAllBytes(...);
mail.Attachments.Add(file, Outlook.OlAttachmentType.olByValue, 1, file)

mail.Display(false);

MAPI 경험이 있는 사람의 경우 비관리 코드에서 원하는 작업을 정확히 수행하기 위해 코드를 작성하는 데 시간이 덜 걸립니다(읽기:일반 C++) 이 게시물을 입력하고 응답을 읽는 것보다(공격적이지 않음)

운 좋게도 필요한 기능이 제한되어 있습니다.필요한 것은 명령줄에서 필요한 매개변수를 가져와 올바른 MAPI 호출을 실행하는 간단한 C++ 유틸리티뿐입니다.그런 다음 다른 프로세스를 실행하는 것처럼 관리 코드에서 이 모든 유틸리티를 사용합니다.

HTH

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top