Проверка 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; } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д