Команды smtp


SMTP обеспечивает двухстороннюю связь между агентами передачи почты (МТА), клиентом и сервером. Клиенты шлют команды серверу, а серверы отвечают клиентам. Однако SMTP оговаривает последовательность SMTP-команд. Лучший способ понять это — взглянуть на образец почтовой транзакции. Следующий пример (он взят целиком из RFC 821) демонстрирует типичную почтовую транзакцию. В примере фигурирует мистер Smith (на компьютере usc.edu), посылающий сообщения мистерам Jones, Green и Brown (на компьютере mit.edu). Агент передачи почты хоста mit.edu принимает почту для мистеров Jones и Brown, однако не знает, где расположен почтовый ящик мистера Green.

Для целей дальнейшего повествования каждой строке присвоен номер и обозначено, кому она принадлежит — передатчику или приемнику. Текст справа от слов «RECEIVER» или «SENDER» содержит действительно передаваемые данные. Трехзначные цифровые комбинации в начале передаваемых строк обозначают коды ответа (их значение объясняется позже). Ответ SMTP похож на сообщения-подтверждения о доставке, поскольку появляется лишь в том случае, когда приемник получил данные.


1.   RECEIVER: 220 mit.edu Simple Mail Transfer Service Ready

2.   SENDER:    HELO usc.edu

3.   RECEIVER: 250 mit.edu

4.   SENDER:    MAIL FROM:<Smith@usc.edu>

5.   RECEIVER: 250 OK

6.   SENDER:                RCPT TO:<Jones@mit.edu>

7.   RECEIVER: 250 OK

8.   SENDER:                RCPT TO:<Green@mit.edu>

9.   RECEIVER: 550 No such user here

10. SENDER:                RCPT TO:<Brown@mit.edu>

11. RECEIVER: 250 OK

12. SENDER:                DATA

13. RECEIVER: 354 Start mail input; end with <CRLF>.<CRLF>

14. SENDER: ,  Blah blah blah…

15. SENDER:                …etc. etc. etc.

16. SENDER:    .

17. RECEIVER: 250 OK

18. SENDER:    QUIT

19. RECEIVER: 221 mit.edu Service closing transmission channel

Как видно из строки 1, когда SMTP-клиент устанавливает TCP-соединение с портом протокола 25, SMTP-сервер отвечает кодом 220. Это означает, что соединение успешно установлено:

1. RECEIVER:   220 mit.edu Simple Mail Transfer Service Ready

После того, как МТА компьютеров mit.edu и usc.edu установили соединение и обменялись приветствием, первой командой, согласно спецификации, должна быть команда HELO. Как указано в строке 2, SMTP-клиент передает HELO, указывая имя своего компьютера в качестве аргумента. Другими словами, он сообщает: «Привет, я — usc.edu». Команда HELO употребляется с аргументом, как показано ниже:


2.   SENDER:  HELO usc.edu

В ответ на HELO приемник выдает код 250, сообщая передатчику о том, что команда принята и обработана:

3. RECEIVER:   250 mit.edu

После установления TCP-соединения и идентификации (при помощи HELO) SMTP-клиент приступает к почтовой транзакции. Для начала он выполняет одну из следующих команд: MAIL, SEND, SOML или SAML. В нашем примере использована команда MAIL:

4.   SENDER:  MAIL  FROM:<Smith@usc.edu>

Все четыре команды: MAIL, SEND, SOML и SAML имеют одинаковый синтаксис:  

MAIL <пробел> FROM:<reverse-path> <carriage-return line-feed>

Команды SEND, SOML и SAML дополнительны и используются довольно редко.

Аргумент «обратный путь» (reverse path) указывает серверу, кому в случае ошибки отослать соответствующее сообщение. Мы еще рассмотрим его подробнее. На данный момент для нас важно, что в аргументе содержится адрес источника сообщения (в нашем случае, Smith@usc.edu). После того, как сервер выдал код ответа 250 (строка 5), согласившись обработать сообщение от Smith@usc.edu, необходимо указать получателя сообщения. Это делается при помощи команды RCPT. Команда RCPT имеет аргумент — имя получателя. На одну команду приходится только одно имя, поэтому, если получателей несколько, команда RCPT выдается несколько раз. В нашем примере команды RCPT выполняются в строках 6, 8 и 10. Синтаксис RCPT похож на синтаксис команды MAIL:


RCPT <пробел> TO:<forward-path> <CRLF>

Однако в отличие от MAIL, аргумент RCPT начинается со слова «ТО:». Содержимое аргумента — путь передачи сообщения (forward path), а не обратный путь. На данный момент для нас важно, что в пути передачи сообщения указано имя почтового ящика получателя. Выдав команду RCPT, МТА-клиент ожидает получить ответ с кодом 250. Однако в ответ на восьмую строку

8. SENDER:    RCPT ТО:<Green@mit.edu>

сервер отвечает кодом 550:

9. RECEIVER:   550 No such user here

Код ответа 550 означает, что МТА не в состоянии выполнить запрос клиента, поскольку не знает, как доставить почту указанному пользователю. То есть скорее всего у мистера по фамилии Green нет почтового ящика (Green@mit.edu) на этом компьютере. В протоколе SMTP сказано, что сервер обязан информировать клиента об отсутствии почтового ящика получателя сообщения. Однако в спецификации SMTP ничего не говорится о том, как клиент должен реагировать на это сообщение.

После того, как посланы все команды RCPT, клиент начинает передачу данных при помощи команды DATA. В строке 12 показано, как МТА-клиент (передатчик) высылает команду DATA, в строке 13 — как сервер отвечает кодом 354. Этот код означает, что передача данных разрешена и должна заканчиваться комбинацией CRLF-точка-CRLF (новой строкой, содержащей только точку).


12.   SENDER:            DATA

13.   RECEIVER:      354   Start  mail   input;   end with  <CRLF>.<CRLF>

После того, как получен код 354,  клиент может начать передачу данных. МТА-сервер, в свою очередь, помещает принятые данные в очереди входящих сообщений. Сервер не высылает никаких ответов до тех пор, пока не получит комбинацию CRLF-точка-CRLF от клиента, означающую конец передачи данных. Как показано в строках 16 и 17, в ответ на полученную комбинацию CRLF-точка-CRLF, сервер выдает код 250. Как мы уже говорили, код ответа 250 означает успешное окончание операции:

16.   SENDER:

17.   RECEIVER:      250   OK

Для того чтобы закончить почтовую транзакцию, клиент, по правилам SMTP, обязан послать команду QUIT. Сервер, в свою очередь, отвечает кодом 221. Этот код подтверждает клиенту, что соединение будет закрыто, после чего соединение действительно закрывается:

18.  SENDER:   QUIT

19. RECEIVER:  221 mit.edu Service closing transmission channel

В любой момент во время транзакции клиент может использовать команды NOOP, HELP, EXPN и VRFY. В ответ на каждую команду сервер высылает клиенту определенную информацию. Конечно, в зависимости от ответа клиент может предпринять определенные действия, однако спецификация SMTP ничего не говорит по этому поводу.


Например, клиент-МТА может передать команду VRFY для того, чтобы убедиться, что имя пользователя действительно. Если сервер ответит, что данного имени не существует, клиент МТА может не передавать почту для этого пользователя. В спецификации SMTP, однако, на этот счет нет никаких указаний — клиент может ничего не делать в ответ на команду VRFY. МТА-клиент может ничего не делать также в ответ на команды NOOP, HELP и EXPN — ответственность целиком лежит на разработчике конкретной реализации МТА.

Таблица 3.11

Коды ответа SMTP и их значение






Код

Значение

211

Ответ о состоянии системы или помощь

214

Сообщение-подсказка (помощь)

220

<имя_домена> служба готова к работе

221

<имя_домена> служба закрывает канал связи

250

Запрошенное действие почтовой транзакции успешно завершилось

251

Данный адресат не является местным; сообщение будет передано по маршруту <forward-path>

354

Начинай передачу сообщения. Сообщение заканчивается комбинацией CRLF-точка-CRLF

421

<имя_домена> служба недоступна; соединение закрывается

450

Запрошенная команда почтовой транзакции не выполнена, так как почтовый ящик недоступен

451

Запрошенная команда не выполнена; произошла локальная ошибка при обработке сообщения

452

Запрошенная команда не выполнена; системе не хватило ресурсов

500

Синтаксическая ошибка в тексте команды; команда не опознана

501

Синтаксическая ошибка в аргументах или параметрах команды

502

Данная команда не реализована

503

Неверная последовательность команд

504

У данной команды не может быть аргументов

550

Запрошенная команда не выполнена, так как почтовый ящик недоступен

551

Данный адресат не является местным; попробуйте передать сообщение по маршруту <forward-path>

552

Запрошенная  команда почтовой  транзакции  прервана;   дисковое пространство, доступное системе, переполнилось

553

Запрошенная команда не выполнена; указано недопустимое имя почтового ящика

554

Транзакция не выполнена

libraryno.ru

Что нужно знать перед началом работыWhat do you need to know before you begin?

  • Предполагаемое время для завершения: 30 минут.Estimated time to complete: 30 minutes

  • Разрешения Exchange не применяются к процедурам, описанным в этом разделе. Эти процедуры выполняются в операционной системе сервера Exchange или клиентского компьютера.Exchange permissions don’t apply to the procedures in this topic. These procedures are performed in the operating system of the Exchange Server or a client computer.

  • Процедуры, описанные в этом разделе, лучше всего использовать для подключения к серверам с доступом в Интернет, которые поддерживают анонимные подключения. Обмен сообщениями между внутренними серверами Exchange шифруется и проходит проверку подлинности. Чтобы использовать Telnet для подключения к службе транспортного сервера-концентратора на сервере почтовых ящиков, нужно создать соединитель получения, настроенный на поддержку анонимного доступа или обычную проверку подлинности для получения сообщений. Если соединитель поддерживает обычную проверку подлинности, необходима служебная программа для преобразования текстовых строк, используемых для имени пользователя и пароля, в формат Base64. Поскольку имя пользователя и пароль при использовании обычной проверки подлинности легко перехватываются, обычную проверку подлинности не рекомендуется использовать без шифрования.The procedures in this topic are best used to connect to and from Internet-facing servers that allow anonymous connections. Message transmission between internal Exchange servers is encrypted and authenticated. To use Telnet to connect to the Hub Transport service on a Mailbox server, you’ll need to create a Receive connector that’s configured to allow anonymous access or Basic authentication to receive messages. If the connector allows Basic authentication, you need a utility to convert the text strings that are used for the username and password into the Base64 format. Because the user name and password are easily discernible when Basic authentication is used, we don’t recommend Basic authentication without encryption.

  • Если вы подключаетесь к удаленному серверу обмена сообщениями, рекомендуется выполнить описанные в этом разделе процедуры на сервере Exchange с выходом в Интернет. Это позволит избежать отклонения тестового сообщения удаленными серверами обмена сообщениями, настроенными на проверку IP-адреса источника, соответствующего DNS-имени домена и IP-адреса обратного просмотра любого узла в Интернете, который пытается отправить сообщение на сервер.If you connect to a remote messaging server, consider performing the procedures in this topic on your Internet-facing Exchange server. This will help to avoid rejection of the test message by remote messaging servers that are configured to validate the source IP address, the corresponding domain name system (DNS) domain name, and the reverse lookup IP address of any Internet host that tries to send a message to the server.

  • Сочетания клавиш для процедур, описанных в этой статье, приведены в статье Сочетания клавиш в Центре администрирования Exchange.For information about keyboard shortcuts that may apply to the procedures in this topic, see Keyboard shortcuts in the Exchange admin center.

Действие 1. Установка клиента Telnet в Windows.Step 1: Install the Telnet Client in Windows

По умолчанию клиент Telnet не установлен в большинстве клиентских и серверных версий операционных систем Microsoft Windows. Сведения о его установке см. в статье Установка клиента Telnet.By default, the Telnet Client isn’t installed in most client or server versions of the Microsoft Windows operating systems. To install it, see Install Telnet Client.

Действие 2. Поиск полного доменного имени или IP-адреса в записи MX удаленного сервера SMTP с помощью средства командной строки Nslookup.Step 2: Use Nslookup to find the FQDN or IP address in the MX record of the remote SMTP server

Для подключения к конечному серверу SMTP с помощью протокола Telnet на порте 25 необходимо использовать полное доменное имя или IP-адрес сервера SMTP. Если полное доменное имя или IP-адрес неизвестны, самым простым способом получения этих сведений является использование средства командной строки Nslookup для поиска записи MX конечного домена.To connect to a destination SMTP server by using Telnet on port 25, you must use the fully qualified domain name (FQDN) or the IP address of the SMTP server. If the FQDN or IP address is unknown, the easiest way to find this information is to use the Nslookup command-line tool to find the MX record for the destination domain.

  1. В командной строке введите nslookup и нажмите клавишу ВВОД. Эта команда открывает сеанс Nslookup.At a command prompt, type nslookup, and then press ENTER. This command opens the Nslookup session.

  2. Тип задать тип = mx и нажмите клавишу ВВОД.Type set type=mx and then press ENTER.

  3. Тип задать время ожидания = 20 и нажмите клавишу ВВОД. По умолчанию DNS-серверов Windows имеют времени ожидания запроса DNS рекурсивный 15 секунд ограничение.Type set timeout=20 and then press ENTER. By default, Windows DNS servers have a 15-second recursive DNS query time-out limit.

  4. Введите имя домена, для которого вы хотите найти записи MX. Например чтобы найти записи MX для домена fabrikam.com, введите fabrikam.com. и нажмите клавишу ВВОД.Type the name of the domain for which you want to find the MX record. For example, to find the MX record for the fabrikam.com domain, type fabrikam.com., and then press ENTER.

    Выходные данные команды выглядят следующим образом:The output of the command will resemble the following:

     fabrikam.com mx preference=10, mail exchanger = mail1.fabrikam.com  fabrikam.com mx preference=20, mail exchanger = mail2.fabrikam.com  mail1.fabrikam.com internet address = 192.168.1.10  mail2 fabrikam.com internet address = 192.168.1.20 

    В качестве SMTP-сервера назначения можно использовать любые имена узлов или IP-адреса, связанные с MX-записями. Меньшее значение приоритета означает более предпочтительный SMTP-сервер. В целях балансировки нагрузки и отказоустойчивости можно использовать несколько MX-записей и различные значения приоритета.You can use any of the host names or IP addresses that are associated with the MX records as the destination SMTP server. A lower value of preference indicates a preferred SMTP server. You can use multiple MX records and different values of preference for load balancing and fault tolerance.

  5. Для завершения сеанса Nslookup введите exit и нажмите клавишу ВВОД.When you’re ready to end the Nslookup session, type exit, and then press ENTER.

Действие 3. Использование протокола Telnet на порте 25 для проверки связи по протоколу SMTP.Step 3: Use Telnet on Port 25 to test SMTP communication

В этом примере используются следующие значения.In this example, the following values are used:

  • Mail1.fabrikam.com назначения SMTP-сервераDestination SMTP server mail1.fabrikam.com

  • Исходный домен contoso.comSource domain contoso.com

  • Адрес электронной почты отправителя chris@contoso.comSender’s e-mail address chris@contoso.com

  • Адрес электронной почты получателя kate@fabrikam.comRecipient’s e-mail address kate@fabrikam.com

  • Тема сообщения Тестирование из ContosoMessage subject Test from Contoso

  • Текст сообщения   This is a test messageMessage body This is a test message

  1. В командной строке введите telnet и нажмите клавишу ВВОД. Эта команда открывает сеанс Telnet.At a command prompt, type telnet, and then press ENTER. This command opens the Telnet session.

  2. Введите set локального и нажмите клавишу ВВОД. Эта команда необязательно позволяет отслеживать символы по мере их ввода. Этот параметр может потребоваться для некоторых SMTP-серверов.Type set localecho and then press ENTER. This optional command lets you view the characters as you type them. This setting may be required for some SMTP servers.

  3. Введите set файл журнала * <filename>*. Эта команда необязательно включает ведение журнала сеанса Telnet в указанный файл журнала. Если задано только имя файла, расположение файла журнала — это имя текущего каталога. Если указан путь и имя файла, путь должен быть локальный компьютер. Путь и имя файла, который указан должен указываться в формате Microsoft DOS 8.3. Указанный путь, должны уже существовать. При указании файла журнала, который не существует, создается автоматически.Type set logfile <filename>. This optional command enables logging of the Telnet session to the specified log file. If you only specify a file name, the location of the log file is the current working directory. If you specify a path and a file name, the path must be local to the computer. Both the path and the file name that you specify must be entered in the Microsoft DOS 8.3 format. The path that you specify must already exist. If you specify a log file that doesn’t exist, it will be created for you.

  4. Введите Откройте mail1.fabrikam.com 25 и нажмите клавишу ВВОД.Type open mail1.fabrikam.com 25 and then press ENTER.

  5. Введите EHLO contoso.com и нажмите клавишу ВВОД.Type EHLO contoso.com and then press ENTER.

  6. Введите FROM:chris@contoso.com почты и нажмите клавишу ВВОД.Type **MAIL FROM:chris@contoso.com** and then press ENTER.

  7. Тип уведомления TO:kate@fabrikam.com RCPT = успешно, сбоя и нажмите клавишу ВВОД. Необязательная команда УВЕДОМЛЯТЬ определяет определенного доставки уведомлений о Доставке сообщения о состоянии, предоставляемых на целевой сервер SMTP для отправителя. Уведомления о Доставке сообщений определены в документе RFC 1891. В этом случае запрашивается уведомления о Доставке для доставки сообщений успешные и неудачные.Type RCPT TO:kate@fabrikam.com NOTIFY=success,failure and then press ENTER. The optional NOTIFY command defines the particular delivery status notification (DSN) messages that the destination SMTP server must provide to the sender. DSN messages are defined in RFC 1891. In this case, you’re requesting a DSN message for successful or failed message delivery.

  8. Введите данные и нажмите клавишу ВВОД. Вы получите ответ следующего вида:Type DATA and then press ENTER. You will receive a response that resembles the following:

    354 Start mail input; end with <CLRF>.<CLRF> 
  9. Тип Тема: теста из Contoso и нажмите клавишу ВВОД.Type Subject: Test from Contoso and then press ENTER.

  10. Нажмите клавишу ВВОД. RFC 2822 требует пустую строку между Subject: поле заголовка и текста сообщения.Press ENTER. RFC 2822 requires a blank line between the Subject: header field and the message body.

  11. Введите это тестовое сообщение и нажмите клавишу ВВОД.Type This is a test message and then press ENTER.

  12. Нажмите клавишу ВВОД, введите точку ( **** .) и нажмите клавишу ВВОД. Вы получите ответ следующего вида:Press ENTER, type a period ( . ) and then press ENTER. You will receive a response that resembles the following:

    250 2.6.0 <GUID> Queued mail for delivery 
  13. Чтобы отключиться от на целевой сервер SMTP, введите QUIT и нажмите клавишу ВВОД. Вы получите ответ следующего вида:To disconnect from the destination SMTP server, type QUIT and then press ENTER. You will receive a response that resembles the following:

    221 2.0.0 Service closing transmission channel 
  14. Чтобы закрыть сеанс Telnet, введите команду quit и нажмите клавишу ВВОД.To close the Telnet session, type quit and then press ENTER.

Действие 4. Оценка результатов сеанса Telnet.Step 4: Evaluate the Results of the Telnet Session

В этом разделе приведены подробные сведения о возможных откликах на команды, введенные в предыдущем примере.This section provides information about responses that may be provided to the following commands, which were used in the previous example:

  • Open mail1.fabrikam.com 25Open mail1.fabrikam.com 25

  • EHLO contoso.comEHLO contoso.com

  • MAIL FROM:chris@contoso.comMAIL FROM:chris@contoso.com

  • RCPT TO:kate@fabrikam.com NOTIFY=success,failureRCPT TO:kate@fabrikam.com NOTIFY=success,failure

Open mail1.fabrikam.com 25Open mail1.fabrikam.com 25

Успешного ответа 220 mail1.fabrikam.com Microsoft ESMTP MAIL Service ready at <day-date-time>Successful Response 220 mail1.fabrikam.com Microsoft ESMTP MAIL Service ready at <day-date-time>

Сбой ответа Connecting to mail1.fabrikam.com...Could not open connection to the host, on port 25: Connect failedFailure Response Connecting to mail1.fabrikam.com...Could not open connection to the host, on port 25: Connect failed

Возможные причины сбояPossible Reasons for Failure

  • SMTP-служба назначения недоступна.The destination SMTP service is unavailable.

  • На брандмауэре назначения установлены ограничения.There are restrictions on the destination firewall.

  • На брандмауэре источника установлены ограничения.There are restrictions on the source firewall.

  • Указано неверное полное доменное имя или IP-адрес для SMTP-сервера назначения.An incorrect FQDN or IP address for the destination SMTP server was specified.

  • Указан неверный номер порта.An incorrect port number was specified.

EHLO contoso.comEHLO contoso.com

Успешного ответа 250 mail1.fabrikam.com Hello [<sourceIPaddress>]Successful Response 250 mail1.fabrikam.com Hello [<sourceIPaddress>]

Сбой ответа 501 5.5.4 Invalid domain nameFailure Response 501 5.5.4 Invalid domain name

Возможные причины сбоя   В имени домена содержатся недопустимые знаки. Кроме того, на SMTP-сервере назначения установлены ограничения на подключение.Possible Reasons for Failure There are invalid characters in the domain name. Alternatively, there are connection restrictions on the destination SMTP server.

MAIL FROM:chris@contoso.comMAIL FROM:chris@contoso.com

Успешного ответа 250 2.1.0 Sender OKSuccessful Response 250 2.1.0 Sender OK

Сбой ответа 550 5.1.7 Invalid addressFailure Response 550 5.1.7 Invalid address

Возможные причины сбоя Имеется синтаксическая ошибка в поле адрес электронной почты отправителя.Possible Reasons for Failure There is a syntax error in the sender’s e-mail address.

Сбой ответа 530 5.7.1 Client was not authenticatedFailure Response 530 5.7.1 Client was not authenticated

Возможные причины сбоя   Сервер назначения не принимает анонимную отправку сообщений. Эта ошибка возникает при попытке использовать Telnet для отправки сообщения напрямую на транспортный сервер-концентратор.Possible Reasons for Failure The destination server does not accept anonymous message submissions. You receive this error if you try to use Telnet to submit a message directly to a Hub Transport server.

technet.microsoft.com

Список команд протокола SMTP  

Команды представляют собой текстовые строки, завершающиеся последовательностью. Команда, как таковая, представляет собой строку букв (обычно это 4 буквы), завершаемую пробелом (при наличии параметров) или. Получателям SMTP рекомендуют быть терпимыми к пробелам перед завершающей последовательностью.

Список команд протокола SMTP:

Команды прямо указанные в RFC 5321:

 

  • EHLO(или стандартное — HELO) Открывает приглашение от клиента. Эти команды используются для представления SMTP-клиента серверу SMTP. Поле аргументов содержит полное доменное имя клиента SMTP, если такое имя доступно. В тех случаях, когда клиент SMTP не имеет значимого доменного имени (например, при динамическом выделении адресов и недоступности обратного преобразования), клиентам следует передавать полный адрес. Хотя сервера должны давать отклик на обе эти команды лучше использовать команду EHLO, так как сервера не поддерживающие расширенные службы SMTP всегда возвращают сообщение об ошибке в ответ на EHLO.

                 Пример:
                 HELO orsi1.rsmc.ru

  • MAIL — Определяет отправителя сообщения. Поле аргументов содержит обратный путь и может включать дополнительные параметры. Собственно этой командой задаётся отправитель письма (MAIL FROM)

                Пример:
                MAIL FROM:<orsi1@rsmc.ru>

  • RCPT — Определяет получателей сообщения. Одно и то же сообщение могут получать несколько пользователей. Обычно каждый получатель указывается отдельной строкой с командой RCPT.

               Пример:
               RCPT TO: root@kyrych.ru

  • DATA — Определяет начало сообщения. Не поддерживает параметров. После обработки команд MAIL и RCPT команда DATA используется для передачи информационной части сообщения. Все, что следует за этой командой, интерпретируется как сообщение для передачи. Вот оно, наше письмо! 

              Пример:
              DATA

  • RSET — Сброс SMTP-соединения па. Не поддерживает параметров. Возвращает сеанс к моменту после ввода команды HELO (EHLO) при этом все ранее посланные команды MAIL, RCPT и DATA считаются аннулированными.
  • VRFY — Проверяет имя пользователя системы. Если на почтовом сервере имеется локальный пользователь с заданным именем, то сервер вернет его полный почтовый адрес. Если такого локального пользователя нет то вернется сообщение об ошибке, либо сообщение о том что сервер будет пересылать письма дальше. В случае имени заданного в примере мы скорее всего получим сообщение об ошибке.

             Пример:
             VRFY kyrych

  • EXPN — Запрашивает список рассылки и почтовых псевдонимов.

            Пример:
            EXPN mail-list

  • HELP — Запрашивает список команд поддерживаемых сервером. Если указать в качестве параметра имя команды, то сервер возвращает справку по синтаксису данной командыю

            Пример:
            HELP VRFY

  • NOOP — No operation — Ничего не делать.

            Пример:
            NOOP

  • QUIT — Закончить сеанс SMTP. Не поддерживает параметров.

           Пример:
           QUIT

Прочие команды:

  • SEND — Посылает сообщение на терминал зарегистрированного пользователя. Эта команда выполняется, только если пользователь находится в системе, и обычно выглядит как всплывающее сообщение. Не самая популярная команда.
  • SOML — Если получатели сообщения подключены к системе, то SOML работает как команда SEND. Если не подключен, то как команда MAIL. Из-за небезопасности этой команды её редко реализуют на сервере.
  • SAML — передает сообщение на терминал пользователя, если он находится в системе и одновременно кладет это сообщение в его почтовый ящик.
  • TURN — Реверс ролей в SMTP (клиент становится сервером). Обычно протоколом SMTP предусмотрена пересылка сообщений только в одном направлении через одно TCP-соединение. Назначение команды TURN заключается в организации двустороннего обмена почтовыми сообщениями между двумя компьютерами по имеющемуся TCP-соединению. Из за популярности этой команды у злоумышленников её реализацию не часто можно встретить на сервере.
  • AUTH — Показывает серверу механизм аутентификации. RFC 4954 (заменил RFC 2554).
  • Вперёд

kyrych.ru

Примеры авторизации и используемый формат

LOGIN

Протокол SMTP

$ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server 

EHLO client.server.net

250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS 

AUTH LOGIN

334 VXNlcm5hbWU6 

dGVzdA==

334 UGFzc3dvcmQ6 

dGVzdHBhc3M=

235 2.7.0 Authentication successful 

QUIT

221 2.0.0 Bye 

Где ‘dGVzdA== ‘ — логин и ‘dGVzdHBhc3M=’ пароль в формате base64. О нем чуть ниже. Обратите внимание, что и логин и пароль должны кодироваться без перевода строки.

PLAIN

Протокол SMTP

$ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server 

EHLO client.server.net

250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS 

AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz

235 2.7.0 Authentication successful 

QUIT

221 2.0.0 Bye 

Где ‘dGVzdAB0ZXN0AHRlc3RwYXNz’ это логинпароль в base64 формате. Чуть ниже будут рассмотрены варианты конвертации в base64 формат и обратно.

CRAM-MD5

В отличии от предыдущих способов авторизации CRAM-MD5 пароль не передается в открытом виде, вместо этого используется сравнение хэшей. Ручная проверка этого способа авторизации может быть проблемой, так как нужно будет выполнить несколько преобразований, а время на введение команд ограничено. Для упрощения процесса ниже приведен простой perl скрипт, который принимает на вход имя пользователя, пароль и «кодовое слово» (выдаваемое сервером), и конвертирует их в строку в base64 формате.

Для скрипта понадобится дополнительный модуль perl «Digest-HMAC». В Debian/Ubuntu его можно найти и установить следующим образом:

# apt-cache search perl | grep -i digest # apt-get install libdigest-hmac-perl 

Для RHEL/CentOS/Fedora:

# yum search perl | grep -i digest # yum install perl-Digest-HMAC 

В тех дистрибутивах, в чьих репозиториях нет этого пакета (что маловероятно), можно использовать установку модуля из CPAN.

Скрипт и пример сессии с его использованием:

#!/usr/bin/perl -W  use strict; use MIME::Base64 qw(encode_base64 decode_base64); use Digest::HMAC_MD5;  die "Usage: $0 username password ticketn" unless $#ARGV == 2;  my ($username, $password, $ticket64) = @ARGV;  my $ticket = decode_base64($ticket64) or die ("Unable to decode Base64 encoded string '$ticket64'n"); my $password_md5 = Digest::HMAC_MD5::hmac_md5_hex($ticket, $password); print encode_base64 ("$username $password_md5", ""); 
Протокол SMTP

$ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server 

EHLO client.server.net

250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS 

AUTH CRAM-MD5

## кодовое слово, выдаваемое сервером: PDMzMjE2NDkzMTA1OTExNDQuMTQxNDc5NTExOUBtYWlsLnNlcnZlci5uZXQ+ 

dGVzdCAxNTU0YTQwNzA1NTgxZjUwZmI1MmNjZDhlZDhjM2EyYg==

235 2.7.0 Authentication successful 

QUIT

221 2.0.0 Bye   # ./md5cram.pl test testpass PDMzMjE2NDkzMTA1OTExNDQuMTQxNDc5NTExOUBtYWlsLnNlcnZlci5uZXQ+ dGVzdCAxNTU0YTQwNzA1NTgxZjUwZmI1MmNjZDhlZDhjM2EyYg== 
Протокол IMAP

$ telnet 127.0.0.1 143 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready. 

01 AUTHENTICATE CRAM-MD5

+ PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ+ 

dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ==

01 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS XEXEC QUOTA] Logged in 

02 LOGOUT

* BYE Logging out 02 OK Logout completed. Connection closed by foreign host.  # ./md5cram.pl test testpass PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ+ dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ== 

Cпособы конвертации текста в и из base64

Авторизация предполагает обмен строками, закодированными в base64. Для Linux cуществует много утилит для конвертации в base64 и обратно. Мы укажем несколько, включая способ их запуска. Для Windows можно использовать кроссплатформенные perl, python, php, по ним также будут привидены примеры.

Утилита (пакет)

base64 (coreutils)

$ printf 'testtesttestpass' | base64 dGVzdAB0ZXN0AHRlc3RwYXNz  $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | base64 -d testtesttestpass 

uueencode/uudecode (sharutils)

$ printf 'testtesttestpass' | uuencode -m - begin-base64 644 - dGVzdAB0ZXN0AHRlc3RwYXNz ==== 

Чтобы раскодировать, потребуется добавить первую и последнюю строку. Это можно сделать, например, следующими способами;

printf 'begin-base64 644 -ndGVzdAB0ZXN0AHRlc3RwYXNzn====' | uudecode 

или

$ uudecode<<EOF begin-base64 644 - dGVzdAB0ZXN0AHRlc3RwYXNz ==== EOF 

mmencode (xemacs21-bin)

$ printf 'testtesttestpass' | mmencode dGVzdAB0ZXN0AHRlc3RwYXNz  $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | mmencode -u testtesttestpass 

python (python)

$ printf 'testtesttestpass' | python -m base64 dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | python -m base64 -d 

php (php-cli)

$ printf 'testtesttestpass' | php -r 'echo base64_encode(fgets(STDIN));' dGVzdAB0ZXN0AHRlc3RwYXNz $ php -r 'echo base64_decode($argv[1]);' dGVzdAB0ZXN0AHRlc3RwYXNz testtesttestpass 

perl (perl)

Модуль MMIME::Base64 стандартно идет в комплекте.

$ perl -MMIME::Base64 -e 'print encode_base64("testtesttestpass")' dGVzdAB0ZXN0AHRlc3RwYXNz $ perl -MMIME::Base64 -e 'print decode_base64("dGVzdAB0ZXN0AHRlc3RwYXNz")' testtesttestpass 

openssl (openssl)

$ printf 'testtesttestpass' | openssl base64 dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | openssl base64 -d testtesttestpass 

Для шифрования трафика в почтовых протоколах между клиентом и сервером используется SSL/TLS в двух вариантах. Использование специальных портов, при соединении с которым сначала осуществляется установка SSL/TLS, после чего уже поверх него идет обычный почтовый трафик. Этот метод, кстати, признан устаревшим (deprecated), относительно SMTP точно. Второй вариант, более предпочтительный — соединение с обычным портом для сервиса и переход сессии в зашифрованный вид с использованием расширения STARTTLS.

Для проверки работы почтового сервера поверх SSL/TLS можно использовать утилиту openssl, дальше действуя, как при обычной сессии через telnet.

SMTP

$ openssl s_client -starttls smtp -crlf -connect mail.truevds.ru:25 $ openssl s_client -starttls smtp -crlf -connect mail.truevds.ru:587 $ openssl s_client -crlf -connect mail.truevds.ru:465 

POP3

$ openssl s_client -connect mail.truevds.ru:995 $ openssl s_client -starttls pop3 -crlf -connect mail.truevds.ru:110 

IMAP

$ openssl s_client -crlf -connect mail.truevds.ru:993 $ openssl s_client -starttls imap -crlf -connect mail.truevds.ru:143 

Можно явным образом указать, что использовать для шифрования, ssl3 или tls1, а также конкретные алгоритмы:

$ openssl s_client -ssl3 -starttls smtp -crlf -connect mail.truevds.ru:25 

Посмотреть перечень поддерживаемых протоколов в вашей версии openssl:

$ openssl ciphers -ssl3 $ openssl ciphers -tls1 

Ниже, в главе про tshark, эта возможность будет использована в практических целях.

При необходимости более сложной диагностики в том случае, когда журналы не дают достаточно информации о проблемах в работе сервера или клиента, можно использовать tcpdump/wireshark для анализа непосредственно самой сессии между клиентом и сервером. Как в реальном времени, так и сохранив дамп сессии для последующего анализа. Для быстрого анализа удобно использовать консольный вариант wireshark — tshark. Для его работы потребуются права root.

Tshark предоставляет информацию в понятном виде и в использовании довольно прост.

SMTP

# tshark -i eth0 -f "port 25" -R smtp 

IMAP

# tshark -i eth0 -f "port 143" -R imap 

POP3

# tshark -i eth0 -f "port 110" -R pop 

Запись трафика для последующего анализа при помощи утилит tcpdump|dumpcap (из состава wireshark):

# tcpdump -s0 -nn -i eth0 -w smtps.pcap port 465 and host HOSTIP # dumpcap -s0 -i eth0 -w smtp.pcap -f 'port 25 and host HOSTIP' 

где HOSTIP является IP-адресом противоположной стороны, сервера или клиента, сессию с которым мы анализируем. И последующее чтение:

# tshark -n -r smtp.pcap -R smtp 

Во многих случаях в почтовых протоколах активно используется шифрование и таким способом сессию уже не посмотреть. Тем не менее, этот вопрос в целом также решаем. tshark может дешифровать SSL/TLS трафик «со стороны сервера» при наличии доступа к приватному ключу сервера (для клиента есть вариант с использованием Master-Key, подробнее wiki.wireshark.org/SSL). К счастью или к сожалению, wireshark с приватным ключем может дешифровать не все использвуемые алгоритмы. Например DHE-* EXP-*,EDH-* не работают. Возможно, какие-то из этих алгоритмов добавлены в более поздних версиях программы.

В процессе тестирования использовалась утилита openssl с явным указанием при соединении с конкретных алгоритмов. Проверенные варианты, с которыми дешифровка трафика прошла успешно:

  • ssl3: RC4-SHA, RC4-MD5, DES-CBC-SHA, AES128-SHA
  • tls1: RC4-MD5, AES256-SHA, DES-CBC-SHA, DES-CBC3-SHA

Посмотреть перечень поддерживаемых протоколов в вашей версии openssl:

# openssl ciphers -ssl3 # openssl ciphers -tls1 

Для анализа реальной сессии можно отключить в конфигурации почтового сервера (только на время тестирования!) всех алгоритмов, кроме заведомо рабочих.

Tshark запускается на сервере, там, где есть ключ, а клиент openssl на локальном компьютере. Но, это, конечно, необязательно, вполне можно tshark запускать на клиенте в другой консоли, просто это потребует копирования приватного ключа на локальный компьютер. А openssl можно запускать в screen в соседнем с tshark окне.

Итак запускаем:

# tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key" -R smtp $ printf "EHLO RC4-MD5nEXIT" | openssl s_client -starttls smtp -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:25  # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,465,smtp,/etc/pki/tls/private/server.key" -R smtp $ printf "EHLO RC4-MD5nEXIT" | openssl s_client -ssl3 -cipher RC4-SHA -connect mail.truevds.ru:465  # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,143,imap,/etc/pki/tls/private/server.key" -R imap $ printf "* CAPABILITYnLOGOUT" | openssl s_client -starttls imap -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:143  # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,993,imap,/etc/pki/tls/private/server.key" -R imap $ printf "* CAPABILITYnLOGOUT" | openssl s_client -crlf -ssl3 -cipher RC4-MD5 -connect mail.truevds.ru:993  # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,110,pop,/etc/pki/tls/private/server.key" -R pop $ printf "USER RC4-MD5nEXIT" | openssl s_client -starttls pop -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:110  # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,995,pop,/etc/pki/tls/private/server.key" -R pop $ printf "USER RC4-MD5nEXIT" | openssl s_client -crlf -ssl3 -cipher RC4-MD5 -connect mail.truevds.ru:995 

Здесь 94.127.66.53 — ip адрес сервера, с которым соединяется клиент, /etc/pki/tls/private/server.key — путь до приватного ключа сервера. Приватный ключ, как правило, размещается в /etc/pki или /etc/ssl, в зависимости от сервера. Эту информацию можно посмотреть в настройках самого почтового сервера.

Пример для postfix:

$ grep key_file /etc/postfix/main.cf smtpd_tls_key_file = /etc/pki/tls/private/server.key smtp_tls_key_file = /etc/pki/tls/private/server.key 

Для портов, где используется starttls вместо порта в официальной документации рекомендуется использовать start_tls. Например, ssl.keys_list:94.127.66.53,start_tls,smtp,/etc/pki/tls/private/server.key вместо ssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key. Но у меня этот вариант не сработал, показывался трафик только до инициализации шифрования.

Для отладки процесса SSL/TLS дешифровки используется опция -o "ssl.debug_file: /tmp/debug.log"

Пример вывода дешифрованного трафика:

# tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key" -R "smtp"  Running as user "root" and group "root". This could be dangerous. Capturing on eth0 0.178964 94.127.66.21 -> 94.127.66.53 SMTP C: EHLO RC4-MD5 | EXIT 0.179357 94.127.66.53 -> 94.127.66.21 SMTP 250-mail.truevds.ru | 250-PIPELINING | 250-SIZE 104857600 | 250-ETRN |  

habr.com

Введение

Основная задача протокола SMTP (Simple Mail Transfer Protocol) заключается в том, чтобы обеспечивать передачу электронных сообщений (почту). Для работы через протокол SMTP клиент создаёт TCP соединение с сервером через порт 25. Затем клиент и SMTP сервер обмениваются информацией пока соединение не будет закрыто или прервано. Основной процедурой в SMTP является передача почты (Mail Procedure). Далее идут процедуры форвардинга почты (Mail Forwarding), проверка имён почтового ящика и вывод списков почтовых групп. Самой первой процедурой является открытие канала передачи, а последней — его закрытие.

Команды SMTP указывают серверу, какую операцию хочет произвести клиент. Команды состоят из ключевых слов, за которыми следует один или более параметров. Ключевое слово состот из 4-х символов и разделено от аргумента одним или несколькими пробелами. Каждая командная строка заканчивается символами CRLF. Вот синтаксис всех команд протокола SMTP (SP — пробел):

  HELO <SP> <domain> <CRLF>  MAIL <SP> FROM:<reverse-path> <CRLF>   RCPT <SP> TO:<forward-path> <CRLF>   DATA <CRLF>  RSET <CRLF>   SEND <SP> FROM:<reverse-path> <CRLF>   SOML <SP> FROM:<reverse-path> <CRLF>   SAML <SP> FROM:<reverse-path> <CRLF>   VRFY <SP> <string> <CRLF>   EXPN <SP> <string> <CRLF>   HELP <SP> <string> <CRLF>   NOOP <CRLF>   QUIT <CRLF>  

Обычный ответ SMTP сервера состоит из номера ответа, за которым через пробел следует дополнительный текст. Номер ответа служит индикатором состояния сервера.

Отправка почты

Первым делом подключаемся к SMTP серверу через порт 25. Теперь надо передать серверу команду HELLO и наш IP адрес:

  C: HELLO 195.161.101.33  S: 250 smtp.mail.ru is ready   

При отправке почты передаём некоторые нужные данные (отправитель, получатель и само письмо):

  C: MAIL FROM:<drozd> 'указываем отправителя  S: 250 OK    C: RCPT TO:<drol@mail.ru> 'указываем получателя  S: 250 OK  

указываем серверу, что будем передавать содержание письма (заголовок и тело письма)

  C: DATA   S: 354 Start mail input; end with <CRLF>.<CRLF>   

передачу письма необходимо завершить символами CRLF.CRLF

  S: 250 OK     C: From: Drozd <drozd@mail.ru>   C: To: Drol <drol@mail.ru>  C: Subject: Hello   

между заголовком письма и его текстом не одна пара CRLF, а две.

  C: Hello Drol!  C: You will be die on next week!  

заканчиваем передачу символами CRLF.CRLF

  S: 250 OK  

Теперь завершаем работу, отправляем команду QUIT:

  S: QUIT  C: 221 smtp.mail.ru is closing transmission channel  

> Другие команды

  • SEND — используется вместо команды MAIL и указыает, что почта должна быть доставлена на терминал пользователя.
  • SOML, SAML — комбинации команд SEND или MAIL, SEND и MAIL соответственно.
  • RSET — указвает серверу прервать выполнение текущего процесса. Все сохранённые данные (отправитель, получатель и др) удаляются. Сервер должен отправить положительный ответ.
  • VRFY — просит сервер проверить, является ли переданный аргумент именем пользователя. В случае успеха сервер возвращает полное имя пользователя.
  • EXPN — просит сервер подтвердить, что переданный аргумент — это список почтовой группы, и если так, то сервер выводит членов этой группы.
  • HELP — запрашивает у сервера полезную помощь о переданной в качестве аргумента команде.
  • NOOP — на вызов этой команды сервер должен положительно ответить. NOOP ничего не делает и никак не влияет на указанные до этого данные.
Комментарий:
 

www.codenet.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.