Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры.docx
Скачиваний:
105
Добавлен:
11.05.2015
Размер:
1.13 Mб
Скачать

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");

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]