Impostazione di più impostazioni SMTP in web.config?

Sto creando un’app che deve conoscere e utilizzare dynamicmente / programmaticamente diverse impostazioni SMTP durante l’invio di e-mail.

Sono abituato ad usare l’approccio system.net/mailSettings, ma, a quanto ho capito, questo consente solo una definizione di connessione SMTP alla volta, utilizzata da SmtpClient ().

Tuttavia, ho bisogno di più di un approccio simile a connectionStrings, in cui posso tirare una serie di impostazioni basate su un nome / chiave.

Qualche consiglio? Sono aperto a saltare l’approccio tradizionale SmtpClient / mailSettings, e penso che dovrà …

Avevo bisogno di avere diverse configurazioni smtp nel web.config a seconda dell’ambiente: dev, staging e produzione.

Ecco cosa ho finito per usare:

In web.config:

   

Quindi nel codice:

 return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1"); return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_2"); return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_3"); 
 SmtpSection smtpSection = (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1"); SmtpClient smtpClient = new SmtpClient(smtpSection.Network.Host, smtpSection.Network.Port); smtpClient.Credentials = new NetworkCredential(smtpSection.Network.UserName, smtpSection.Network.Password); 

Questo è come lo uso e funziona bene per me (le impostazioni sono simili alla risposta Mikko):

  1. Prima configura le sezioni di configurazione:

        

  2. Quindi sarebbe meglio creare una sorta di wrapper. Si noti che la maggior parte del codice riportato di seguito è stato preso dal codice sorgente .NET per SmtpClient qui

     public class CustomSmtpClient { private readonly SmtpClient _smtpClient; public CustomSmtpClient(string sectionName = "default") { SmtpSection section = (SmtpSection)ConfigurationManager.GetSection("mailSettings/" + sectionName); _smtpClient = new SmtpClient(); if (section != null) { if (section.Network != null) { _smtpClient.Host = section.Network.Host; _smtpClient.Port = section.Network.Port; _smtpClient.UseDefaultCredentials = section.Network.DefaultCredentials; _smtpClient.Credentials = new NetworkCredential(section.Network.UserName, section.Network.Password, section.Network.ClientDomain); _smtpClient.EnableSsl = section.Network.EnableSsl; if (section.Network.TargetName != null) _smtpClient.TargetName = section.Network.TargetName; } _smtpClient.DeliveryMethod = section.DeliveryMethod; if (section.SpecifiedPickupDirectory != null && section.SpecifiedPickupDirectory.PickupDirectoryLocation != null) _smtpClient.PickupDirectoryLocation = section.SpecifiedPickupDirectory.PickupDirectoryLocation; } } public void Send(MailMessage message) { _smtpClient.Send(message); } 

    }

  3. Quindi invia semplicemente e-mail:

    nuovo CustomSmtpClient (“mailing”). Send (new MailMessage ())

Questo può o non può aiutare qualcuno, ma nel caso tu fossi qui in cerca di installazione Mandrill per più configurazioni smtp ho finito per creare una class che eredita dalla class SmtpClient seguendo questo codice di persone qui che è veramente bello: https://github.com /iurisilvio/mandrill-smtp.NET

  ///  /// Overrides the default SMTP Client class to go ahead and default the host and port to Mandrills goodies. ///  public class MandrillSmtpClient : SmtpClient { public MandrillSmtpClient( string smtpUsername, string apiKey, string host = "smtp.mandrillapp.com", int port = 587 ) : base( host, port ) { this.Credentials = new NetworkCredential( smtpUsername, apiKey ); this.EnableSsl = true; } } 

Ecco un esempio di come chiamare questo:

  [Test] public void SendMandrillTaggedEmail() { string SMTPUsername = _config( "MandrillSMTP_Username" ); string APIKey = _config( "MandrillSMTP_Password" ); using( var client = new MandrillSmtpClient( SMTPUsername, APIKey ) ) { MandrillMailMessage message = new MandrillMailMessage() { From = new MailAddress( _config( "FromEMail" ) ) }; string to = _config( "ValidToEmail" ); message.To.Add( to ); message.MandrillHeader.PreserveRecipients = false; message.MandrillHeader.Tracks.Add( ETrack.opens ); message.MandrillHeader.Tracks.Add( ETrack.clicks_all ); message.MandrillHeader.Tags.Add( "NewsLetterSignup" ); message.MandrillHeader.Tags.Add( "InTrial" ); message.MandrillHeader.Tags.Add( "FreeContest" ); message.Subject = "Test message 3"; message.Body = "love, love, love"; client.Send( message ); } } 

Basta passare i dettagli pertinenti quando sei pronto per inviare la posta e memorizzare tutte queste impostazioni nei settaggi delle app di web.config.

Ad esempio, crea i diversi AppSettings (come “EmailUsername1”, ecc.) In web.config e potrai chiamarli completamente separatamente come segue:

  System.Net.Mail.MailMessage mail = null; System.Net.Mail.SmtpClient smtp = null; mail = new System.Net.Mail.MailMessage(); //set the addresses mail.From = new System.Net.Mail.MailAddress(System.Configuration.ConfigurationManager.AppSettings["Email1"]); mail.To.Add("[email protected]"); mail.Subject = "The secret to the universe"; mail.Body = "42"; //send the message smtp = new System.Net.Mail.SmtpClient(System.Configuration.ConfigurationManager.AppSettings["YourSMTPServer"]); //to authenticate, set the username and password properites on the SmtpClient smtp.Credentials = new System.Net.NetworkCredential(System.Configuration.ConfigurationManager.AppSettings["EmailUsername1"], System.Configuration.ConfigurationManager.AppSettings["EmailPassword1"]); smtp.UseDefaultCredentials = false; smtp.Port = System.Configuration.ConfigurationManager.AppSettings["EmailSMTPPort"]; smtp.EnableSsl = false; smtp.Send(mail); 

Ho finito per creare il mio caricatore di configurazione personalizzato che viene utilizzato in una class EmailService. I dati di configurazione possono essere memorizzati in web.config come stringhe di connessione e richiamati dynamicmente.

Ho avuto lo stesso bisogno e la risposta marcata ha funzionato per me.

Ho fatto questi cambiamenti nel

web.config:

    
// noreply, in my case - use your mail in the condition bellow ...

Quindi, ho una discussione che invia la posta:

SomePage.cs

 private bool SendMail(String From, String To, String Subject, String Html) { try { System.Net.Mail.SmtpClient SMTPSender = null; if (From.Split('@')[0] == "noreply") { System.Net.Configuration.SmtpSection smtpSection = (SmtpSection)ConfigurationManager.GetSection("mailSettings2/noreply"); SMTPSender = new System.Net.Mail.SmtpClient(smtpSection.Network.Host, smtpSection.Network.Port); SMTPSender.Credentials = new System.Net.NetworkCredential(smtpSection.Network.UserName, smtpSection.Network.Password); System.Net.Mail.MailMessage Message = new System.Net.Mail.MailMessage(); Message.From = new System.Net.Mail.MailAddress(From); Message.To.Add(To); Message.Subject = Subject; Message.Bcc.Add(Recipient); Message.IsBodyHtml = true; Message.Body = Html; Message.BodyEncoding = Encoding.GetEncoding("ISO-8859-1"); Message.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1"); SMTPSender.Send(Message); } else { SMTPSender = new System.Net.Mail.SmtpClient(); System.Net.Mail.MailMessage Message = new System.Net.Mail.MailMessage(); Message.From = new System.Net.Mail.MailAddress(From); SMTPSender.EnableSsl = SMTPSender.Port ==  || SMTPSender.Port == ; Message.To.Add(To); Message.Subject = Subject; Message.Bcc.Add(Recipient); Message.IsBodyHtml = true; Message.Body = Html; Message.BodyEncoding = Encoding.GetEncoding("ISO-8859-1"); Message.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1"); SMTPSender.Send(Message); } } catch (Exception Ex) { Logger.Error(Ex.Message, Ex.GetBaseException()); return false; } return true; } 

Grazie =)

Sembra che tu possa inizializzare usando diverse stringhe SMTP.

SmtpClient client = new SmtpClient (server);

http://msdn.microsoft.com/en-us/library/k0y6s613.aspx

Spero che sia quello che stai cercando.