Setting Multiple SMTP Settings in web.config? #
I am building an app that needs to dynamically/programatically know of and use different SMTP settings when sending email.
I’m used to using the system.net/mailSettings approach, but as I understand it, that only allows one SMTP connection definition at a time, used by SmtpClient().
However, I need more of a connectionStrings-like approach, where I can pull a set of settings based on a key/name.
Any recommendations? I’m open to skipping the tradintional SmtpClient/mailSettings approach.
Here is Some Solutions :
Solution 1: #
I needed to have different smtp configurations in the web.config depending on the environment: dev, staging and production.
Here’s what I ended up using:
In 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=”mail1@temp.uri”>
<network host=”…” defaultCredentials=”false”/>
</smtp_1>
<smtp_2 deliveryMethod=”Network” from=”mail2@temp.uri”>
<network host=”1…” defaultCredentials=”false”/>
</smtp_2>
<smtp_3 deliveryMethod=”Network” from=”mail3@temp.uri”>
<network host=”…” defaultCredentials=”false”/>
</smtp_3>
</mailSettings>
</configuration>
Then in code:
return (SmtpSection)ConfigurationManager.GetSection(“mailSettings/smtp_1”);
return (SmtpSection)ConfigurationManager.GetSection(“mailSettings/smtp_2”);
return (SmtpSection)ConfigurationManager.GetSection(“mailSettings/smtp_3”);
Solution 2: #
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(“someone@example.com”);
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);
Solution 3: #
First set up config sections:
<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>
Then it would be the best to create a some sort of wrapper. Note that most of code below was taken from .NET source code for 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);
}
}