Как собрать свой собственный почтовый сервер VB. NET на Windows 10 - PullRequest
1 голос
/ 12 февраля 2020

Я хотел бы построить свой собственный (простой) почтовый сервер на машине Windows (в VB. NET) для получения писем от одного отправителя. Мой адрес электронной почты будет что-то вроде "myname@myserver.com".

Что мне нужно построить? ... SMTP-сервер с классом SMTPServer? ... как нижеприведенный код.

Как я могу проверить это локально на моей машине, не покупая домен myserver.com. Я знаю, как отправить электронное письмо через VB. NET, но что я должен использовать в качестве исходящего smtp-сервера?

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

namespace FakeSMTP
{
    public class SMTPServer
    {
        TcpClient client;
        NetworkStream stream;
        System.IO.StreamReader reader;
        System.IO.StreamWriter writer;

        public SMTPServer(TcpClient client)
        {
            this.client = client;
            this.client.ReceiveTimeout = 5000;
            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();
            while (true)
            {
                SMTPServer handler = new SMTPServer(listener.AcceptTcpClient());
                Thread thread = new System.Threading.Thread(new ThreadStart(handler.Run));
                thread.Start();
            }
        }

        public void Run()
        {
            writer.WriteLine("220 localhost -- Fake proxy server");
            for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
            {
                Console.Error.WriteLine("Read line {0}", line);
                switch (line)
                {
                    case "DATA":
                        writer.WriteLine("354 Start input, end data with <CRLF>.<CRLF>");
                        StringBuilder data = new StringBuilder();
                        String subject = "";
                        line = reader.ReadLine();
                        if (line != null && line != ".")
                        {
                            const string SUBJECT = "Subject: ";
                            if (line.StartsWith(SUBJECT))
                                subject = line.Substring(SUBJECT.Length);
                            else data.AppendLine(line);
                            for (line = reader.ReadLine();
                                line != null && line != ".";
                                line = reader.ReadLine())
                            {
                                data.AppendLine(line);
                            }
                        }
                        String message = data.ToString();
                        Console.Error.WriteLine("Received ­ email with subject: {0} and message: {1}",
                            subject, message);
                        writer.WriteLine("250 OK");
                        client.Close();
                        return;
                    default:
                        writer.WriteLine("250 OK");
                        break;
                }
            }
        }
    }
}
...