Mailbridge 非 SSL 到 SSL 服务器

Mailbridge nonSSL to SSL Server

我尝试为不支持 SSL 的旧应用程序编写 "Mailbridge"(我知道缓冲区对于完整邮件来说太小)。 (应用程序连接到 "localhost"/我的服务器,我的服务器连接到真正的 SSL 邮件服务器)我的问题:

{
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();


        TcpClient sslmail = new TcpClient();
        SslStream sslStream;

            sslmail.Connect(server, sslport);
            sslStream = new SslStream(sslmail.GetStream());

            sslStream.AuthenticateAsClient(server);
            byte[] buffer = new byte[4096];




            int bytes=0;

            while((sslmail.Connected) && (tcpClient.Connected))
            { 

        try
        {

            Array.Clear(buffer, 0, buffer.Length);


              bytes=sslStream.Read(buffer, 0, buffer.Length);

            MessageBox.Show("To Client: "+Encoding.ASCII.GetString(buffer, 0, bytes));

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();




             Array.Clear(buffer, 0, buffer.Length);



               bytes=clientStream.Read(buffer, 0, buffer.Length);
               MessageBox.Show("To Server: "+Encoding.ASCII.GetString(buffer, 0, bytes));

            sslStream.Write(buffer, 0, buffer.Length);
            sslStream.Flush();
}
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }


                /////////////////////////////////////
            }

            sslmail.Close();
        tcpClient.Close();
    }

连接有效:

To Client: +OK POP server ready H migmx018 0LaT8c-1ZFbyb06RD-00m4N0
To Server: USER xxxxxx
To Client: +OK password required for user "xxxxxx"

就这些了,现在 "hangs" 在

bytes=clientStream.Read(buffer, 0, buffer.Length);

使用 Windows Live Mail 进行测试,然后我使用自己的简单邮件应用程序,但是如果我发送 "PASS mypass" 服务器 returns “-ERR 未知命令”(使用的服务器:pop.gmx.net) (直接连接 Windows Livemail 到服务器工作没有问题)

好的,我解决了问题,下面的代码可以工作,但是对于大邮件来说有点慢,因为超时

{
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();



            TcpClient sslmail = new TcpClient();
            SslStream sslStream;

                sslmail.Connect(server, sslport);
                sslStream = new SslStream(sslmail.GetStream());

                sslStream.AuthenticateAsClient(server);
            int buffersize=1024;    
            byte[] buffer = new byte[buffersize];




                int bytes=0;

                while((sslmail.Connected) && (tcpClient.Connected))
                { 

            try
            {

                Array.Clear(buffer, 0, buffer.Length);


                try
                {
                    sslStream.ReadTimeout = 100;
                    bytes = sslStream.Read(buffer, 0, buffer.Length);


                    clientStream.Write(buffer, 0, bytes);
                    clientStream.Flush();


                }
                catch (Exception err)
                {
                    //timeout, server is waiting for client     
                }


                Array.Clear(buffer, 0, buffer.Length);



                 try
                 {
                     clientStream.ReadTimeout = 100;
                     bytes = clientStream.Read(buffer, 0, buffer.Length);



                     sslStream.Write(buffer, 0, bytes);
                     sslStream.Flush();
                 }
                 catch (Exception err)
                 {
                 //timeout, client is waiting for Server
                 }
}
            catch (Exception err)
            {
                sslmail.Close();
                tcpClient.Close();
                MessageBox.Show(err.Message);
            }


                    /////////////////////////////////////
                }

                sslmail.Close();
            tcpClient.Close();
        }
    }