web-dev-qa-db-de.com

So aktivieren Sie SSL für SmtpClient in Web.config

Gibt es eine Möglichkeit, die EnableSSL aus der web.config festzulegen?

Ich könnte diese Eigenschaft im Code festlegen. Dies funktioniert jedoch nicht für das Simple Mail Web Event und andere Klassen, die den Standard-SMTP-Server verwenden. Irgendwelche Ideen?

25
holiveira

Für .NET 3 und früher: Das geht nicht. Sie müssen es von Hand handhaben.

Weitere Informationen finden Sie unter 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/ .

Für .NET 4: Sie können. 

Siehe 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

Ich habe eine schmutzige Problemumgehung (bis .NET 4.0 herauskommt). Anstatt meinen Code zu ändern, hängt er vom verwendeten Port ab, um zu bestimmen, ob SSL erforderlich ist oder nicht. 

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

Ich sagte, es sei ein schmutziger Hack, aber es funktionierte gut für die verschiedenen Konfigurationen, die wir treffen. 

18
Miguel Madero

das funktioniert für mich in .net 4

Z.B. in web.config

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

Giles Roberts 18. Januar 12 um 18:01 sagte

das funktioniert für mich in .net 4

Z.B. in web.config

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

Port 25 ist kein SSL-Port. Port 25 ist der Standard-SMTP-Port. Außerdem ist der web.config-Code teilweise ausgefüllt. Der Code sollte sein

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

Diese Einstellungen sind genauer als der ursprüngliche web.config-Code. Ich weiß nicht, welche Methode besser ist. Verwenden Sie web.config oder die Code-Behind-Seite, um die E-Mail zu senden. Unabhängig davon, welche Methode Sie verwenden, muss die Code-Behind-Datei geändert werden. Ich sage das, weil Sie die Textfelder From, Subject und Body verkabeln müssen. Ich gehe davon aus, dass das Endergebnis, dass Sie eine Nachricht über eine aspx-Webseite senden möchten, erreicht wird

3
Michael Summers

Ah, es gibt eine Möglichkeit, dies für die eingebauten .net Login-Steuerelemente zu tun.

Siehe 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

Ich habe fast überall danach gesucht.

Es scheint jedoch, dass wir die EnableSsl-Eigenschaft in web.config nicht konfigurieren können.

Schauen Sie sich this an

0
Nirman Doshi

Erweitern Sie einfach die Klasse, setzen Sie EnableSsl = true und verwenden Sie diese Klasse.

0
Kevin Korb

Ich scheine, die Klasse ist versiegelt, also habe ich eine manuelle Erweiterung vorgenommen. Ich dachte, ich würde es für andere hier zur Verfügung stellen. Hoffe, es kann für andere von Nutzen sein.

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

Verwenden Sie diesen Weg:

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

Dies ist der Code, den ich in meiner web.config-Datei verwende.  enter image description here

0
Michael Summers

Ich denke, es gibt einen Fehler in der MailSettingsSectionGroup. Siehe folgenden Code:

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;

Es scheint, dass EnableSsl nicht als eine Eigenschaft unter Netzwerk vorhanden ist, da ich den Wert zwar sehen und debuggen kann, aber den Code aufgrund fehlender ExtensionMethod nicht kompilieren kann.

0
Jonas Mølgaard