web-dev-qa-db-fra.com

Définition de plusieurs paramètres SMTP dans web.config?

Je construis une application qui doit connaître et utiliser différents paramètres SMTP de manière dynamique/programmatique lors de l'envoi d'e-mails. 

Je suis habitué à utiliser l'approche system.net/mailSettings, mais si je comprends bien, cela ne permet qu'une définition de connexion SMTP à la fois, utilisée par SmtpClient (). 

Cependant, j'ai besoin de davantage d'une approche de type connectionStrings, où je peux tirer un ensemble de paramètres basés sur une clé/un nom.

Des recommandations? Je suis prêt à sauter l'approche traditionnelle SmtpClient/mailSettings, et je pense qu'il va falloir ...

37
alphadogg

J'avais besoin de différentes configurations smtp dans web.config en fonction de l'environnement: dev, staging et production.

Voici ce que j'ai fini par utiliser:

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

Puis en code:

return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1");
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_2");
return (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_3");
60
Mikko Rasinkangas
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);
22
Behruz Tolibov

Voici comment je l'utilise et tout fonctionne bien pour moi (les paramètres sont similaires à ceux de Mikko answer):

  1. Commencez par configurer les sections de 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>
    

  2. Ensuite, il serait préférable de créer une sorte de wrapper. Notez que la plupart du code ci-dessous provient du code source .NET pour 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. Ensuite, envoyez simplement un email:

    new CustomSmtpClient ("mailings"). Envoyer (new MailMessage ())

9
ITmeze

Cela peut aider ou ne pas aider quelqu'un, mais au cas où vous chercheriez une configuration Mandrill pour plusieurs configurations smtp, j'ai fini par créer une classe qui hérite de la classe SmtpClient après le code de cette personne ici, ce qui est vraiment agréable: 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;
    }
}

Voici un exemple de comment appeler ceci:

        [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 );
        }
    }
3
Nathan Prather

Il vous suffit de transmettre les détails pertinents lorsque vous êtes prêt à envoyer le courrier et de stocker tous ces paramètres dans les paramètres de votre application de web.config. 

Par exemple, créez les différents AppSettings (tels que "EmailUsername1", etc.) dans web.config et vous pourrez les appeler complètement séparément de la manière suivante:

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

J'ai eu le même besoin et la réponse marquée a fonctionné pour moi.

J'ai fait ces changements dans le

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>

Ensuite, j'ai un fil qui envoie le mail:

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

Merci =)

0
Rui Mendes

J'ai fini par créer mon propre chargeur de configuration personnalisé qui est utilisé dans une classe EmailService. Les données de configuration peuvent être stockées dans web.config de la même manière que les chaînes de connexion et extraites par nom de manière dynamique.

0
alphadogg