В SMTP соединении участвуют клиент (компьютер, который обращается к SMTP серверу) и передаваемый клиентом конверт. Давайте рассмотрим ситуацию на примере, используя для подключения к серверу программу telnet на вашем компьютере. Начнем с подключения в командной строке к порту 25 вашего почтового сервера:
$ telnet mail.example.com 25 220 mail.example.com
Возвращаемый сервером код 220 подтверждает имя хоста сервера. Теперь наша очередь представиться серверу:
HELO client.example.com 250 mail.example.com
«Рукопожатие» можно осуществить при помощи команды HELO (для SMTP) или EHLO (для ESMTP), указав имя хоста клиента в качестве параметра. В случае успешного выполнения команды вы получите код возврата 250, за которым будет следовать имя хоста сервера.
Давайте теперь отправим почту. Команда MAIL создает конверт, начиная с указания отправителя. Если сервер признал отправителя, вы снова получите код возврата 250:
MAIL FROM: 250 Ok
Следующий этап создания конверта – указание получателя конверта с помощью команды RCPT. Вы можете указать одного или нескольких получателей:
RCPT TO: 250 Ok RCPT TO: 250 Ok
Примечание Помните, что отправитель конверта и получатель конверта часто отличны от отправителя и получателя, указанных в заголовке сообщения (они указываются внутри команды DATA, о которой мы сейчас будем говорить). Если вы перепутаете разных получателей и отправителей, то ваше управление содержимым может дать сбой.
Для того чтобы отправить настоящее сообщение (включая все дополнительные заголовки, такие как Subject, To и Date), используйте команду DATA:
DATA 354 End data with . Subject: message ... This is the message ... . 250 Ok: queued as 92933E1C66 QUIT
Приведем теперь краткое описание только что рассмотренных понятий, представленное в RFC для электронной почты:
Клиент Клиент – это компьютер, отправляющий почту; Postfix запишет имя и IP адрес хоста или же «unknown» (если в результате поиска в DNS невозможно определить имя хоста). Прежде чем будет открыто SMTP соединение, Postfix получает IP адрес клиента из TCP/IP стека ядра, а имя от DNS или из /etc/hosts. Это позволяет Postfix наложить ограничения в случае, если в SMTP соединении возникнет несоответствие IP адреса клиента и имени хоста.
Postfix всегда записывает IP адрес клиента и имя хоста (если оноимеется) в почтовый журнал, а также добавляет эту информацию в последний заголовок сообщения.
Команда HELO/EHLO Клиент должен представиться почтовому серверу, сообщив о себе следующие сведения: тип обслуживания и имя хоста. Первая часть команды представления – это запрашиваемый клиентом тип обслуживания. HELO определяет обычное обслуживание, как описано в RFC 821 (), а EHLO – расширенное, как описано в RFC 2821 ().
Вслед за запрашиваемым типом обслуживания должна быть идентифицирована личность клиента (предполагается, что клиент предоставит полное имя хоста).
Конверт Конверт должен содержать как минимум два различных элемента: ровно одного отправителя конверта и как минимум одного получателя конверта. Клиент отправляет конверт, передавая сначала имя отправителя, затем имена получателей конверта.
Если получателей у конверта несколько, то клиент должен передавать их имена одно за другом, каждое с новой строки, ожидая отве та сервера после каждого нового имени.1 В задачу сервера входит разрешение доставки всем или нескольким получателям.
Отправитель конверта Отправитель конверта – это отправитель, которому Postfix ответитв случае ошибки: отложенной доставки или получении уведомления о возврате.
Получатель конверта Получатель конверта – это подразумеваемый получатель (получатели) сообщения. Одно сообщение может иметь несколько получателей конверта (например, сообщение нескольким подписчикам списка рассылки).
Почтовый сервер требует указания хотя бы одного получателя конверта (в противном случае ему некому доставлять сообщение). По этому клиент не может указать пустого получателя конверта (<>).
Предупреждение Когда вы будете накладывать ограничения на получателей сообщения, не обращайте внимания на получателей, указанных в поле заголовка To. Сообщение передается получателям, определенным в конверте, а не в заголовке сообщения.
Практически все данные из предыдущего списка могут быть сфальсифицированы, поэтому Postfix позволяет снизить риск подлога при помощи параметров smtpd_*_restrictions, которые определяют ответы на такие вопросы: 1. Откуда пришел клиент? 2. Кем клиент представился? 3. Есть ли у клиента специальные привилегии? 4. Кто является отправителем? 5. Кто является получателем?
Postfix также пытается дать ответы на более сложные вопросы: 1. В правильной ли форме клиент предоставляет информацию Postfix? 2. В правильном ли порядке клиент предоставляет информацию? 3. Всю ли информацию предоставил клиент? 4. Если клиент предоставил не всю необходимую информацию, попытается ли он отправить сообщение? 5. Можно ли определить, корректна ли информация? 6. Если возможно это определить, лжет ли клиент?
Postfix может дать ответы на эти вопросы, исследовав конверт сообщения и элементы SMTP диалога. Когда Postfix отвергает сообщение на основе ограничений для SMTP конверта, он отвергает сообщение до его получения. Поэтому Postfix не отправляет уведомление о «недоставимости» сообщения по адресу отправителя, этим должен заниматься клиент.
Примечание Если Postfix отвергает сообщение на основе ограничений для SMTP конверта, Postfix не должен уведомлять об этом, т. к. он отказал клиенту в обслуживании. Этот подход помогает сохранить системные ресурсы, не увеличивает трафик.