Самым распространенным протоколом для передачи e-mail сообщений, является SMTP. Список основных команд SMTP, необходимых при создании программы клиента, приведен в табл. 5.1.

Это далеко не все доступные команды (см. соответствующий RFC), но их достаточно для реализации программы отправки e-mail сообщений.

Таблица 5.1. Основные команды протокола SMTP

Команда

.Описание

НЕЮ

Идентификация на SMTP-сервере. После команды HELO указывают имя

локального компьютера

MAIL

Начало передачи сообщения. Чаще всего эта команда выглядит как MAIL FROM

<e@mail.ru>?, где e@mail.ru - это адрес отправителя

RCPT

Идентификация получателя сообщения

DATA

Начало тела сообщения. Передача данных завершается последовательностью

символов <CRxLF>.<CRxLF>
RS ET

Отмена выполнения текущей операции

NOOP

На этот запрос сервер ответит сообщением ОК. Это необходимо для проверки

связи или продления времени сеанса. Если в течение определенного времени не

производить обмен сообщениями с сервером, то сервер может разорвать

соединение. С помощью этой команды можно показать активность, и сервер

сбросит счетчик timeout, таким образом, время простоя начнет считаться заново

QUIT

Выход

HELP

Позволяет получить справку о доступных командах

Первые три команды являются обязательными, но для отправки e-mail нужна команда DATA, где будет храниться текст сообщения.

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

Листинг 5.3. Снимок журнала выполнения

<220 smtp.aaanet.ru ESMTP Exim 4.30 Wed. 14 Jul 2004 15:20:17 +0400 >HEL0 notebook
<250 smtp.aaanet.ru Hello notebook [80.80 99.95] >MAIL FROM: <vasya@pupkin.ru> <250 OK
>RCPT TO: <horrific@vr-online.ru>
<250 Accepted
>DATA
<354 Enter message, ending with " "
on a line by itself >From: <vasya@pupkm ru> >To: <horrific@vr-online.ru>

Листинг 5.3 (продолжение) >Mime-Version: 1.0

>Content-Type: text/plain;
charset="us-ascii
>mmMessage
>Test mesage
>
<250 OK id=lBkhoA-000EkB-0S >QUIT
<221 smtp.aaanet.ru closing connection

Если в начале строки стоит знак <, то текст этой строки пришел с сервера, а если >, то текст был отправлен на сервер. Эти символы добавлены программой для лучшего понимания того, откуда появились команды.

Сразу после соединения с сервером он "здоровается" с нами сообщением, начинающимся с числа 220. После этого числа могут быть названия сервера, домена и другая информация. Получив это сообщение, мы видим, что сервер готов к приему команд.

Теперь я должен "поздороваться" с сервером и сообщить ему свое имя. Это происходит командой НЕЮ notebook. В данном случае notebook - это имя моего компьютера На приветствие сервер отвечает своим сообщением с кодом 250 и адресом.

Далее отправляем адрес отправителя (MAIL FROM: <vasya@pupkin.ru>) и адрес получателя (RCPT ТО: <horri f і c@vr - onl і ne. ru>). На обе команды сервер должен ответить сообщениями с кодом 250.

Теперь посылаем команду DATA. После этого начинается тело письма, в котором сначала идет заголовок, а потом уже текст сообщения. На все отправляемые теперь данные сервер не будет отвечать, поэтому можно не дожидаться ответа.

В заголовке мы снова указываем адресата и получателя в следующем виде:

From: <vasya@pupkin.ru> То: <horrific@vr-on1ine.ru>

Если письмо должно иметь тему, то нужно переслать следующий текст: Subject: Текст темы письма

Далее указывается кодировка текста сообщения. В данном случае мы это делаем при помощи таких записей:

>Mime-Version: 1.0
>Content-Type: text/plain: charset="us-ascii

Теперь можно построчно передавать текст сообщения. Тело письма завершается командой <RxLF>.<CRxLF> (конец строки #13, перевод каретки #10, точка, конец строки #13, перевод каретки). Сервер должен нам ответить сообщением с кодом 250

На этом передача данных завершена и можно выходить из системы командой QUIT.

Для тестирования всего вышесказанного можно воспользоваться Telnet-клиентом. С помощью него надо подключится на 25 порт SMTP-сервера и выполнить нужные команды. Диалоговое окно Telnet-клиента программы CyD Net Utils, в которой я выполнил несколько SMTP-команд, представлено на рис. 5.4.

5.2.1. Описание RFC-821

Рис. 5.4. Отправка сообщения через Telnet-клиента

Чтобы отправить последовательность завершения данных (<CR><LF>. <CR><LF>), нужно нажать Enter, потом точку и снова Enter.

Коды сообщений, которые мы можем получить от сервера, приведены в табл. 5.2.

Таблица 5.2. Коды сообщений, передаваемых сервером

Код

Описание

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

Помощь

Служба готова к работе

Завершение работы

Последняя операция выполнена успешно

Данный адресат не является местным, и будет использована переадресация

Начало тела сообщения, которое должно заканчиваться последовательностью

<СЯ><и.Р>.<Ск.><и=>

Служба недоступна, соединение закрывается

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

Запрошенная команда не выполнена, произошла локальная ошибка при выполнении

Команда не выполнена из-за нехватки системных ресурсов

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

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

Команда не поддерживается сервером

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

Данная команда должна быть без аргументов

продолжение &

Таблица 5.2 (продолжение)

Код

Описание

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

Данный адресат не является местным, и будет использована переадресация

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

Команда не выполнена, потому что указано недопустимое имя ящика

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

Коды необходимо проверять для контроля правильности выполнения наших команд. Например, если сервер ответил сообщением, в котором первые три цифры равны числу 451, то команда не выполнена. Надо повторить попытку снова или выйти, потому что письмо может быть уже не отправлено

С большинством из этих ошибок вы никогда не столкнетесь, потому что они устарели и использовались для обмена сообщениями между терминалами, когда службы e-mail были более простыми

5.2. SMTP-клиент на WinSock API || Оглавление || 5.2.2. Реализация SMTP-клиента


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс