2009-01-17 22 views
23

¿Hay alguna manera de configurar EnableSSL desde web.config?Cómo habilitar SSL para SmtpClient en Web.config

Podría establecer esta propiedad en código, pero eso no funcionaría para el evento web de correo simple y otras clases que usan el servidor Smtp predeterminado. ¿Algunas ideas?

Respuesta

21

Para .NET 3 y anteriores: No se puede. Tienes que manejarlo a mano.

Para obtener más información, puede ver 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/.

Para .NET 4: Puedes.

Ver 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> 
+6

A partir de .NET 4.0, ahora puede establecer enableSsl en el webconfig: http://theoldsewingfactory.com/2011/ 01/06/enable-ssl-in-web-config-for-smtpclient/ – ilivewithian

+0

@ilivewithian no, no puedes. Al menos no puedo. –

+0

@ eKek0, como respuesta aceptada, ¿podría actualizar el texto para decir que puede en .NET 4, por favor? Ver el comentario de ilivewithian para la referencia. –

0

He buscado en casi todas partes para esto.

Pero parece que no hay forma de que podamos configurar EnableSsl Property en web.config.

un vistazo a this

18

tengo una solución sucia (hasta .NET 4.0 sale). En lugar de cambiar mi código, depende del puerto utilizado para determinar si se requiere SSL o no.

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

Dije que era un hack sucio, pero funcionaba bien para las diferentes configuraciones que encontramos.

+0

Buena solución. – UpTheCreek

0

Simplemente extienda la clase y configure EnableSsl = true y use esa clase.

5

esto funciona para mí en .NET 4

POR EJEMPLO en web.config

network host="somesmtpserver" userName="[email protected]" 
password="whatever" port="25" enableSsl="true"   
+0

enableSsl = "true" no es realmente compatible –

+2

Esto funciona para mí en .net 4. –

0

Creo que hay un error en el MailSettingsSectionGroup. Ver más abajo código:

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; 

Parece que EnableSsl no existe como una propiedad bajo Red porque cuando corro y depurar esto, puedo ver el valor, pero no se puede compilar el código debido a la falta ExtensionMethod.

0

Parece que la clase está sellada, así que hice una extensión manual. Pensé que podría proporcionarlo para otros aquí. Espero que pueda ser de utilidad para otros.

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

Uso de esta manera:

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

Giles Roberts 18 Ene '12 a las 18:01 dijo

esto funciona para mí en.neto 4

E.G. en web.config

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

El puerto 25 no es un puerto SSL. El puerto 25 es el puerto SMTP predeterminado. Además, el código web.config está parcialmente rellenado. El código debe ser

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

Esta configuración anterior es más precisa que el código web.config original. No sé que el método de bruja es mejor. Usando web.config o usando la página de código subyacente para enviar el correo electrónico. No importa el método de bruja que use, el archivo de código subyacente debe ser modificado. Digo esto porque tiene que conectar cuadros de texto Desde, Asunto y Cuerpo. Estoy dando por hecho que los resultados finales que desea enviar un mensaje a través de una página web de aspx

Cuestiones relacionadas