1. ホーム
  2. c#

[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed

2022-01-30 20:26:24

質問

を使用しています。 SmtpClient ライブラリを使用して、以下のようにメールを送信しています。

SmtpClient client = new SmtpClient();
client.Host = "hostname";
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential("User", "Pass);
client.Send("from@hostname", "to@hostname", "Subject", "Body");

このコードはテスト環境では問題なく動作しますが、本番用のSMTPサーバーを使用する場合は SmtpException "Failure sending mail." と表示され、内側に IOException "Unable to read data from the transport connection: net_io_connectionclosed" トランスポートコネクションからデータを読み込むことができません。

ファイアウォールが問題でないことを確認しました。クライアントとサーバーの間では、ポートは問題なく開いています。他にこのようなエラーが発生する原因がわかりません。

解決方法は?

EDIT: スーパーリデュース版

465の代わりに587番ポートを試してみてください。ポート465は技術的に非推奨です。


パケットを何度もスニッフィングしているうちに、それがわかってきた。まず、これが簡単な答えです。

.NET の {{コード のみ はSTARTTLSによる暗号化に対応しています。もし SmtpClient

EnableSsl

その昔、サービスが暗号化も提供しようとすると、別のポート番号が割り当てられ、そのポート番号ですぐにSSL接続が開始されました。時間が経つにつれて、1つのサービスのために2つのポート番号を無駄にするのは馬鹿げていると考え、STARTTLSを使って同じポートで平文と暗号化を可能にする方法を考案したのです。通信は平文で始まり、その後STARTTLSコマンドを使って暗号化された接続にアップグレードします。STARTTLSはSMTP暗号化の標準となった。残念ながら、新しい標準が実装されたときにいつも起こることですが、世の中のすべてのクライアントとサーバーとの互換性にごたごたがあります。

私の場合、ユーザーがソフトをサーバーに接続しようとして、即座にSSL接続を強制していました。これは、マイクロソフトが.NETでサポートしていないレガシーな方法です。