Poiché SmtpClient non è completamente thread-safe e non può inviare più e-mail contemporaneamente, l'unico modo per creare una soluzione scalabile e performante è creare il proprio pool di istanze SmtpClient.
Una semplice implementazione sarebbe sulla falsariga di
- Scrivi una classe EmailSender e registrati come singleton con il tuo contenitore IOC. Falla creare una coda di SmtpClients all'inizializzazione e mantieni un riferimento privato alla coda.
- Quando l'applicazione invia un'email, blocca la coda e prende uno SmtpClient dalla coda se ce n'è uno. Se la coda è vuota, costruisci invece un nuovo SmtpClient.
- La versione sincrona è più facile perché basta avvolgere il send in try / finally e aggiungere lo SmtpClient alla coda nella parte finale.
- La versione asincrona è leggermente più complicata ma anche possibile.
- Fai attenzione a reimpostare SmtpClient in uno stato di partenza valido prima di aggiungerlo alla coda. Fai particolare attenzione quando l'invio fallisce.
- Smaltire facoltativamente SmtpClients anziché aggiungerli al conteggio della coda supera una soglia configurabile.
Esiste anche una versione più complicata in cui si inviano un sacco di e-mail molto simili. In questo caso è possibile avere più pool che inizializzano SmtpClients per ogni tipo di email inviata dall'applicazione.