Команды SMTP в Linux
SMTP
dns сервер клиента определяет по записи mx на какой сервер отсылать электронную почту
После того как клиент определит адрес сервер получателя, он устанавливает smtp соединение
После установления сеанса TCP сервер SMTP посылает клиенту специальное сообщение об установке соединения
Дальше соединением управляет клиент, отправляя команды на которые сервер должен ответить
Формат команд в SMTP:
command [parameter]
command 4-x символьная команда
Число, с которого начинается ответ, является трехзначным кодом ответа. Этот код может использоваться при поиске и устранении неполадок в работе электронной почты.
Основные команды SMTP:
HELO Открывает приглашение от клиента
MAIL Определяет отправителя сообщения
RCPT Определяет получателей сообщения
DATA Определяет начало сообщения
SEND Посылает сообщение на терминал
SOML Send-or-Mail
SAML Send-and-Mail
RSET Сброс SMTP-соединения
VRFY Проверяет имя пользователя системы
EXPN Запрашивает список псевдонимов
HELP Запрашивает список команд
NOOP No operation — Ничего не делать
QUIT Остановить сеанс SMTP
TURN Реверс ролей в SMTP (клиент становится сервером)
С помощью команды HELO клиент представляется серверу и если сервер отвечает положительным ответом 250, это означает что сервер готов отвечать на команды
В настоящее время данная команда используется формально. Почтовый сервер старается идентифицировать клиента с помощью механизма обратного преобразования DNS с целью определения действительности имени хоста клиента по его ip адресу
Команда HELO объявляет в качестве клиента имя локального хоста, а не реального пользователя, отославшего сообщение
Как правильно почтовый сервер smtp отказывает в соединении если IP адрес хоста клиента не преобразуется в соответствующее имя данного хоста
Команда MAIL используется для организации сеанса обмена электронной почтой с сервером после команды HELO, указывает на отправителя сообщения, синтаксис следующий:
MAIL reverse-path
Аргумент reverse-path определяет отправителя сообщения и указывает обратный маршрут по которому нужно вернуть ответ в случае невозможности его доставки
В реальном запросе это будет выглядеть так:
MAIL FROM: tolik@netbash.ru
Если почтовое сообщение проходило на пути от отправителя к получателю через несколько узлов, то каждый из них будет добавлять сведения о себе в поле <reverse-path>, для обнаружения почтовых серверов, которые пытаются скрыть свою принадлежность, посылая сообщения через неизвестные серверы SMTP
Команда RCPT определяет получателя сообщений, есть возможность укзать несколько получателей
RCPT TO: nameuser //Если сервер smtp локальный
RCPT TO: nameuser@mail.ru
Если почтовый сервер не находит у себя имя получателя, тогде возможны несколько вариантов возможных событий:
1. Сервер может переслать полученное сообщение дальше, отправив утвердительный ответ отправителю, при этом он добавляет свое имя в поле reverse-path, т.е. включает себя в маршрут прохождения
2. Хост не может переслать сообщение, о чем сообщает отправителю
Команда DATA используется для передачи информации в сообщении:
Программа-клиент обозначает конец сообщения посредством передачи строки с одной точкой:
DATA 'hello world'
Приняв эту последовательность, сервер SMTP "понимает", что передача сообщения закончена и следует вернуть код ответа, который оповестит клиента о том, что его сообщение принято.
Команда SEND используется для передачи сообщения непосредственно на терминал пользователя системы. Выполняется если пользователь находится в системе.
Команда SOML играет роль SEND и MAIL. Если пользователь подключен к системе тогда команда будет работать как команда SEND, в противном случае как команда MAIL
Команда SAML также как и SOML играет роль SEND и MAIL, но в отличии от SOML одновременно отправляет письмо на терминал пользователя и в его ящик
Команды SAML и SOML не поддерживаются многими версиями SMTP так как небезопасны
Команда RSET значит reset, возвращает сеанс к начальной точке ( HELO )
Команда VRFY значит verify, определяет возможность доставки сообщения определенному пользователю перед выполнением команды RCPT
VRFY tolik@netbash.ru
Команда EXPN эффективен когда с одного адреса требуется послать большое количество одинаковых сообщений группам пользователей
EXPN mail-list
Команда NOOP ( no operation ), просто проверяет соединение без пересылки сообщения
Команда TURN используется для двухстороннего общения с сервером, что не безопасно, поэтому не факт, что каманда будет работать у клиента
Часто появление ошибок типа 500, 502 и 504 может быть вызвано попыткой выполнения команд из расширений протокола SMTP, которые не поддерживаются более старыми версиями программ на сервере SMTP.
Код ответ SMTP сервера
500 Ошибка в синтаксисе, команда не опознана
501 Ошибка в синтаксисе параметров
502 Команда не поддерживается
503 Неправильная последовательность команд
504 Параметр команды не поддерживается
211 Состояние системы или помощь
214 Сообщение-справка
220 Служба готова
221 Служба закрывает канал передачи
421 Служба недоступна
250 Запрошенное действие выполнено успешно (ОК)
251 Пользователь не является локальным, сообщение будет переслано по <путь-пересылки>
354 Начать ввод сообщения: закончить по
450 Запрошенное действие не выполнено — почтовый ящик недоступен
451 Запрошенное действие отвергнуто — ошибка обработки
452 Запрошенное действие не выполнено — в системе недостаточно дискового пространства
550 Запрошенное действие не выполнено — почтовый ящик недоступен
551 Пользователь не является локальным, попробуйте переслать сообщение по <путь-пересылки>
552 Запрошенное действие отвергнуто — превышены допустимые пределы хранения
553 Запрошенное действие не выполнено — указано недопустимое имя почтового ящика
554 Операция прекращена
Формат сообщения SMTP
Сообщение разбивается на две части, заголовок и тело, должны разделяться пустой строкой
Поля заголовка могут располагаться в произвольном порядке
Received:
Return-Path:
Reply-To:
From:
Date:
To:
***********************
Message body
Заголовок Received используется для идентификации SMTP серверов, которые принимают участие в процессе доставки, т.е. каждый сервер добавляет свое поле в заголовок Received ( путь, протокол, название хоста )
Формат поля заголовка Received: (Принято:) следующий: Received:
from host name
by host name
via physical-path
with protocol
id message-id
for final e-mail destinationj
Поле заголовка Return-Path
Последний smtp сервер в цепочке добавляет значение для этого поля, определяет маршрут посредством которого сообщение достигло получателя
Если сообщение было отправлено на прямую, будет указан один сервер, в противном случае вся цепочка
Формат этого поля заголовка следующий:
Return-Path: route
В поле Originator указывается адрес отправителя
Reply-To: address
Поле заголовка Resent идентифицирует почтовое сообщение, которое должно было отсылаться повторно
Resent-Reply-To:
address
Authentic идентифицируют в своем поле отправителя электронного сообщения
в действительности требуется только одно из этих полей:
From: user-name
Sender: user-name
Resent-authentic определяют отправителя сообщения, которое по какой-либо причине повторно передавалось программой-клиентом
Resent-From: date-time
Resent-Sender: date-time
Поля заголовка Dates используются для помещения метки времени в сообщение при передаче его от клиента серверу
Date: date-time
Resent-Date: date-time
В полях заголовка Destination указываются адреса электронной почты получателей сообщения, является информационным, реальное значение помещается в команду RCPT
В поле CC помещаются получатели, которые должны получить копию сообщения
В поле BCC помещается невидимая копия, адрес получателя, который не виден посторонним
To: address
Resent-To: address
CC: address
Resent-CC: address
BCC: address
Resent-BCC: address
Необязательные поля заголовка:
Message-ID: message-id
Resent-Message-ID: message-id
In-Reply-To: message-id
References: message-id
Keywords: text - list
Subject: text
Comments: text
Encrypted: word
Subject: Тема
Message-ID: Идентификатор сообщения
Encrypted: указывает, подверглось ли сообщение шифрованию
Keywords: ключевые слова в сообщении
Источник: intuit.ru
Двоичные данные и MIME
DATA разрешает ввод только текстовых данных в формате ASCII
Программа-клиент до передачи сообщения программе SMTP конвертирует двоичные данные сообщения в текстовый формат ASCII. Почтовая программа у получателя делает обратное преобразование текста в формате ASCII в двоичные данные
Если принят двоичный файл, закодированный с помощью uuencode, его можно раскодировать с помощью uudecode обратно в двоичный файл
В документах RFC 2045 и 2046 описывается формат многоцелевых расширений для электронной почты в Internet (Multipurpose Internet Mail Extensions — MIME). Алгоритм кодирования MIME намного надежней uuencode. В нем учитывается тип двоичного файла, подвергающегося преобразованию, а также передается дополнительная информация о файле для декодера. Алгоритм MIME позволяет помещать двоичные данные напрямую в стандартное почтовое сообщение, согласно RFC 822. Для описания двоичных данных, вкладываемых в сообщение формата RFC 822, были созданы пять новых полей заголовка.
Источник: intuit.ru
MIME header
Message header
MIME body
Mime version - версия MIME которую использовал отправитель
Content-Transfer-Encoding указывается способ помещения двоичных данных в сообщение текстового формата ASCII.
Content-ID используется для идентификации сеансов MIME
Content-Description используется для текстового описания в формате ASCII данных
Content-Type идентифицирует данные, заключенные в MIME-сообщение ( text, plain, enriched, message, partial, external-body, image, video, audio, application, multipart, alternative)
Источник: intuit.ru
Extended SMTP
Команда HELO заменена на команду приглашения — EHLO, получение сервером SMTP такой команды означает, что клиент может посылать ему расширенные SMTP команды
Одна из новых групп команд называется параметрами уведомления о доставке сообщения (Delivery Status Notification). Эти параметры могут использоваться с командами MAIL и RCPT для отображения состояния доставки определенного сообщения электронной почты.
Команда ETRN позволяет SMTP-клиенту выдавать запрос на SMTP-сервер для того, чтобы инициировать еще одно SMTP-соединение с клиентом для передачи ему сообщений. Единственное отличие команды ETRN от TURN заключается в том, что запрос поступает не на использование существующего соединения, а на открытие нового сеанса SMTP.
Источник: intuit.ru
Использование openssl
Для авторизации отправителя необходимо сгенерировать логин и пароль в специальном формате base64
echo -ne "mmegatest@yandex.ru" | base64
echo -ne "password" | base64
#Альтернативный вариант для AUTH PLAIN
echo -ne "\0username\0password" | base64
Далее используем их для авторизации отправителя, после соединения с сервером smtp.yandex.ru
#Для startls
#openssl s_client -starttls smtp -connect smtp.yandex.ru:587
#Для openssl
#openssl s_client -connect smtp.yandex.ru:465
#Пример
openssl s_client -starttls smtp -connect smtp.mail.ru:587
........
.........
.......
---
250 STARTTLS
EHLO localhost
250-smtp35.i.mail.ru
250-SIZE 73400320
250-8BITMIME
250-PIPELINING
250-DSN
250 AUTH PLAIN LOGIN XOAUTH2
AUTH PLAIN
334
AG1lZ2FwbGFuQG0Q3WmZXa0Jpb2VHZ2FwbGFuQG0Q3WmZXa0Jpb2JhZGUucnUAQkttcjZocGltRlKdWk=
235 Authentication succeeded
mail from: megauser@mail.ru
250 OK
rcpt to: mmegatest@yandex.ru
250 Accepted
data
354 Enter message, ending with "." on a line by itself
subject: test
test test test
.
250 OK id=1pSiK7-005XCM-94
quit
221 smtp35.i.mail.ru closing connection
closed
Если ваше имя пользователя или пароль в формате base64 начинаются с заглавной буквы "Q", open ssl вернет DONE .
Аналогично, если они начинаются с "R", соединение будет ПЕРЕСМОТРЕНО.
В таком случае можно попробовать сгенерировать новый логин или пароль или использовать AUTH PLAIN ( одна строка )