L'invio di una richiesta SendEmail multi-thread restituisce un errore generale di Mapi

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

  •  03-07-2019
  •  | 
  •  

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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top