Подтвердить что ты не робот

Настройка нескольких параметров SMTP в web.config?

Я создаю приложение, которое необходимо динамически/программно знать и использовать различные настройки SMTP при отправке электронной почты.

Я использую метод system.net/mailSettings, но, насколько я понимаю, это позволяет только одно определение соединения SMTP за раз, используемое SmtpClient().

Однако мне нужно больше похожего на connectionStrings подхода, где я могу выбрать набор параметров на основе ключа/имени.

Любые рекомендации? Я открыт, чтобы пропустить традиционный подход SmtpClient/mailSettings, и я думаю, вам придется...

4b9b3361

Ответ 1

Мне нужно было иметь разные конфигурации smtp в файле web.config в зависимости от среды: dev, постановка и производство.

Вот что я в итоге использовал:

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

Ответ 2

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

Ответ 3

Вот как я его использую, и он отлично работает для меня (настройки похожи на ответ Микко):

  • Сначала настройте разделы конфигурации:

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

Ответ 4

Это может или не может помочь кому-то, но если вы здесь искали Mandrill setup для нескольких конфигураций smtp, я закончил создание класса, который наследует класс 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 );
        }
    }

Ответ 5

Просто передайте соответствующие данные, когда вы будете готовы отправить почту, и сохраните все эти параметры в настройках вашего приложения web.config.

Например, создайте различные настройки AppSettings (например, "MailUsername1" и т.д.) в 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);

Ответ 6

В результате я создал собственный пользовательский загрузчик конфигурации, который используется в классе EmailService. Конфигурационные данные могут храниться в web.config так же, как строки соединений, и динамически вытягиваются по имени.

Ответ 7

У меня была такая же потребность, и заметный ответ сработал у меня.

Я сделал эти изменения в

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>

Затем у меня есть поток, который отправляет почту:

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

Спасибо =)

Ответ 8

Кажется, что вы можете инициализировать использование разных строк SMTP.

SmtpClient client = новый SmtpClient (сервер);

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

Надеюсь, это то, что вы ищете.