Проверка 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;
}
}
}
}
}