C# 使用SMTP服务器从我的程序之外的某个地方获得意外答复
我目前正在为一个项目创建自己的SMTP服务器 除了当我输入数据时,我从其他不是我程序的东西那里得到响应之外,所有这些都非常有效 为了进行测试,我正在运行绑定到IPAddress.Any和端口25上smtp的程序。然后我从本地PC使用telnet测试我是否发送了正确的响应。在执行此操作时,我打开了“调试”并单步执行代码,以查看我的程序在做什么C# 使用SMTP服务器从我的程序之外的某个地方获得意外答复,c#,smtp,C#,Smtp,我目前正在为一个项目创建自己的SMTP服务器 除了当我输入数据时,我从其他不是我程序的东西那里得到响应之外,所有这些都非常有效 为了进行测试,我正在运行绑定到IPAddress.Any和端口25上smtp的程序。然后我从本地PC使用telnet测试我是否发送了正确的响应。在执行此操作时,我打开了“调试”并单步执行代码,以查看我的程序在做什么 当我连接时,我会发送一个带有我的域名的220 当telnet发送EHLO时,我会返回一个250和我的域名 从telnet,我从以下地址发送邮件:someo
- 当我连接时,我会发送一个带有我的域名的
220
- 当telnet发送
时,我会返回一个EHLO
250和我的域名
- 从telnet,我从以下地址发送
然后我发回邮件:someone@fromaddress.com
250 2.1.0 OK
- 从telnet,我将RCPT发送到:someone@toaddress.com然后我发回
250 2.1.5 OK
数据
为主要电子邮件消息做好准备,并在代码中发送354结束数据。
但我得到的响应是354请开始邮件输入。
在datavisualstudio进入调试模式之前的所有步骤中,我可以单步执行,但在进入datavisualstudio时,我的程序没有响应,好像从未收到任何东西,而是转到了其他地方
我不知道这是从哪里来的,我没有其他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);
}
}
private void processSmtpReceived(TcpClient客户端)
{
stream=client.GetStream();
读卡器=新的流读卡器(流);
writer=新的流writer(流);
writer.NewLine=“\r\n”;
writer.AutoFlush=true;
//WriteLine(“220本地主机——假代理服务器”);
字符串行=”;
字符串消息=”;
字符串主语=”;
bool readingData=false;
如果(客户端已连接)
{
WriteLine(“220本地主机——假代理服务器”);
while((line=reader.ReadLine())!=null&&reader!=null)
{
行=行。替换(“\b”,”);
如果(读取数据)
{
消息+=行;
if(第行包含(“主题:”)
{
主题=行;
}
else if(行==“)
{
writer.WriteLine(“250 2.0.0正常”);
readingData=false;
}
}
else if(行包含(“EHLO”))
{
WriteLine(“250 OK本地主机工作组”);
}
else if(第行包含(“邮件发件人”))
{
writer.WriteLine(“250 2.1.0正常”);
}
else if(第行包含(“RCPT TO”))
{
writer.WriteLine(“250 2.1.5正常”);
}
else if(第行包含(“数据”))
{
WriteLine(“354结束数据,带“);
readingData=true;
}
else if(行==“)
{
writer.WriteLine(“250 2.0.0正常”);
}
else if(行==“退出”)
{
writer.WriteLine(“2212.0.0再见”);
Console.WriteLine(“消息:+消息”);
}
其他的
{
writer.WriteLine(“250 OK”);
}
WriteLine(“接收:{0}”,第行);
}
}
正如您从代码中看到的,start mail input
的响应不在我的代码中,因此不知道这是从哪里来的
谢谢你能提供的帮助
更新
我刚刚发现有点奇怪。如果我在同一台机器上运行SMTP服务器和telnet,即telnet localhost 25
,它工作正常,我用
获得354端,但是如果我从单独的服务器,即telnet 192.168.1.74 25
运行telnet,那么我得到354请启动邮件输入。无论是在Windows还是Linux上,这都是一样的,我不知道它为什么会生成此响应,因为代码中没有输入响应的位置,并且没有smtp服务器在运行,因为当我停止程序并尝试在端口25连接到telnet时,我收到连接失败消息
更新2
作为一项测试,我更改了代码,因此从telnet输入DATA
改为我输入MYTEST
的消息,当我使用MYTEST时,我的程序接收到我发送的消息,并且我的程序按预期工作,只有在程序中我使用数据时,我的程序才不会接收到它,这是SMTP的预期数据,而我从其他内容获取响应。我已进行了网络扫描,以查看是否有其他内容作为SMTP服务器在我的网络上运行,但未找到任何内容
更新3
我还刚刚发现,通过telnet将程序未接收到的数据发送到远程Windows的问题只存在于Windows上。如果我从linux服务器telnet到Windows上运行的smtp服务器,它可以正常工作,只有在从Windows进行telnet时,我的数据命令才有问题
更新4
做了一个测试,发现它