自动刷新TCP流不起作用

北京人

您可能会看到,我使用C#编写了一些SMTP服务器。我包括了完整的代码(不包括一个类),但我希望您能对细节有所了解。我正在客户端的DATA帖子上苦苦挣扎,从我的角度来看,问题是无法正常工作的“ Auto Flush”。客户端将“ DATA”发送到我的服务器,告诉我准备好接收我的电子邮件的数据。我需要回答“ 354开始邮件输入”,我的问题是:发送“ 354开始邮件输入”后,在此功能中,我需要从客户端接收消息。

 using System;
 using System.Text;
 using System.Net;
 using System.Net.Sockets;
 using System.Threading;

namespace FakeSMTP
{
public class SMTPServer //: IDisposable
{
    TcpClient client;
    NetworkStream stream;
    System.IO.StreamReader reader;
    System.IO.StreamWriter writer;
    //public void Dispose()
    //{
    //    writer.Dispose();
    //    reader.Dispose();
    //    stream.Dispose();
    //}


    public SMTPServer(TcpClient client)
    {
        this.client = client;
        stream = client.GetStream();
        reader = new System.IO.StreamReader(stream);
        writer = new System.IO.StreamWriter(stream);
        writer.NewLine = "\r\n";
        writer.AutoFlush = true;
    }

    static void Main(string[] args)
    {
        TcpListener listener = new TcpListener(IPAddress.Loopback, 25);
        listener.Start();
        //using (SMTPServer handler = new SMTPServer(listener.AcceptTcpClient()))
        while (true)
        {
            SMTPServer handler = new SMTPServer(listener.AcceptTcpClient());
            Thread thread = new System.Threading.Thread(new ThreadStart(handler.Run));
            thread.Start();
        }
    }

    public void Run()
    {

        string sadress;
        string radress;
        string rserver;
        bool auth = false;
        writer.WriteLine("220 smtp.localsmtp.de ESMTP server ready");
        for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
        {
            Console.Error.WriteLine("Read line {0}", line);

            if (line.StartsWith("EHLO"))
                {
                writer.WriteLine("250-smtp.localsmtp.de");
                //Auth ankuendigen
                writer.WriteLine("250 AUTH PLAIN");
                }

            if (line.StartsWith("QUIT"))
                {
                writer.WriteLine("221 Bye Sweetie see ya");
                client.Close();
                }

            #region auth

            if (line.StartsWith("AUTH PLAIN"))
            {
                Console.WriteLine("client sendet Auth: " + line);
                string [] pw = line.Split(new string[] { "PLAIN " }, StringSplitOptions.None);
                byte[] bytes = Convert.FromBase64String(pw[1]);
                string result = Encoding.BigEndianUnicode.GetString(bytes);

                if (result == "12")
                    {
                        writer.WriteLine("235 2.7.0 Authentication successful");
                        auth = true;
                    }
                else
                    {
                        Console.WriteLine("Falsche AUTH Daten");
                        writer.WriteLine("535 – Incorrect authentication data");

                    }
            }
                #endregion

            #region sender
            if (line.StartsWith("MAIL FROM") && auth == true)
                 {
                 string[] sadressa = line.Split(new string[] { "FROM:" }, StringSplitOptions.None);
                 sadress = sadressa[1];
                 //Absender
                 sadress = sadress.Replace("<","").Replace(">","");
                 //Debug
                 Console.WriteLine("Absender: " + sadress);
                 writer.WriteLine("250 OK");
                 }

            #endregion

            #region receiver
            if (line.StartsWith("RCPT TO:") && auth == true)
                {
                    string[] radressa = line.Split(new string[] { "RCPT TO:" }, StringSplitOptions.None);
                    radress = radressa[1];
                    //Empfänger
                    radress = radress.Replace("<", "").Replace(">", "");
                    if (samplesmtp.getMX.GetMXRecord(radress) != "invalid")
                    {
                        rserver = samplesmtp.getMX.GetMXRecord(radress);
                        Console.WriteLine("MX Record: " + rserver);
                    }
                    else
                        Console.WriteLine("ALARM");


                    //Debug
                    Console.WriteLine("Empfänger: " + radress);
                    writer.WriteLine("250 OK");
                }
            #endregion

            #region data

            if (line.StartsWith("DATA") && auth == true)
            {
               writer.WriteLine("354 start mail input");

               var emailLine = reader.ReadLine();
               while (!emailLine.Equals("."))
               {
                   // add emailLine to the email body
                   string[] emailbody = new string[] {emailLine};
                   Console.WriteLine("Emailbody: " + emailbody[0]); 
               }
               reader.Close();
               writer.Close();
               stream.Dispose();
               writer.WriteLine("250 OK");
            }

            #endregion

        }
        }
    }
}

尝试在代码中手动调用.Flush()根本不会改变问题。没有效果。

克里斯·戈德史密斯

为了回答您的实际问题,您需要阅读所有内容,直到收到。单独显示一行(请参阅https://www.ietf.org/rfc/rfc2821.txt),如下所示:-

var emailLine = reader.ReadLine();
while (!emailLine.Equals("."))
{
   // add emailLine to the email body
   emailLine = reader.readLine();
}
writer.WriteLine("250 OK");
reader.Close();
writer.Close();
stream.Dispose();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在JLabel中刷新图像不起作用

来自分类Dev

自动提升不起作用

来自分类Dev

TCP Keepalive不起作用

来自分类Dev

Python Queue.Queue在线程TCP流处理程序中不起作用

来自分类Dev

IonicFramework:拉到刷新不起作用

来自分类Dev

剑道窗口刷新不起作用

来自分类Dev

PowerBI和流分析-自动刷新不起作用

来自分类Dev

自动换行不起作用

来自分类Dev

为什么刷新模型不起作用?

来自分类Dev

刷新我的ListView似乎不起作用

来自分类Dev

每5秒自动刷新一次DIV代码不起作用

来自分类Dev

每5秒自动刷新DIV内容代码不起作用

来自分类Dev

自动刷新TableView不起作用

来自分类Dev

在部分视图中自动刷新不起作用

来自分类Dev

刷新iframe后,OnStateChange不起作用

来自分类Dev

骨干刷新/书签页面不起作用

来自分类Dev

PHP刷新不起作用

来自分类Dev

CheckedListBox刷新不起作用

来自分类Dev

防止刷新后返回不起作用

来自分类Dev

简单的JS刷新Div不起作用

来自分类Dev

火花流不起作用

来自分类Dev

Microsoft Release Management 2015客户端自动刷新不起作用

来自分类Dev

刷新<form>提交不起作用

来自分类Dev

PowerBI和流分析-自动刷新不起作用

来自分类Dev

Datepicker刷新不起作用?

来自分类Dev

自动Ajax刷新后,手动刷新部分视图不起作用

来自分类Dev

自动刷新在PHP代码不起作用

来自分类Dev

自动刷新HTML画布图像不起作用

来自分类Dev

AngularJS 自动不起作用