web-dev-qa-db-ja.com

Web.configでSmtpClientのSSLを有効にする方法

Web.configからEnableSSLを設定する方法はありますか?

このプロパティをコードで設定することもできましたが、Simple Mail Webイベントや、デフォルトのSMTPサーバーを使用する他のクラスでは機能しません。何か案は?

26
holiveira

.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>
24
eKek0

私は汚い回避策を持っています(.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;

私はそれは汚いハックであると言いました、しかしそれは我々が遭遇する異なる構成のためにうまく働きます。

19
Miguel Madero

これは.net 4で私のために働きます

例えば。 web.config

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

ジャイルズロバーツ1月18日12月18日01時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または分離コードページを使用して電子メールを送信する。分離コードファイルを使用する魔女の方法を変更する必要はありません。これは、From、Subject、Bodyの各テキストボックスを接続する必要があるためです。あなたがaspxウェブページを通してメッセージを送りたいという最終結果が当然であると私は思っています

3
Michael Summers

ああ、.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

ライアン

1
Ryan O'Neill

私はこれをほぼどこでも探しました。

しかし、web.configでEnableSslプロパティを構成する方法はないようです。

this をご覧ください

0
Nirman Doshi

クラスを拡張してEnableSsl = trueを設定し、そのクラスを使用するだけです。

0
Kevin Korb

クラスは封印されているようですので、手動で延長しました。ここで他の人に提供したいと思いました。それが他の人に役立つことを願っています。

/// <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);
0
Jonas Mølgaard

これは私のweb.configファイルで使用するコードです。 enter image description here

0
Michael Summers

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がないためにコードをコンパイルできません。

0
Jonas Mølgaard