私は現在、自分が取り組んでいるプロジェクト用に独自の SMTP サーバーを作成しています。
データを入力するときを除いて、すべてほとんど機能しています。自分のプログラムではない何かから応答が返されます。
テストを行うために、smtp のポート 25 で IPAddress.Any にバインドするプログラムを実行しています。次に、ローカル PC から telnet を使用して、正しい応答を送信しているかどうかをテストしています。これを行っている間、デバッグをオンにし、コードをステップ実行して、プログラムが何をしているかを確認しました。
- 接続すると、
220 with my domain name
- telnet
EHLO
が250 with my domain name
- telnet から送信
MAIL FROM: someone@fromaddress.com
し、返信します250 2.1.0 OK
- telnet から送信
RCPT TO: someone@toaddress.com
し、返信します250 2.1.5 OK
ここで奇妙なことが起こり始めます。telnet からDATA
メインの電子メール メッセージの準備ができて送信し、コードで送信することになっています354 End data with <CR><LF>.<CR><LF>
が、代わりに の応答を受け取ります。354 please start mail input.
データビジュアルスタジオがデバッグモードに入る前のすべてのステップからステップスルーできましたが、データビジュアルスタジオに入ると、プログラムが何も受信されなかったかのように応答せず、代わりに別の場所に移動しました。
これがどこから来ているのかわかりません。PC で実行されている他の SMTP サーバーはありません。
以下は私が使用しているコードです
private void processSmtpReceived(TcpClient client)
{
stream = client.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
writer.NewLine = "\r\n";
writer.AutoFlush = true;
//writer.WriteLine("220 localhost -- Fake proxy server");
string line = "";
string message = "";
string subject = "";
bool readingData = false;
if (client.Connected)
{
writer.WriteLine("220 localhost -- Fake proxy server");
while ((line = reader.ReadLine()) != null && reader != null)
{
line = line.Replace("\b", "");
if (readingData)
{
message += line;
if (line.Contains("Subject:"))
{
subject = line;
}
else if (line == ".")
{
writer.WriteLine("250 2.0.0 OK");
readingData = false;
}
}
else if (line.Contains("EHLO"))
{
writer.WriteLine("250 OK localhost-workgroup");
}
else if (line.Contains("MAIL FROM"))
{
writer.WriteLine("250 2.1.0 OK");
}
else if (line.Contains("RCPT TO"))
{
writer.WriteLine("250 2.1.5 OK");
}
else if (line.Contains("DATA"))
{
writer.WriteLine("354 End data with <CR><LF>.<CR><LF>");
readingData = true;
}
else if (line == ".")
{
writer.WriteLine("250 2.0.0 OK");
}
else if (line == "QUIT")
{
writer.WriteLine("221 2.0.0 Bye");
Console.WriteLine("Message: " + message);
}
else
{
writer.WriteLine("250 OK");
}
Console.WriteLine("Received: {0}", line);
}
}
コードからわかるように、の応答はstart mail input
私のコードにないため、これがどこから来ているのかわかりません。
あなたが提供できる助けをありがとう
更新
少し奇妙なことがわかりました。SMTP サーバーと telnet を同じマシンで実行すると、つまりtelnet localhost 25
正しく動作し、354 の末尾が になり<CR><LF>.<CR><LF>
ますが、別のサーバーから telnet を実行するとtelnet 192.168.1.74 25
、354 please start mail input
. これは Windows でも Linux でも同じです。コードに応答が入力される場所がなく、プログラムを停止して試したときのように smtp サーバーが実行されていないため、この応答が生成される理由がわかりません。ポート 25 で telnet に接続すると、接続に失敗したというメッセージが表示されます。
更新 2
テストとしてコードを変更したので、入力DATA
したメッセージに対して telnet を入力する代わりにMYTEST
、MYTEST を使用すると、プログラムは送信しているメッセージを受信し、プログラムは期待どおりに動作します。これは、プログラムで DATA を使用する場合のみです。 、これは私のプログラムが受信しない SMTP に期待されるものであり、別のものから応答を受け取ります。ネットワーク スキャンを実行して、ネットワーク上のどこかで SMTP サーバーとして実行されているものが他にあるかどうかを確認しましたが、何も見つかりませんでした。
更新 3 また、telnet を介してプログラムが受信しない DATA を送信するという問題は、Windows からリモート Windows にのみ発生することがわかりました。Linux サーバーから Windows で実行されている smtp サーバーに telnet で接続すると、正常に動作します。Windows から telnet で接続している場合にのみ、DATA コマンドに問題があります。
更新 4 テストを行ったところ、Windows に固有のものではなく、デスクトップおよびラップトップの開発マシンに固有であることがわかりました。Windows 7 で空の VM をインストールしました。自分自身 (つまり、localhost) に telnet で接続すると正常に動作します。開発用 PC から仮想マシンに telnet で接続すると、予期しない応答が返され、プログラムを経由しません。ラップトップとデスクトップの両方に、何らかの方法で smtp トラフィックをリッスンする何かがあるに違いないと思います。プログラムが実行されていないときにポート 25 に接続できないため、どうすればよいかわかりません。 Symantec Norton 360 をインストールしていますが、ファイアウォール、ウイルス対策、スパム対策を無効にしましたが、違いはありませんでした。