web-dev-qa-db-fra.com

Comment activer SSL pour SmtpClient dans Web.config

Existe-t-il un moyen de définir EnableSSL à partir de web.config?

Je pourrais définir cette propriété dans le code, mais cela ne fonctionnerait pas pour l'événement Web Simple Mail et les autres classes qui utilisent le serveur Smtp par défaut. Des idées?

25
holiveira

Pour .NET 3 et versions antérieures: vous ne pouvez pas. Vous devez le gérer à la main.

Pour plus d'informations, consultez https://blogs.msdn.Microsoft.com/vikas/2008/04/29/bug-asp-net-2-0-passwordrecovery-web-control-cannot-send-emails- to-ssl-enabled-smtp-servers/ .

Pour .NET 4: Vous pouvez. 

Voir http://theoldsewingfactory.com/2011/01/06/enable-ssl-in-web-config-for-smtpclient/

<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod=”network”>
                <network Host="localhost"
                         port="25"
                         enableSsl="true"
                         defaultCredentials="true" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
23
eKek0

J'ai une solution de contournement (jusqu'à ce que .NET 4.0 soit disponible). Au lieu de modifier mon code, il s’appuie sur le port utilisé pour déterminer si le protocole SSL est requis ou non. 

var client = new SmtpClient();
client.EnableSsl = client.Port == 587 || client.Port == 465;
// This could also work
//client.EnableSsl = client.Port != 25;

J'ai dit que c'était un sale coup, mais que ça fonctionnait bien pour les différentes configurations que nous rencontrons. 

18
Miguel Madero

cela fonctionne pour moi dans .net 4

PAR EXEMPLE. dans web.config

network Host="somesmtpserver" userName="[email protected]" 
password="whatever" port="25" enableSsl="true"         
5
Bohemian

Giles Roberts 18 janv. 12 à 18:01 a déclaré

cela fonctionne pour moi dans .net 4

PAR EXEMPLE. dans web.config

network Host="somesmtpserver" userName="[email protected]" 
password="whatever" port="25" enableSsl="true" 

Le port 25 n'est pas un port SSL. Le port 25 est le port SMTP par défaut. De plus, le code web.config est partiellement rempli. Le code devrait être

    <system.net>
         <mailSettings>
              <smtp deliveryMethod="Network" from="[email protected]">
                     <network Host="smtp.gmail.com"
                     userName="[email protected]"
                     password="********"
                     port="587"
                     defaultCredentials="true"
                     enableSsl="true" />
             </smtp>
        </mailSettings>
   </system.net>

Les paramètres ci-dessus sont plus précis que le code web.config d'origine. Je ne sais pas quelle méthode est meilleure. Utiliser web.config ou utiliser la page code-behind pour envoyer l'e-mail. Quelle que soit la méthode utilisée, le fichier code-behind doit être modifié. Je dis cela parce que vous devez câbler les zones de texte De, Sujet et Corps. Je prends pour acquis que le résultat final que vous souhaitez envoyer un message via une page Web aspx

3
Michael Summers

Ah, il existe un moyen de le faire pour le 'mot de passe oublié' intégré dans les contrôles de connexion .net cependant.

Voir http://blogs.msdn.com/vikas/archive/2008/04/29/bug-asp-net-2-0-passwordrecovery-web-control-cannot-send-emails-to-ssl-enabled -smtp-servers.aspx

Ryan

1
Ryan O'Neill

J'ai cherché presque partout pour cela.

Mais il semble qu'il n'y ait aucun moyen de configurer la propriété EnableSsl dans web.config.

Regardez ça

0
Nirman Doshi

Il suffit d’étendre la classe et de définir EnableSsl = true et d’utiliser cette classe.

0
Kevin Korb

Il semble que la classe est scellée, alors j’ai fait une extension manuelle. Je pensais le fournir aux autres ici. J'espère que cela pourra être utile à d'autres.

/// <summary>
/// OldSchool extension of SmtpNetWorkElement, since it's sealed.
/// </summary>
public class SmtpNetworkElementEx
{
    private readonly SmtpNetworkElement m_SmtpNetWorkElement;

    /// <summary>
    /// Initializes a new instance of the <see cref="SmtpNetworkElementEx"/> class.
    /// </summary>
    public SmtpNetworkElementEx()
    {
        Configuration configurationFile = WebConfigurationManager.OpenWebConfiguration("~/web.config");
        var mailSettings = configurationFile.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;

        if (mailSettings == null)
            return;

        m_SmtpNetWorkElement = mailSettings.Smtp.Network;
    }

    public string Host { get { return m_SmtpNetWorkElement.Host; } }
    public bool DefaultCredentials { get { return m_SmtpNetWorkElement.DefaultCredentials; } }
    public string ClientDomain { get { return m_SmtpNetWorkElement.ClientDomain; } }
    public string TargetName { get { return m_SmtpNetWorkElement.TargetName; } }
    public int Port { get { return m_SmtpNetWorkElement.Port; } }
    public string UserName { get { return m_SmtpNetWorkElement.UserName; } }
    public string Password { get { return m_SmtpNetWorkElement.Password; } }
    public bool EnableSsl { get { return Convert.ToBoolean(m_SmtpNetWorkElement.ElementInformation.Properties["enableSsl"].Value); } }
}

Utilisez cette manière:

var smtpSettings = new SmtpNetworkElementEx();

_smtpClient.Host = smtpSettings.Host;
_smtpClient.Port = smtpSettings.Port;
_smtpClient.EnableSsl = smtpSettings.EnableSsl;
_smtpClient.Credentials = new System.Net.NetworkCredential(smtpSettings.UserName, smtpSettings.Password);
0
Jonas Mølgaard

C'est le code que j'utilise dans mon fichier web.config.  enter image description here

0
Michael Summers

Je pense qu'il y a un bug dans la MailSettingsSectionGroup. Voir le code ci-dessous:

Configuration configurationFile = WebConfigurationManager.OpenWebConfiguration("~/web.config");
var mailSettings = configurationFile.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;

_smtpClient.Host = mailSettings.Smtp.Network.Host;
_smtpClient.Port = mailSettings.Smtp.Network.Port;
_smtpClient.EnableSsl = mailSettings.Smtp.Network.**EnableSsl**;
_smtpClient.Credentials = new System.Net.NetworkCredential(mailSettings.Smtp.Network.UserName, mailSettings.Smtp.Network.Password);
_smtpClient.UseDefaultCredentials = false;

Il semble que EnableSsl n'existe pas en tant que propriété sous Réseau car, lorsque j'exécute et corrige cela, je peux voir la valeur, mais je ne peux pas compiler le code car ExtensionMethod est manquant.

0
Jonas Mølgaard