7

統合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です。

4

2 に答える 2

6

実際には資格情報も指定する必要があると思います。UseDefaultCredentials は、SMTPClient に Credentials プロパティに提供された Credentials を使用するように指示する単なるフラグです。

client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

他にも次のことを試してみてください。

于 2012-06-06T15:56:35.933 に答える