在web.config中设置多个SMTP设置?

时间:2010-12-06 03:51:47

标签: c# web-config smtp mailsettings

我正在构建一个应用程序,在发送电子邮件时需要动态/编程地知道并使用不同的SMTP设置。

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

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

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

8 个答案:

答案 0 :(得分:61)

我需要在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="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");

答案 1 :(得分:22)

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

答案 2 :(得分:10)

这是我使用它的方式,它对我来说很好(设置类似于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. 然后最好创建一种包装器。请注意,下面的大部分代码都来自SmtpClient here

    的.NET源代码
    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. 然后只需发送电子邮件:

    new CustomSmtpClient(“mailings”)。Send(new MailMessage())

答案 3 :(得分:3)

这可能会对某些人有所帮助,但如果您在这里寻找多个smtp配置的Mandrill设置,我最终创建了一个继承自此人员代码的SmtpClient类的类,这非常好:{{3} }

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

答案 4 :(得分:1)

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

例如,在web.config中创建不同的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);

答案 5 :(得分:0)

我最终构建了自己的自定义配置加载器,该加载器在EmailService类中使用。配置数据可以像连接字符串一样存储在web.config中,并通过名称动态提取。

答案 6 :(得分:0)

我有同样的需要,明确的答案对我有用。

我在

中进行了这些更改

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

谢谢=)

答案 7 :(得分:-1)

您似乎可以使用不同的SMTP字符串进行初始化。

SmtpClient客户端=新的SmtpClient(服务器);

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

我希望这就是你要找的东西。