我正在使用MAPI code by Dave Brooks。
我正在尝试以编程方式发送生成的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 :(得分:7)
一个非常晚的答案,但我认为无论如何我都会添加它,因为我刚刚遇到这个并且在其他地方找不到答案。
您需要在启动之前将线程的公寓状态设置为STA:
theThread.SetApartmentState(ApartmentState.STA);
请注意,来自线程池的线程(例如,由BackgroundWorker组件使用)是MTA。
答案 1 :(得分:6)
我遇到了同样的错误(一般MAPI失败[2])并且在我的调试早期遇到了这个解决方案;但是,我的错误的原因是由于我的应用程序以管理员身份运行,而outlook作为我的用户运行。我很难找到错误的原因,所以希望这会帮助像我这样的搜索。
如果上述答案无法解决您的问题,请尝试在没有提升权限的情况下运行您的应用程序,或者找一种方法使用用户模拟调用MAPI。