2010-12-06 111 views
37

我正在构建一个应用程序,它需要在发送电子邮件时动态/编程式地了解并使用不同的SMTP设置。在web.config中设置多个SMTP设置?

我习惯使用system.net/mailSettings方法,但据我所知,它只允许一次使用SmtpClient()使用的一个SMTP连接定义。

但是,我需要更多的类似connectionStrings的方法,我可以根据一个键/名称来提取一组设置。

有什么建议吗?我打算跳过传统的SmtpClient/mailSettings方法,我认为必须...

回答

58

我需要在web.config中有不同的smtp配置,具体取决于环境: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="[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> 
代码

然后:

return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1"); 
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_2"); 
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_3"); 
+0

完美。很好很简单。不需要任何新代码。 – alphadogg 2011-01-07 13:31:01

+0

Miko和@alphadog您的答案似乎适用于我遇到过的类似情况,但我不知道如何使用代码Mikko在回答“return(SmtpSection)....”中指定的代码。“您能详细说明一下吗?虽然可能不合适,但我会用我自己的代码创建一个“答案”,而不是在SO上提出一个新问题。 – REMESQ 2012-02-07 13:27:08

1

只要在准备发送邮件时传递相关的详细信息,并将所有这些设置存储在web.config的应用程序设置中即可。

例如,创建不同的AppSettings(如“EmailUsername1”等)在web.config中,你将能够完全独立地称他们为:

 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); 
0

我结束了我的构建自己的定制配置加载器在EmailService类中使用。配置数据可以像连接字符串一样存储在web.config中,并且可以动态地通过名称来引用。

3

这可能会或可能不会帮助别人,但如果你有在这里寻找多个smtp配置的Mandrill设置我最终创建了一个继承自此人员代码的SmtpClient类的类,这非常好: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); 
     } 
    } 
21
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); 
0

我有同样的需求和标记答案为我工作。

我做的

网络这些变化。配置:

 <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> 

然后,我有一个发送邮件线程:

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; 
    } 

谢谢=)

9

这是我如何使用它和它适用于我(设置类似于Mikko答案):

  1. 首先设置配置部分:

    <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> 
    

  2. 然后将是最好创建某种包装的。请注意,大部分的代码下面是从.NET源代码采取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); 
        } 
    

    }

  3. 然后,只需发送电子邮件:

    新CustomSmtpClient( “邮件”)发送(MAILMESSAGE新())