Vb.net 发送多线程SendEmail请求返回常规Mapi失败
我在用电话 我试图通过编程发送生成的水晶报告 当我在没有线程的情况下运行代码时,一切都正常运行。问题是,当我使用线程时,返回错误“General MAPI failure[2]” 我以前从未使用过线程,我知道这会带来危险。有人能对这个问题提供一些见解吗?注意:为了使代码更清晰,我删除了异常处理Vb.net 发送多线程SendEmail请求返回常规Mapi失败,vb.net,mapi,Vb.net,Mapi,我在用电话 我试图通过编程发送生成的水晶报告 当我在没有线程的情况下运行代码时,一切都正常运行。问题是,当我使用线程时,返回错误“General MAPI failure[2]” 我以前从未使用过线程,我知道这会带来危险。有人能对这个问题提供一些见解吗?注意:为了使代码更清晰,我删除了异常处理 Private Sub RunReport() SetParameters() SaveReportFile() Dim operation As New ThreadStar
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
一个很晚的答案,但我想我还是要添加它,因为我刚刚遇到这个问题,在别处找不到答案 在开始使用之前,您需要将线程的安装状态设置为STA:
theThread.SetApartmentState(ApartmentState.STA);
请注意,线程池中的线程(例如BackgroundWorker组件使用的线程)是MTA。我遇到了相同的错误(常规MAPI故障[2]),并在调试早期遇到了此解决方案;但是,出现错误的原因是以管理员身份运行应用程序,而outlook以用户身份运行。我很难找到我的错误原因,所以希望这将有助于与我相同的搜索
如果上述答案不能解决您的问题,请尽可能在没有提升权限的情况下运行应用程序,或者找到使用用户模拟调用MAPI的方法。MAPI是COM api,因此您需要检查MAPI是否支持多线程。还有,你一定要使用MAPI吗?如果您只是发送电子邮件,是否可以使用System.NET.Mail中内置的.NET framework中的SMTP支持?那么至少你没有使用COM api。这行代码是否打开了用户的默认电子邮件客户端?这正是我使用我的电子邮件客户端时遇到的问题;由于它所包含的DLL在生成后必须发送到%PROGRAMFILES%,因此我以管理员身份运行VS,但Outlook以我的身份运行。在纠正了这种情况之后,它现在运行得非常完美+先生,给你一个!永远都不会太晚,这只会拯救我的一天,谢谢!