2009-03-05 6 views
5

나는 MAPI code by Dave Brooks을 사용하고 있습니다.멀티 스레드 SendEmail 요청을 보내면 일반 Mapi 실패가 발생합니다.

생성 된 Crystal Report를 프로그래밍 방식으로 보내려고합니다.

모든 코드를 스레딩하지 않고 실행하면 정상적으로 실행됩니다. 문제는 스레딩을 사용하여 리턴 오류 "일반 MAPI 실패 [2]"가 발생할 때입니다.

나는 전에 쓰레딩을 사용 해본 적이 없으며 위험성이 있다는 것을 알고 있습니다. 누구든지이 문제에 대한 통찰력을 제공 할 수 있습니까? 참고 : 코드를 명확하게하기 위해 예외 처리를 제거했습니다.

Private Sub RunReport() 
    SetParameters() 
    SaveReportFile() 


    Dim operation As New ThreadStart(AddressOf SendEmail) 
    Dim theThread As New Thread(operation) 
    theThread.Start() 
End Sub 

Public Sub SendEmail() 
    Dim m As MAPI 
    m = New MAPI() 
    Dim email As String 
    For Each email In emailAddress 
     m.AddRecipientBCC(email) 
    Next email 
    m.AddAttachment(@"c:\temp\report.pdf") 
    m.SendMailPopup("Requested Report", "") 
End Sub 
+0

MAPI는 COM API이므로 MAPI가 멀티 스레딩을 지원하는지 확인해야합니다. 또한 절대적으로 MAPI를 사용해야합니까? 단순히 이메일을 보내는 경우 System.Net.Mail에있는 .NET 프레임 워크에 내장 된 SMTP 지원을 사용할 수 있습니까? 그럼 적어도 당신은 COM API를 사용하지 않습니다. –

+0

이 코드 라인이 사용자의 기본 전자 메일 클라이언트를 여는가? – Rich

답변

6

매우 늦은 대답이지만 어쨌든 나는이 문제가 발생하여 다른 곳에서 답을 찾을 수 없다고 생각합니다. (예를 들어, BackgroundWorker 구성 요소에서 사용) 스레드 풀에서 스레드가 MTA입니다

theThread.SetApartmentState(ApartmentState.STA); 

참고 :

당신은 그것을 사용하기 시작하기 전에 STA에 스레드의 아파트 상태를 설정해야합니다.

+0

이 작품은 고마워요. –

+0

너무 늦었어요. 그냥 하루 만 지내고 고마워요! – Rafael

6

이 오류 (일반 MAPI 실패 [2])가 발생하여 디버깅 초기에이 솔루션을 발견했습니다. 그러나 내 오류 원인은 Outlook이 내 사용자로 실행되는 동안 관리자로 내 응용 프로그램을 실행했기 때문입니다. 나는 내 오류의 원인을 찾기가 힘들었 기 때문에 이것이 나 같은 검색에서 누군가를 도울 수 있기를 바랍니다.

위의 대답으로 문제가 해결되지 않으면 가능하면 높은 권한없이 응용 프로그램을 실행하거나 사용자 가장을 사용하여 MAPI에 전화하는 방법을 찾으십시오.

+0

이것은 정확하게 내 문제를 사용했을 때의 문제였습니다. 그 안에 포함 된 DLL은 빌드 된 후 % PROGRAMFILES %로 보내야했는데 VS를 관리자로 실행했지만 Outlook은 나와 같이 실행되었습니다. 상황을 바로 잡고 이제는 완벽하게 실행됩니다. +1, 선생님! – Adrian