Подтвердить что ты не робот

Как включить SSL для SmtpClient в Web.config

Есть ли способ установить EnableSSL из web.config?

Я мог бы установить это свойство в коде, но это не сработает для Simple Mail Web Event и других классов, которые используют сервер Smtp по умолчанию. Любые идеи?

4b9b3361

Ответ 1

Для .NET 3 и более ранних версий: вы не можете. Вы должны управлять им вручную.

Для получения дополнительной информации вы можете увидеть 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/.

Для .NET 4: вы можете.

См. 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>

Ответ 2

У меня есть грязное обходное решение (до выхода .NET 4.0). Вместо изменения моего кода он использует используемый порт, чтобы определить, требуется ли SSL или нет.

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

Я сказал, что это грязный хак, но он отлично работает для разных конфигураций, с которыми мы сталкиваемся.

Ответ 3

это работает для меня в .net 4

например. в web.config

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

Ответ 4

Джайлс Робертс Ян 18 '12 в 18:01 сказал

это работает для меня в .net 4

например. в web.config

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

Порт 25 не является портом SSL. Порт 25 является SMTP-портом по умолчанию. Кроме того, код web.config частично заполнен. Код должен быть

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

Эти настройки выше более точные, чем исходный код web.config. Я не знаю, почему метод ведьмы лучше. Использование web.config или использование страницы с кодом для отправки электронной почты. Независимо от метода witch, который вы используете, файл кода должен быть изменен. Я говорю это, потому что вам нужно подключить текстовые поля From, Subject и Body. Я принимаю это как должное, что конечный результат означает, что вы хотите отправить сообщение через веб-страницу aspx.

Ответ 6

Я искал почти везде для этого.

Но похоже, что мы не можем настроить свойство EnableSsl в web.config.

Посмотрите this

Ответ 7

Просто расширьте класс и установите EnableSsl = true и используйте этот класс.

Ответ 8

Я думаю, что есть ошибка в MailSettingsSectionGroup. См. Ниже код:

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;

Кажется, что EnableSsl не существует как свойство в Network, потому что, когда я запускаю и отлаживаю это, я могу видеть это значение, но не могу скомпилировать код из-за отсутствия ExtensionMethod.

Ответ 9

Кажется, класс закрыт, поэтому я сделал ручное расширение. Я думал, что я предоставил его другим. Надеюсь, он может быть полезен другим.

/// <summary>
/// OldSchool extension of SmtpNetWorkElement, since it 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); } }
}

Используйте этот способ:

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