2009-03-05 8 views
5

Sto utilizzando lo MAPI code by Dave Brooks.L'invio di richieste SendEmail multi-thread restituisce l'errore Mapi generale

Sto tentando di inviare un report Crystal generato in modo programmatico.

Quando eseguo il codice senza eseguire il thread, tutto funziona correttamente. Il problema è che quando utilizzo il thread ottengo l'errore di ritorno "Errore generale MAPI [2]".

Non ho mai usato la filettatura e capisco che ci sono pericoli. Qualcuno può fornire una panoramica di 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 
+0

MAPI è una API COM quindi è necessario verificare se MAPI supporta anche il multi-threading. Inoltre, devi assolutamente usare MAPI? Se stai semplicemente inviando email, puoi semplicemente usare il supporto SMTP integrato nel framework .NET trovato in System.Net.Mail? Quindi almeno non stai utilizzando una API COM. –

+0

Questa riga di codici apre il client di posta elettronica predefinito dell'utente? – Rich

risposta

6

Una risposta molto tarda, ma ho pensato di aggiungerla comunque mentre ho appena incontrato questo e non ho potuto trovare una risposta altrove.

È necessario impostare lo stato del vostro appartamento thread per STA prima di essere avviato utilizzando:

theThread.SetApartmentState(ApartmentState.STA); 

Nota che le discussioni del pool di thread (per esempio utilizzato per componente BackgroundWorker) sono MTA.

+0

Funziona, grazie mille –

+0

Non è mai troppo tardi, questo mi ha salvato la giornata, grazie! – Rafael

6

Ho riscontrato questo stesso errore (errore MAPI generale [2]) e ho trovato 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 stessa ricerca come me.

Se la risposta di cui sopra non risolve il problema, provare a eseguire l'applicazione senza privilegi elevati se possibile o trovare un modo per chiamare MAPI utilizzando la rappresentazione dell'utente.

+0

Questo era esattamente il problema che avevo quando usavo il mio; dal momento che la DLL in cui era contenuto doveva essere inviata a% PROGRAMFILES% dopo essere stata costruita, stavo eseguendo VS come amministratore, ma Outlook era in esecuzione come me. Dopo aver corretto la situazione, ora funziona perfettamente. +1 per te, signore! – Adrian