Почтовая кухня #2: SMTP

    SMTP (англ. Simple Mail Transfer Protocol — простой протокол передачи электронной почты) — это сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.
    ESMTP (англ. Extended SMTP) — масштабируемое расширение протокола SMTP. В настоящее время под «протоколом SMTP», как правило, подразумевают ESMTP и его расширения.

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

    Для работы по этому протоколу нужно соединиться с почтовым сервером по определенному порту и отправить некоторую последовательность ESMTP команд.
    Команда представляет из себя строку вида
    КОМАНДА[пробел]параметр(опционально)
    В ответ на команду сервер возвращает строку вида
    XXX[пробел]доп. информация
    При этом XXX число в ответе сервера обозначает:
    2ХХ — команда успешно выполнена
    3XX — ожидаются дополнительные данные от клиента
    4ХХ — временная ошибка, клиент должен произвести следующую попытку через некоторое время
    5ХХ — неустранимая ошибка

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

    Для нашего эксперимента буду использовать почтовый сервер яндекса. Подразумевается, что уже есть там аккаунт…
    Сразу предупреждаю, что после соединения все команды нужно вводить максимально быстро, т.к. при задержке около 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] #Приветствуем сервер и отсылаем ему наш внешний IP (IP не обязательно отсылать, можно обойтись просто EHLO, но сервер скорее всего на это ругнется)
    UPD: Желательно отправлять даже не IP а доменное имя для этого IP вродеEHLO you.provider.domain без квадратных скобок
    Ответ:
    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 пароль и логин от вашей почты. Можно это сделать, например, здесь seriyps.ru/crypt или командой в Linux echo [ваш пароль/логин] | base64

    AUTH LOGIN # Сообщаем серверу о намерении пройти авторизацию
    Ответ:
    334 VXNlcm5hbWU6
    Этот самый VXNlcm5hbWU6 — закодированное в base64 слово “Username:”, а номер ответа 3ХХ означает, что сервер ждет от нас дополнительной информации. Не будем его огорчать:

    ВАШ_ЛОГИН_ПОЧТЫ_В_BASE_64 #Отправляем ваш логин почты в base64, например dmFzaWFwdXBraW4=
    Ответ:
    334 UGFzc3dvcmQ6
    Это, как можно догадаться, “Password:” в base64

    ВАШ_ПАРОЛЬ_ПОЧТЫ_В_BASE_64 # Отправляем пароль почты в base64, например MTIzNDU2
    Ответ:
    235 Authentication successful.
    т.е. авторизация прошла успешно. Теперь можно отправлять e-mail)

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

    Электронное письмо состоит из следующих частей:
    • Заголовков SMTP-протокола (то, что мы вводим при MAIL FROM: и RCPT TO: плюс некоторая служебная информация)
    • Заголовков письма. (отправитель, обратный адрес, адресат, отметки о спам-проверках, тема письма, MIME-тип, кодировка и т.п.)
    • Тела письма. (отделяется от заголовков пустой строкой, обычный ASCII текст либо соответствующий mime типу набор данных)

    Начинаем вводить заголовки письма. Можно вставить и файл, закодированный в 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 например… Что поделать — протоколу уже почти 30 лет. Хотя это не очень-то сложно вычислить…)

    Два раза Энтер, затем вводим сам текст письма.
    Hello, Billy! You'll die tomorrow!
    Энтер. Энтер # Сообщаем, что закончили передачу сообщения
    Ответ:
    250 2.0.0 accepted; S10436885AbZBBKvs
    Т.е. сообщение принято для передачи

    Теперь можно отправить еще какое-нибудь письмо (MAIL FROM: RCPT TO:) или завершить сеанс работы
    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


    Конечно, здесь не приведена информация по отправке почты в кодировках текста, отличных от ASCII, не написано про вложенные файлы и MIME но если вам нужны подробности, вот несколько ссылок:
    Электронная_почта Wiki
    SMTP Wiki
    MIME Wiki
    rfc5321

    При разработке приложений непосредственно с SMTP обычно работать не приходится, для этого используют различные фреймворки или стандартные функции. Для PHP можно посмотреть:
    SMTP PEAR расширение
    PHPMailer библиотека для работы с электронной почной

    Удачных экспериментов!
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 21

      0
      ESMTP и другие, вроде HTTP и FTP слишком просты, чтобы про них было интересно читать — мало кто узнает что-то новое, вот про XMPP, BitTorent и SIP были бы куда интереснее.
        +3
        А я бы с удовольствием прочитал бы про HTTP и FTP.
          +1
          Подобных этой статье описаний этих протоколов великое множество, я уверен; вы можете почитать о них уже сейчас. Сравните хоть описания XMPP и HTTP на википедии. О старых, мегапопулярных и устоявшихся протоколах информации с избытком, о XMPP — только популистское описание возможностей, без описания работы самого протокола.
            0
            Спасибо, почитаем.
            Однако, взгляд автора данного топика может открыть некоторые завесы тайны для новичков :)
              0
              На самом деле HTTP и FTP безумно просты… По сути работы они мало чем отличаются от описанного почтового протокола — те же заголовки, ответы в виде числа и доп информации. Там маловато интересностей. Телнет в руки и можно из консоли получить с сервера HTTP страницу или залить на FTP файл.
        0
        дело нужное и интересное.
        жду статьи про imap и xmpp.
          0
          не верю я, что автор опуса постигнет xmpp, если он в основах smtp ошибки допускает
            0
            Ну, если учесть, что сейчас участвую в разработке Jabber-бота, то всякое может быть…
              0
              Тогда другое дело ;)
          0
          Всегда интересно узнавать то, как работают вещи, которыми пользуешься ежедневно. Спасибо! Особенно за ссылки в конце статьи.

          Кстати, у вас опечатка

          !!!EHLO!!! 91.198.212.5 #Приветствуем сервер и отсылаем ему наш внешний IP (IP не обязательно отсылать, можно обойтись просто !!!EHLO!!!, но сервер скорее всего на это ругнется)
            0
            Нет, если вы пишете EHLO или HELO, дальше нужно писать ip-адрес в квадратных скобочках или доменное имя. Иначе нельзя.

            Можно вообще не писать EHLO или HELO, но не все серверы такое разрешают.
              +1
              Не)))
              Именно EHLO
              HELO было в SMTP а EHLO в ESMTP
              Кстати, там и правда недочет:
              Если вводится айпи то в таком виде
              EHLO [91.198.212.5]
              если доменный адрес, то в таком
              EHLO you.provider.domain
                0
                Это не опечатка. (:
                  0
                  где опечатка?
                  +1
                  Автор. Ну зачем вы вводите в заблуждение?

                  EHLO 91.198.212.5 — так делать нельзя — читайте стандарт (RFC 5321), если вы указываете IP-адрес — он должен быть заключен в квадратные скобочки:
                  EHLO [91.198.212.5]

                  0
                  Кстати, автор, и rfc у вас в статье указан устаревший… (obsoleted by rfc 5321)
                    0
                    Поправил
                    0
                    Я б с удовольствием почитал про RTSP/RTP/RTCP.
                      0
                      Могу добавить, что тот же mail.ru полгода назад работал по протоколу SMTP… авторазиция требовалась не для всех ящиков.
                        0
                        pop-befote-smtp, да?

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое