Come abilitare SSL per SmtpClient in Web.config
-
19-08-2019 - |
Domanda
Esiste un modo per impostare EnableSSL da web.config?
Potrei impostare questa proprietà nel codice, ma non funzionerebbe per l'evento Web Simple Mail e altre classi che utilizzano il server Smtp predefinito. Qualche idea?
Soluzione
Per .NET 3 e precedenti: non puoi. Devi gestirlo a mano.
Per maggiori informazioni puoi vedere https://blogs.msdn.microsoft.com/vikas/2008/04/29/bug-asp-net-2 -0-PasswordRecovery-web-control-can / .
non-email-to-ssl-enabled SMTP-server send-Per .NET 4: è possibile.
Vedi http: // theoldsewingfactory. com / 2011/01/06 / enable-ssl-in-web-config-per-smtpclient /
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod=”network”>
<network host="localhost"
port="25"
enableSsl="true"
defaultCredentials="true" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Altri suggerimenti
Ho una soluzione sporca (fino alla pubblicazione di .NET 4.0). Invece di modificare il mio codice, si basa sulla porta utilizzata per determinare se SSL è necessario o meno.
var client = new SmtpClient();
client.EnableSsl = client.Port == 587 || client.Port == 465;
// This could also work
//client.EnableSsl = client.Port != 25;
Ho detto che era un trucco sporco, ma funzionava bene per le diverse configurazioni che incontriamo.
questo funziona per me in .net 4
es. in web.config
network host="somesmtpserver" userName="do_not_reply@yourserver.com"
password="whatever" port="25" enableSsl="true"
Dice Giles Roberts il 18 gennaio 12 alle 18:01
questo funziona per me in .net 4
es. in web.config
network host="somesmtpserver" userName="do_not_reply@yourserver.com"
password="whatever" port="25" enableSsl="true"
La porta 25 non è una porta SSL. La porta 25 è la porta SMTP predefinita. Inoltre, il codice web.config è parzialmente compilato. Il codice dovrebbe essere
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="user@gmail.com">
<network host="smtp.gmail.com"
userName="user@gmail.com"
password="********"
port="587"
defaultCredentials="true"
enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
Queste impostazioni sopra sono più precise del codice web.config originale. Non so che il metodo delle streghe sia migliore. Usando web.config o usando la pagina code-behind per inviare l'e-mail. Indipendentemente dal metodo che usi per usare il file code-behind, deve essere modificato. Lo dico perché devi collegare le caselle di testo Da, Oggetto e Corpo. Sto dando per scontato che il risultato finale che si desidera inviare un messaggio attraverso una pagina web aspx
Ah, c'è un modo per farlo per i controlli di accesso .net integrati nella 'password dimenticata'.
Ryan
Sembra che la classe sia sigillata, quindi ho fatto un'estensione manuale. Ho pensato di fornirlo per gli altri qui. Spero che possa essere utile agli altri.
/// <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); } }
}
Usa in questo modo:
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);
Ho cercato quasi ovunque per questo.
Ma sembra che non sia possibile configurare la proprietà EnableSsl in web.config.
Dai un'occhiata a this
Penso che ci sia un bug nel MailSettingsSectionGroup
. Vedi sotto il codice:
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;
Sembra che EnableSsl
non esiste come proprietà in Rete perché quando eseguo ed eseguo il debug di questo, posso vedere il valore, ma non riesco a compilare il codice a causa di ExtensionMethod mancante.
Basta estendere la classe e impostare EnableSsl = true e utilizzare quella classe.