我目前正在为我正在从事的项目创建自己的 SMTP 服务器。
除了当我输入数据时,这一切都非常有效,我得到了不是我的程序的其他东西的响应。
为了进行测试,我正在运行我的程序,该程序绑定到 IPAddress.Any 并在端口 25 上用于 smtp。然后我使用本地 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.
在 data visual studio 进入调试模式之前的所有步骤中,我可以逐步完成,但是在进入 DATA visual studio 时没有响应,就好像我的程序从未收到任何东西,而是转到了其他地方。
我不知道这是从哪里来的,我的 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
作为测试,我更改了代码,而是从 telnet 输入DATA
我输入的消息MYTEST
,当我使用 MYTEST 时,我的程序接收到我发送的消息并且我的程序按预期工作,只有在我使用 DATA 的程序中,这是我的程序没有收到它的 SMTP 所期望的,我得到了其他东西的响应。我已经进行了网络扫描,以查看我的网络上是否有其他任何东西作为 SMTP 服务器运行,但没有找到任何东西。
更新 3 我还刚刚发现,通过 telnet 发送数据未被程序接收到的问题仅在 Windows 上到远程 Windows。如果我从 linux 服务器远程登录到在 Windows 上运行的 smtp 服务器,它工作正常,只有当我从 Windows 远程登录时,我才遇到 DATA 命令的问题。
更新 4 做了一个测试,发现它不是特定于 Windows,而是我的台式机和笔记本电脑开发机器。我已经用 Windows 7 安装了一个空白虚拟机,如果我远程登录到它自己,即 localhost,它工作正常,如果我从我的开发 PC 远程登录到虚拟机,那么我会得到意外的响应,它不会通过我的程序。我想我的笔记本电脑和台式机上一定有一些东西以某种方式监听 smtp 流量,不知道当我的程序没有运行时我无法连接到端口 25。我唯一能想到的我是否安装了 Symantec Norton 360,但我禁用了防火墙、防病毒和反垃圾邮件并且没有任何区别。