c# - mail - system net networkcredential web config
Establecer mĂșltiples configuraciones SMTP en web.config? (8)
Estoy construyendo una aplicación que necesita conocer de forma dinámica / programática y utilizar diferentes configuraciones de SMTP al enviar correos electrónicos.
Estoy acostumbrado a utilizar el enfoque de system.net/mailSettings, pero según tengo entendido, eso solo permite una definición de conexión SMTP a la vez, utilizada por SmtpClient ().
Sin embargo, necesito más de un enfoque parecido a connectionStrings, donde puedo obtener un conjunto de configuraciones basadas en una clave / nombre.
¿Alguna recomendación? Estoy abierto a omitir el enfoque tradicional de SmtpClient / mailSettings, y creo que tendré que ...
Así es como lo uso y funciona bien para mí (la configuración es similar a la respuesta de Mikko):
Primero configure las secciones de configuración:
<configuration> <configSections> <sectionGroup name="mailSettings"> <section name="default" type="System.Net.Configuration.SmtpSection" /> <section name="mailings" type="System.Net.Configuration.SmtpSection" /> <section name="partners" type="System.Net.Configuration.SmtpSection" /> </sectionGroup> </configSections> <mailSettings> <default deliveryMethod="Network"> <network host="smtp1.test.org" port="587" enableSsl="true" userName="test" password="test"/> </default> <mailings deliveryMethod="Network"> <network host="smtp2.test.org" port="587" enableSsl="true" userName="test" password="test"/> </mailings> <partners deliveryMethod="Network"> <network host="smtp3.test.org" port="587" enableSsl="true" userName="test" password="test"/> </partners>
Entonces sería lo mejor para crear una especie de envoltorio. Tenga en cuenta que la mayoría del código siguiente se tomó del código fuente de .NET para SmtpClient here
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); }
}
Entonces simplemente envíe un correo electrónico:
nuevo CustomSmtpClient ("mailings"). Send (nuevo MailMessage ())
Esto puede o no ayudar a alguien, pero en caso de que haya llegado aquí buscando la configuración de Mandrill para múltiples configuraciones de smtp, terminé creando una clase que hereda de la clase SmtpClient siguiendo el código de esta persona, que es realmente agradable: https://github.com/iurisilvio/mandrill-smtp.NET
/// <summary>
/// Overrides the default SMTP Client class to go ahead and default the host and port to Mandrills goodies.
/// </summary>
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;
}
}
Aquí hay un ejemplo de cómo llamar esto:
[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 );
}
}
Necesitaba tener diferentes configuraciones smtp en la web.config dependiendo del entorno: desarrollo, montaje y producción.
Esto es lo que terminé usando:
En web.config:
<configuration>
<configSections>
<sectionGroup name="mailSettings">
<section name="smtp_1" type="System.Net.Configuration.SmtpSection"/>
<section name="smtp_2" type="System.Net.Configuration.SmtpSection"/>
<section name="smtp_3" type="System.Net.Configuration.SmtpSection"/>
</sectionGroup>
</configSections>
<mailSettings>
<smtp_1 deliveryMethod="Network" from="[email protected]">
<network host="..." defaultCredentials="false"/>
</smtp_1>
<smtp_2 deliveryMethod="Network" from="[email protected]">
<network host="1..." defaultCredentials="false"/>
</smtp_2>
<smtp_3 deliveryMethod="Network" from="[email protected]">
<network host="..." defaultCredentials="false"/>
</smtp_3>
</mailSettings>
</configuration>
Luego en el código:
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1");
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_2");
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_3");
Parece que puede inicializar usando diferentes cadenas SMTP.
Cliente SmtpClient = nuevo SmtpClient (servidor);
http://msdn.microsoft.com/en-us/library/k0y6s613.aspx
Espero que sea eso lo que estás buscando.
Simplemente ingrese los detalles relevantes cuando esté listo para enviar el correo y almacene todos esos ajustes en las configuraciones de su aplicación de web.config.
Por ejemplo, cree las diferentes configuraciones de aplicaciones (como "EmailUsername1", etc.) en web.config, y podrá llamarlas por separado de la siguiente manera:
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);
Tenía la misma necesidad y la respuesta marcada funcionó para mí.
Hice estos cambios en el
web.config:
<configSections>
<sectionGroup name="mailSettings2">
<section name="noreply" type="System.Net.Configuration.SmtpSection"/>
</sectionGroup>
<section name="othersection" type="SomeType" />
</configSections>
<mailSettings2>
<noreply deliveryMethod="Network" from="[email protected]"> // noreply, in my case - use your mail in the condition bellow
<network enableSsl="false" password="<YourPass>" host="<YourHost>" port="25" userName="<YourUser>" defaultCredentials="false" />
</noreply>
</mailSettings2>
... </configSections>
Entonces, tengo un hilo que envía el correo:
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 == <Port1> || SMTPSender.Port == <Port2>;
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;
}
Gracias =)
Terminé construyendo mi propio cargador de configuración personalizado que se usa en una clase EmailService. Los datos de configuración se pueden almacenar en web.config de manera muy similar a las cadenas de conexión, y se pueden extraer por nombre de forma dinámica.
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);