Проверка SMTP - C#

Узнай цену своей работы

Формулировка задачи:

Хочу написать приложение модулирующее работу SMTP сервера т.е. в поле типа memo должен отображается весь протокол общения клиента (стандартного почтового клиента) с сервером, например: MAIL From <removed@mail.ru> 250 Sender ok RCPT To:<removed@mail.ru> 250 <removed@mail.ru> Recepient ok DATA Пока результат такой:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace SMTPserver
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        #region Предустановки
        // Надстройка для прослушивающего сокета
        // (ожидание подключения клиетн)
        TcpListener server;
 
        // Количество принимаемых подключений к серверу
        const int MAXCLIENTS = 1;
 
        // Надстройка для сокетов обмена сообщений с 
        // почтовыми приложениями.
        TcpClient[] clients = new TcpClient[MAXCLIENTS];
 
        // Номер порта по умолчанию
        int port = 25;
 
        #endregion
 
        #region Управление
 
        private void button1_Click(object sender, EventArgs e)
        {
            StartServer();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StopServer();
        }
 
        private void ServerForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            StopServer();
        }
 
        #endregion
 
        #region Функциональная часть сетевой работы

        // Запуск сервера
        void StartServer()
        {
            // Предотвратим повторный запуск сервера
            if (server == null)
            {
                    server = new TcpListener(IPAddress.Any, port);
                    server.Start();
            }
        }
 
        // Принудительная остановка сервера и запущенных потоков.
        void StopServer()
        {
            if (server != null)
            {
                server.Stop();
                server = null;
            }
        }
 
        #endregion
    }
}

Решение задачи: «Проверка SMTP»

textual
Листинг программы
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;
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы