65.9K
CodeProject 正在变化。 阅读更多。
Home

在 C# 中创建一个简单的 SMTP 服务器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (8投票s)

2011 年 11 月 21 日

CPOL
viewsIcon

193673

一个用于测试目的的简单基础 SMTP 服务器

我为了测试目的创建了一个简单的 SMTP 服务器。这是客户端调用
 System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("localhost");
 smtp.Send(message);//Handles all messages in the protocol
 smtp.Dispose();//sends a Quit message
这是基本的服务器代码
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 25);
TcpListener listener = new TcpListener(endPoint);
listener.Start();

while (true)
{
    TcpClient client = listener.AcceptTcpClient();
    SMTPServer handler = new SMTPServer();
    servers.Add(handler);
    handler.Init(client);
    Thread thread = new System.Threading.Thread(new ThreadStart(handler.Run));
    thread.Start();
}
在这个例子中,协议包含以下消息
C : EHLO
S: 250 Ok

C : MAIL FROM
S: 250 OK

C : RCPT TO
S: 250 OK

C :DATA
S: 354 Start mail input; end with .

DATA....

S: 250 OK
C : Quit
基本上,Run 方法包含这些内容
public void Run()
{
    Write("220 localhost -- Fake proxy server");
    string strMessage = String.Empty;
    while (true)
    {
        try
        {
            strMessage = Read();
        }
        catch(Exception e)
        {
            //a socket error has occured
            break;
        }

        if (strMessage.Length > 0)
        {
            if (strMessage.StartsWith("QUIT"))
            {
                client.Close();
                break;//exit while
            }
            //message has successfully been received
            if (strMessage.StartsWith("EHLO"))
            {
                Write("250 OK");
            }

            if (strMessage.StartsWith("RCPT TO"))
            {
                Write("250 OK");
            }

            if (strMessage.StartsWith("MAIL FROM"))
            {

               Write("250 OK");
            }

            if (strMessage.StartsWith("DATA"))
            {
                Write("354 Start mail input; end with"); 
                strMessage = Read();
                Write("250 OK");
            }
        }  
    }
}

private void Write(String strMessage)
{
    NetworkStream clientStream = client.GetStream();
    ASCIIEncoding encoder = new ASCIIEncoding();
    byte[] buffer = encoder.GetBytes(strMessage + "\r\n");
    
    clientStream.Write(buffer, 0, buffer.Length);
    clientStream.Flush();
}

private String Read()
{
    byte[] messageBytes = new byte[8192];
    int bytesRead = 0;
    NetworkStream clientStream = client.GetStream();
    ASCIIEncoding encoder = new ASCIIEncoding();
    bytesRead = clientStream.Read(messageBytes, 0, 8192);
    string strMessage = encoder.GetString(messageBytes, 0, bytesRead);
    return strMessage;
}

祝您编码愉快!
© . All rights reserved.