- •2. Протокол udp
- •3. Протокол http. Общие сведения.
- •4.Протокол http. Методы запросов. Спецификация mime
- •1Xx Informational («Информационный»)
- •Операции фильтрации
- •6.Работа с документами xml
- •7.Почтовый протокол smtp.
- •8.Почтовый протокол pop3.
- •9.Понятие криптографии. Классификация алгоритмов шифрования.
- •10. Хэширование. Основные алгоритмы хэширования.
- •11. Симметричное шифрование. Основные алгоритмы симметричного шифрования
- •12.Асимметричное шифрование. Основные алгоритмы асимметричного шифрования. Описание алгоритма rsa
- •13. Электронная цифровая подпись.
- •14. Инфраструктура открытых ключей
- •15.Сертификаты X.509. Структура сертификата. Процедура проверки подлинности.
7.Почтовый протокол smtp.
Является протоколом прикладного уровня
Достаточно прост в реализации, основан на обмене текстовыми сообщениями между клиентом и сервером
Основан на протоколе TCP
Стандартный порт – 25
Исходная версия протокола описана RFC 821. Обновленная версия протокола закреплена в RFC 2821.
Окончательная версия протокола была принята 1 августа 1982 года. С тех пор протокол перестал удовлетворять всем потребностям. Вместо замены протокола SMTP на более новый было решено дополнить имеющийся протокол SMTP расширениями. Дополненный расширениями протокол SMTP называется ESMTP (Extended SMTP)
Пример использования команд SMTP
HELO smtp.example.com
MAIL FROM: fakeuser@example.com
RCPT TO: dummy@example.com
DATA
From: Fake User
To: Dummy
Subject: Message Example
Multiline
Message
Example
QUIT
Основные классы
пространства имен System.Net.Mail
MailMessage – класс сообщения
MailAddress – класс адреса
SmtpClient – класс для работы через SMTP
Attachment – класс для прикрепленных файлов
SmtpException – класс исключений работы SMTP
Пример:
SmtpClient client = new SmtpClient();
client.Host = "smtp.yandex.ru";
client.Port = 25;
client.Credentials = new NetworkCredential("username", "password");
MailMessage mm = new MailMessage();
mm.Sender = new MailAddress("fake@example.com", "fake");
mm.From = new MailAddress("fake@example.com", "fake");
mm.To.Add(new MailAddress("dummy@example.com", "dummy"));
mm.CC.Add(new MailAddress("user@example.com", "user"));
mm.Subject = "Еще одно письмецо";
mm.Body = "Привет! В аттаче фотка";
mm.IsBodyHtml = false;
mm.Priority = MailPriority.High;
Attachment a = new Attachment ("photo.jpg", System.Net.Mime.MediaTypeNames.Image.Jpeg);
mm.Attachments.Add(a);
client.Send (mm);
8.Почтовый протокол pop3.
Является наиболее распространенным протоколом для получения почтовых сообщений
Является простым в реализации протоколом
Является протоколом прикладного уровня и основан на протоколе TCP
Обычно при подключении к серверу выгружает все сообщения находящиеся на сервере, что позволяет в дальнейшем работать с почтой без подключения к сети Интернет
Пример общения по протоколу POP3
Каждая команда и ответы сервера оканчиваются символами перевода каретки и перехода на новую строку (“\r\n”). Исключение составляют мультистроковые команды LIST и RETR, которые оканчиваются одиночной точкой на новой строке.
Письма на сервере будут удалены только после получения команды QUIT.
Реализация почтового клиента POP3.
Вспомогательные методы
Метод, отвечающий за чтение сообщений сервера
private static string ReadLine(Stream s)
{
List<byte> lineBuffer = new List<byte>();
while (true)
{
int b = s.ReadByte();
if (b == 10 || b < 0) break;
if (b != 13) lineBuffer.Add((byte) b);
}
return Encoding.UTF8.GetString(lineBuffer.ToArray());
}
Метод, отвечающий за отправку сообщений на сервер
private static void SendCommand(Stream stream, string line)
{
byte[] data = Encoding.UTF8.GetBytes(line + "\r\n");
stream.Write(data, 0, data.Length);
string response = ReadLine(stream);
if (!response.StartsWith("+OK"))
throw new Exception("POP Error: " + response);
}
Реализация почтового клиента POP3
using (TcpClient client = new TcpClient(host, port))
using (NetworkStream nStream = client.GetStream())
{
ReadLine(nStream); // Считывание приветственного сообщения
//Аутентификация
SendCommand(nStream, "USER " + username);
SendCommand(nStream, "PASS " + password);
SendCommand(nStream, "LIST"); // Запрос на получение идентификаторов всех писем
List<int> messageIDs = new List<int>();
while (true)
{
string line = ReadLine(nStream); // номер и длина письма, например "1 1876"
if (line == ".") break;
messageIDs.Add(int.Parse(line.Split(' ')[0])); // номер сообщения
}
foreach (int id in messageIDs) // получение содержимого сообщений по их номерам
{
SendCommand(nStream, "RETR " + id);
string randomFile = Guid.NewGuid().ToString() + ".eml";
using (StreamWriter writer = File.CreateText(Path.Combine(outputDirectory, randomFile)))
while (true)
{
string line = ReadLine(nStream); // чтение следующей строки сообщения
if (line == ".") break; // Одна точка на новой строке - конец сообщения.
if (line == "..") line = "."; // экранирование отдельной точки - 2 точки
writer.WriteLine(line); // запись содержимого в файл
}
SendCommand(nStream, "DELE " + id); // Удаление прочитанного сообщения с сервера
}
SendCommand(nStream, "QUIT");
}
}