C# 使用SMTP服务器从我的程序之外的某个地方获得意外答复

C# 使用SMTP服务器从我的程序之外的某个地方获得意外答复,c#,smtp,C#,Smtp,我目前正在为一个项目创建自己的SMTP服务器 除了当我输入数据时,我从其他不是我程序的东西那里得到响应之外,所有这些都非常有效 为了进行测试,我正在运行绑定到IPAddress.Any和端口25上smtp的程序。然后我从本地PC使用telnet测试我是否发送了正确的响应。在执行此操作时,我打开了“调试”并单步执行代码,以查看我的程序在做什么 当我连接时,我会发送一个带有我的域名的220 当telnet发送EHLO时,我会返回一个250和我的域名 从telnet,我从以下地址发送邮件:someo

我目前正在为一个项目创建自己的SMTP服务器

除了当我输入数据时,我从其他不是我程序的东西那里得到响应之外,所有这些都非常有效

为了进行测试,我正在运行绑定到IPAddress.Any和端口25上smtp的程序。然后我从本地PC使用telnet测试我是否发送了正确的响应。在执行此操作时,我打开了“调试”并单步执行代码,以查看我的程序在做什么

  • 当我连接时,我会发送一个带有我的域名的
    220
  • 当telnet发送
    EHLO
    时,我会返回一个
    250和我的域名
  • 从telnet,我从以下地址发送
    邮件:someone@fromaddress.com
    然后我发回
    250 2.1.0 OK
  • 从telnet,我将RCPT发送到:someone@toaddress.com然后我发回
    250 2.1.5 OK
这就是奇怪的事情开始发生的地方, 我从telnet发送
数据
为主要电子邮件消息做好准备,并在代码中发送
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 做了一个测试,发现它