Блог - Linux, программирование, Я!

WEB, ИнтернетПротоколы прикладного уровня: SMTP

SMTP (англ. Simple Mail Transfer Protocol — простой протокол передачи почты) — это сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.

ESMTP (англ. Extended SMTP) — масштабируемое расширение протокола SMTP. В настоящее время под «протоколом SMTP», как правило, подразумевают ESMTP и его расширения.

Сразу отмечу, что в настоящее время SMTP в чистом виде уже не используется, т.к. он даже не поддерживает элементарно авторизацию… Используется только ESMTP. Когда вы пользуетесь почтовым клиентом (Outlook, Thunderbird, Evolution, TheBat) происходит работа именно по этому протоколу.

Так вот, давайте попробуем элементарно отправить e-mail из консоли через почтовый сервер яндекса  (не важно, линукс у вас или виндоус).

Для работы с этим протоколом нужно соединиться с почтовым сервером по определенному порту и отправить некоторую последовательность ESMTP команд.

Команда представляет из себя строку вида

КОМАНДА[пробел]параметр(опционально)

В ответ на команду сервер возвращает строку вида

XXX[пробел]доп. информация

При этом число в ответе сервера обозначает:

2ХХ — команда успешно выполнена

3XX — ожидаются дополнительные данные от клиента

4ХХ — временная ошибка, клиент должен произвести следующую попытку через некоторое время

5ХХ — неустранимая ошибка

Подразумевается, что у вас есть аккаунт на яндексе…

Сразу предупреждаю, что после соединения все команды нужно вводить максимально быстро, т.к. при задержке около 15 секунд соединение автоматически разрывается. Рекомендую сперва все команды заранее набрать в текстовом редакторе а после просто вставлять их в командную строку.

telnet smtp.yandex.ru 2025#соединяемся с smtp почтовым сервером. Адрес и порт smtp сервера можно посмотреть в инструкциях на сайте почтовика

Ответ:

Trying 213.180.204.38...

Connected to smtp.yandex.ru.

Escape character is '^]'.


220 Yandex ESMTP (NO UCE)(NO UBE) server ready at Mon, 2 Feb 2009 13:47:22 +0300


Код 220 говорит об успешном соединении

EHLO [91.198.212.5] #Приветствуем сервер и отсылаем ему наш внешний айпишник (айпишник не обязательно отсылать, можно обойтись просто EHLO)

Ответ:

250-smtp18.yandex.ru Hello 91.198.212.5

250-SIZE 20971520

250-8BITMIME

250-PIPELINING

250-CHUNKING

250-ENHANCEDSTATUSCODES

250-DSN

250-X-RCPTLIMIT 25

250-AUTH=LOGIN

250-AUTH LOGIN

250-STARTTLS

250 HELP


Сервер принял приветствие и выслал список поддерживаемых команд. Из этого списка нас интересует AUTH LOGIN. Это команда для авторизации по base64 закодированному логину и паролю. Так вот, нужно заранее подготовить закодированные в base64 пароль и логин от вашей почты. Можно это сделать, например, здесь http://seriyps.ru/crypt/

AUTH LOGIN # Сообщаем серверу о намерении пройти авторизацию

Ответ:

334 VXNlcm5hbWU6

Этот самый VXNlcm5hbWU6 – закодированное в base64 слово "Username:"

ВАШ_ЛОГИН_ПОЧТЫ_В_BASE_64 #Отправляем ваш логин почты в base64, например dmFzaWFwdXBraW4=

Ответ:

334 UGFzc3dvcmQ6

Это, как можно догадаться, "Password:" в base64

ВАШ_ПАРОЛЬ_ПОЧТЫ_В_BASE_64 # Отправляем пароль почты в base64, например MTIzNDU2

Ответ:

235 Authentication successful.

т.е. авторизация прошла успешно. Теперь можно отправлять почту)

MAIL FROM: vasiapupkin@ya.ru # Сообщаем, что хотим отправить почту с адреса vasiapupkin@ya.ru

Ответ:

250 2.1.0 Sender syntax Ok;

RCPT TO: billy@microsoft.com # Сообщаем, что хотим отправить письмо на адрес billy@microsoft.com

Ответ:

250 2.1.5 Recipient address syntax Ok; rcpt=<billy@microsoft.com>

DATA # Здесь сообщаем, что начинаем передачу данных.

Ответ:

354 Start mail input; end with <CRLF>.<CRLF>

Т.е. сервер будет считывать введенные в консоли данные до того момента, пока мы не нажмем Энтер точка Энтер (после этой комбинации письмо сразу отправляется)

Начинаем вводить заголовки письма. Можно вставить и файл, закодированный в base64 но это уже сложнее. Если нужно – пишите, допишу позже…:

From: Vasia Pupkin <vasiapupkin@ya.ru> #Заголовок для поля От

To: Billy G <billy@microsoft.com> #Заголовок для поля Кому

Subject: Hello Billy # Заголовок для темы сообщения

(Кстати, хочу заметить, что MAIL FROM: vasiapupkin@ya.ru и From: Вася Пупкин <vasiapupkin@ya.ru> вовсе не обязаны совпадать! т.е. можно отправить почту с яндекса а притвориться, что она отправлена с mail.ru например… Хотя это не очень-то сложно вычислить…)

Два раза Энтер, затем вводим сам текст письма.

Hello, Billy! You will be die tomorrow!

Энтер .  Энтер # Сообщаем, что закончили передачу сообщения

Ответ:

250 2.0.0 accepted; S10436885AbZBBKvs

Т.е. сообщение принято для передачи

QUIT # Завершаем сеанс

Ответ:

221 2.0.0 smtp18.yandex.ru Out

Connection closed by foreign host
.

Все))

Теперь кратко весь список наших команд:

telnet smtp.yandex.ru 2025

EHLO 91.198.212.5

AUTH LOGIN

ВАШ_ЛОГИН_ПОЧТЫ_В_BASE_64

ВАШ_ПАРОЛЬ_ПОЧТЫ_В_BASE_64

MAIL FROM: vasiapupkin@ya.ru

RCPT TO: billy@microsoft.com

DATA

From: Вася Пупкин <vasiapupkin@ya.ru>

To: Билли Г <billy@microsoft.com>

Subject: Hello Billy

Hello, Billy! You will be die tomorrow!

Энтер .  Энтер

QUIT

Удачных экспериментов!