統合Windows認証を使用するドメインSMTPサーバーを介して電子メールを送信しようとしています。クレデンシャルを明示的に指定すると、すべてが正常に機能します。
using (var client = new SmtpClient("<Server>"))
{
client.Credentials = new NetworkCredential("<User name>", "<Password>");
client.EnableSsl = true;
client.Send(...);
}
SMTPサーバーのログには、EHLO、STARTTLS、STARTTLS、EHLO、次にAUTH、MAILなどが表示されます。
一方、デフォルトの資格情報が使用される場合:
using (var client = new SmtpClient("<Server>"))
{
client.UseDefaultCredentials = true;
client.EnableSsl = true;
client.Send(...);
}
「メールの
SmtpException
送信に失敗しました。」というメッセージとともにスローされます。内部
IOException
メッセージは次のとおりです。「トランスポート接続からデータを読み取れません:既存の接続がリモートホストによって強制的に閉じられました。」内側-内側
SocketException
は次のとおりです。「既存の接続がリモートホストによって強制的に閉じられました」。
SMTPサーバーのログには、EHLO、STARTTLS、STARTTLS、EHLOが表示されますが、何も表示されません。
オプションをソースコードからApp.configに移動した場合configuration/system.net/mailSettings/smtp/network
、およびポート番号が指定されているかどうかに関係なく、結果はまったく同じです(最初のサンプルで成功、2番目のサンプルで失敗)。
とすれば:
ドキュメントによると、
SmtpClient.UseDefaultCredentials
「DefaultCredentialsがリクエストとともに送信されるかどうかを制御するブール値を[g]設定または設定します」、「クライアント側アプリケーションの場合、[
CredentialCache.DefaultCredentials
]は通常、アプリケーションを実行しているユーザーのWindowsクレデンシャル(ユーザー名、パスワード、およびドメイン)です」、およびテストされたコードは、上記の最初のサンプルで資格情報が指定された同じアカウントから実行されているWindowsフォームクライアント側アプリケーションです。
最初のサンプルが機能しているのに、なぜ2番目のサンプルが失敗するのですか?
フォーラムでは、この問題はSMTPサーバーがNTLMをサポートしていないことが原因である可能性があることが示唆されました。サーバーをEHLOすることにより、NTLMがサポートされているように見えます。応答行の1つは250-AUTH GSSAPI NTLM
です。