4

我目前正在为我正在从事的项目创建自己的 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,但我禁用了防火墙、防病毒和反垃圾邮件并且没有任何区别。

4

1 回答 1

0

才发现问题。我已经证明,当通过 smtp 客户端发送 DATA 时,Symantec Norton 360 似乎接受了输入。出于某种原因,即使禁用包括反垃圾邮件在内的诺顿似乎也没有什么不同。在受保护端口的反垃圾邮件设置中有一个部分,它添加了端口 25,但似乎并没有让我想要删除该端口。但是,由于我的程序允许配置 smtp 端口,如果我将其更改为不同的端口,即端口 26,那么我的程序可以正常工作。

感谢您的帮助和建议。

于 2012-07-22T19:50:56.047 回答