При отправке многопоточного запроса SendEmail возвращается общий сбой Mapi

StackOverflow https://stackoverflow.com/questions/616000

  •  03-07-2019
  •  | 
  •  

Вопрос

Я использую код MAPI Дейва Брукса .

Я пытаюсь программно отправить сгенерированный отчет Crystal.

Когда я запускаю код без потоков, все работает нормально. Проблема заключается в том, что когда я использую многопоточность, я получаю ошибку возврата «Общий сбой 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
Это было полезно?

Решение

Очень поздний ответ, но я решил добавить его в любом случае, так как только что столкнулся с этим и не смог найти ответ в другом месте.

Вам нужно установить состояние квартиры вашего потока в STA, прежде чем он будет запущен с помощью:

theThread.SetApartmentState(ApartmentState.STA);

Обратите внимание, что потоки из пула потоков (например, используемые компонентом BackgroundWorker) являются MTA.

Другие советы

Я столкнулся с той же ошибкой (общий сбой MAPI [2]) и столкнулся с этим решением в начале моей отладки; однако причина моей ошибки была в том, что я запускал приложение от имени администратора, а Outlook работал от имени моего пользователя. Мне было трудно найти причину моей ошибки, так что, надеюсь, это поможет кому-то в том же поиске, что и я.

Если приведенный выше ответ не решит вашу проблему, попробуйте запустить приложение без повышенных привилегий, если это возможно, или найдите способ вызова MAPI с использованием олицетворения пользователя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top