L'invio di una richiesta SendEmail multi-thread restituisce un errore generale di Mapi
Domanda
Sto usando il codice MAPI di Dave Brooks .
Sto tentando di inviare a livello di codice un report Crystal che viene generato.
Quando corro attraverso il codice senza thread tutto funziona bene. Il problema è che quando utilizzo il threading ottengo l'errore di ritorno " Errore MAPI generale [2] " ;.
Non ho mai usato il threading prima e capisco che ci sono pericoli. Qualcuno può fornire qualche idea su questo problema? NOTA: ho rimosso la gestione delle eccezioni per rendere più chiaro il codice.
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
Soluzione
Una risposta molto tardiva, ma ho pensato di aggiungerla comunque appena l'ho incontrata e non ho potuto trovare una risposta altrove.
È necessario impostare lo stato dell'appartamento del thread su STA prima che venga avviato utilizzando:
theThread.SetApartmentState(ApartmentState.STA);
Nota che i thread del threadpool (ad esempio utilizzati dal componente BackgroundWorker) sono MTA.
Altri suggerimenti
Ho riscontrato lo stesso errore (errore MAPI generale [2]) e ho riscontrato questa soluzione all'inizio del mio debug; tuttavia, la causa del mio errore era dovuta all'esecuzione della mia applicazione come amministratore mentre Outlook era in esecuzione come mio utente. Ho avuto difficoltà a trovare la causa del mio errore, quindi spero che questo possa aiutare qualcuno nella mia stessa ricerca.
Se la risposta sopra non risolve il problema, prova a eseguire l'applicazione senza privilegi elevati, se possibile, o trova un modo per chiamare MAPI usando la rappresentazione dell'utente.