在web.config中设置多个SMTP设置?
我正在构build一个应用程序,它需要在发送电子邮件时dynamic/编程地了解并使用不同的SMTP设置。
我习惯于使用system.net / mailSettings的方法,但据我所知,它只允许一个SMTP连接定义一次,由SmtpClient()使用。
但是,我需要更多的类似连接的方法,我可以根据一个键/名称来提取一组设置。
任何build议? 我打开跳过传统的SmtpClient / mailSettings方法,我认为必须…
我需要在web.config中有不同的smtpconfiguration,具体取决于环境:dev,staging和production。
这是我最终使用的:
在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>
然后在代码中:
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);
这是我如何使用它,它适用于我(设置类似于Mikko答案):
-
首先设置configuration部分:
<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>
-
那么这将是最好的创造一种包装。 请注意,下面的大部分代码都是从.NET的SmtpClient源代码中获取的
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); }
}
-
然后只需发送电子邮件
新的CustomSmtpClient(“邮件”)。发送(新的MailMessage())
这可能会也可能不会帮助某人,但如果你到这里寻找多个smtpconfiguration的Mandrill设置,我最终创build了一个从SmtpClient类inheritance的类,在这个人的代码之后,这是非常好的: 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; } }
这是一个如何调用这个例子:
[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 ); } }
只要在准备好发送邮件时传递相关的详细信息,并将所有这些设置存储在web.config的应用程序中即可。
例如,在web.config中创build不同的AppSettings(如“EmailUsername1”等),您将能够完全分开地调用它们,如下所示:
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);
我结束了构build我自己的自定义configuration加载器在一个EmailService类中使用。 configuration数据可以像连接string一样存储在web.config中,并且可以dynamic地通过名称来引用。
我有同样的需要和明显的答案为我工作。
我在这里做了这些改变
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="noreply@host.com"> // 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>
然后,我有一个线程发送邮件:
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; }
谢谢=)
看起来你可以初始化使用不同的SMTPstring。
SmtpClient客户端=新的SmtpClient(服务器);
http://msdn.microsoft.com/en-us/library/k0y6s613.aspx
我希望那是你正在寻找的。