2015-08-25 6 views
5

Sto sviluppando un sito Web utilizzando ASP.NET. Lì sto mandando e-mail agli utenti.Come creare un meccanismo di coda di posta elettronica in ASP.NET In caso di interruzione della rete?

Attualmente sto usando questo codice per inviare email in modo asincrono all'utente. Le email stanno inviando in background.

public static void SendEmail(string Path, string EmailTo) 
{ 
    Thread emailThread = new Thread(delegate() 
    { 
     try 
     { 
      string body = string.Empty; 
      using (StreamReader reader = new StreamReader(Path)) 
      { 
       body = reader.ReadToEnd(); 
      } 
      MailMessage mail = new MailMessage(); 

      mail.From = new MailAddress("[email protected]"); 
      mail.To.Add(EmailTo); 
      mail.Subject = "Test email"; 
      mail.Body += body; 
      mail.IsBodyHtml = true; 

      SmtpClient smtpClient = new SmtpClient("smtp.test.com");    
      smtpClient.Port = 587; 
      smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
      smtpClient.UseDefaultCredentials = false; 
      smtpClient.Credentials = new System.Net.NetworkCredential("[email protected]", "test"); 
      smtpClient.EnableSsl = true; 

      smtpClient.SendCompleted += (s, e) => 
      { 
       smtpClient.Dispose(); 
       mail.Dispose(); 
      }; 
      try 
      { 
       smtpClient.Send(mail); 
      } 
      catch (Exception ex) { /* exception handling code here */ } 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
    }); 
    emailThread.IsBackground = true; 
    emailThread.Start(); 
} 

Quindi il codice sopra funziona correttamente. Ma un giorno ho avuto un problema. Quando premo il pulsante di invio, allo stesso tempo la mia connessione Internet non funzionava. Quindi l'email non è stata licenziata. Questo è il momento in cui mi rendo conto che questa funzione di posta elettronica ha bisogno di un meccanismo per accodare le e-mail e inviarlo agli utenti uno per uno secondo l'ordine in coda. Quindi, se una e-mail non è stata recapitata o se la rete si interrompe, riprovare. Quindi, come ottenere questo meccanismo?

risposta

3

Dissocia l'accodamento delle e-mail dall'invio. ad esempio:

  1. Creare una tabella di database per le e-mail in uscita, con una colonna per la loro data di invio.
  2. Ogni volta che si desidera inviare un'e-mail in uscita, inserirla nella tabella con una data di invio NULL.
  3. Avere un'attività in background eseguita ogni X secondi per verificare la presenza di e-mail con una data di invio NULL, provare a inviarle e aggiornare la loro data di invio se ha esito positivo. SUGGERIMENTO: per un modo semplice per accodare attività ricorrenti in ASP.NET dare un'occhiata a this.

Questo è un esempio semplice molto semplice, ma puoi facilmente espanderlo.

+0

Quindi stai dicendo che una query di selezione dovrebbe essere eseguita sul DB ogni secondo? Non è un problema di prestazioni? – Banjo

+0

@Sylar, ho detto ogni X secondi, ad es. ogni 30 secondi. E no, non sarebbe un problema di prestazioni. –

Problemi correlati