如何在Web.config中为SmtpClient启用SSL

时间:2009-01-17 23:16:20

标签: asp.net .net web-config smtpclient

有没有办法从web.config设置EnableSSL?

我可以在代码中设置此属性,但这对于简单邮件Web事件和使用默认Smtp服务器的其他类不起作用。有什么想法吗?

10 个答案:

答案 0 :(得分:23)

对于.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>

答案 1 :(得分:18)

我有一个肮脏的解决方法(直到.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;

我说这是一个肮脏的黑客,但它适用于我们遇到的不同配置。

答案 2 :(得分:5)

这对我有用.net 4

E.G。在web.config中

network host="somesmtpserver" userName="do_not_reply@yourserver.com" 
password="whatever" port="25" enableSsl="true"         

答案 3 :(得分:3)

吉尔斯罗伯茨1月18日和12月18日01:01说

这对我有用.net 4

E.G。在web.config中

network host="somesmtpserver" userName="do_not_reply@yourserver.com" 
password="whatever" port="25" enableSsl="true" 

端口25不是SSL端口。端口25是默认的SMTP端口。此外,web.config代码已部分填写。代码应该是

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

上面的设置比原始web.config代码更准确。我不知道巫法更好。使用web.config或使用代码隐藏页面发送电子邮件。无论使用哪种方法,您都必须修改代码隐藏文件。我这样说是因为你必须连接From,Subject和Body文本框。我认为你想通过aspx网页发送消息的最终结果是理所当然的

答案 4 :(得分:1)

啊,有一种方法可以为.net登录控件中内置的'忘记密码'做这件事。

请参阅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

赖安

答案 5 :(得分:0)

我几乎到处都搜索过这个。

但似乎我们无法在web.config中配置EnableSsl属性。

查看this

答案 6 :(得分:0)

我认为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而无法编译代码。

答案 7 :(得分:0)

我看来课程是密封的,所以我做了一个手动扩展。我以为我会在这里为其他人提供它。希望它对别人有用。

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

使用这种方式:

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

答案 8 :(得分:0)

这是我在web.config文件中使用的代码。enter image description here

答案 9 :(得分:-1)

只需扩展类并设置EnableSsl = true并使用该类。