2009-03-05 55 views
5

我正在使用MAPI code by Dave Brooks發送多線程SendEmail請求返回通用Mapi失敗

我正在嘗試編程發送一個生成的Crystal報表。

當我運行代碼而沒有線程時,一切運行正常。問題是當我使用線程時,我得到了返回錯誤「General MAPI failure [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。 – 2009-04-24 00:13:24

+0

這行代碼是否打開用戶的默認電子郵件客戶端? – Rich 2017-07-20 06:05:46

回答

6

一個很晚的答案,但我想我會加上它,因爲我剛剛遇到這個,並且無法在其他地方找到答案。

您需要它正在使用你的啓動線程的公寓狀態設置爲STA:

theThread.SetApartmentState(ApartmentState.STA); 

要注意,從線程池(例如使用BackgroundWorker組件)線程是MTA。

+0

這工作,非常感謝 – 2010-01-27 18:32:02

6

我遇到了同樣的錯誤(一般MAPI失敗[2]),並在我的調試早期遇到了這個解決方案;然而,我的錯誤的原因是由於作爲管理員運行我的應用程序,而Outlook作爲我的用戶運行。我很難找到我的錯誤的原因,所以希望這將有助於與我一樣的搜索的人。

如果上述答案無法解決您的問題,請嘗試在不提升權限的情況下運行應用程序(如果可能),或者嘗試使用用戶模擬方式調用MAPI。