Скидки до 55% и 3 курса в подарок 0 дней 09 :23 :01 Выбрать курс
Код
#статьи

Что такое SMTP-протокол и как он отправляет электронные письма

Вы пользуетесь им, когда нажимаете кнопку «Отправить».

Иллюстрация: Оля Ежак для Skillbox Media

Несмотря на популярность мессенджеров, люди по всему миру ежедневно отправляют миллиарды электронных писем. И в каждой такой отправке участвует протокол SMTP, который отвечает за передачу сообщений между почтовыми серверами. В статье мы разберём устройство этого протокола и попробуем с ним поработать. Материал подойдёт всем, кто недавно заинтересовался системным администрированием и хочет лучше понимать, как устроена электронная почта и сети в целом.

Содержание


Что такое протокол SMTP

Начнём с формального определения: SMTP — это стандартизированный сетевой протокол, который предназначен для отправки и маршрутизации электронных сообщений между почтовыми серверами и клиентами. Он определяет весь путь письма от отправителя до получателя — начиная с момента нажатия кнопки «Отправить» в почтовом клиенте и заканчивая доставкой сообщения на сервер адресата.

SMTP расшифровывается как Simple Mail Transfer Protocol — простой протокол передачи почты. И здесь важно понимать, что SMTP используется именно для отправки сообщений, а не для их получения. Это можно сравнить с обычной почтой: почтальон доставляет письмо в ящик получателя, но забрать и прочитать его должен сам адресат.

А вот для чтения писем применяются протоколы IMAP и POP. Когда вы открываете Gmail или «Яндекс Почту», почтовый клиент применяет один из этих протоколов, чтобы получить сообщения с сервера. IMAP (Internet Message Access Protocol) обеспечивает доступ к письмам на сервере и синхронизацию между устройствами, а POP (Post Office Protocol) позволяет загрузить письма из почтового ящика на ваше устройство. Подробнее о работе этих двух протоколов мы расскажем в другой раз.

Инфографика: pixelbazaar / SVG Repo / Skillbox Media

Насколько он безопасен

Протокол SMTP был представлен в начале 1980-х годов. Изначально это был простой текстовый протокол, по которому все данные передавались в открытом виде, без шифрования и защиты. Если пользователь вводил логин и пароль для аутентификации, то злоумышленники могли легко перехватить эти данные с помощью анализаторов сетевого трафика.

С ростом числа пользователей электронной почты SMTP неоднократно дорабатывался. Сегодня основные спецификации протокола описаны в двух основных документах: RFC 5321 и RFC 5322. RFC 5321 описывает технические аспекты работы SMTP: регулирует порядок установления соединения, набор команд и передачу сообщений между серверами. RFC 5322 стандартизирует сам формат письма — определяет структуру заголовков, организацию содержимого и другие элементы сообщения.

В 1995 году протокол получил расширение — ESMTP (Extended Simple Mail Transfer Protocol). Оно сохранило совместимость с базовым SMTP, добавило команды для взаимодействия клиентов и серверов, а также обеспечило поддержку передачи мультимедийных сообщений — с видео, вложениями и картинками. Кроме того, изменённая архитектура ESMTP позволила разработчикам добавлять новые механизмы безопасности.

Поэтому, в отличие от первых версий, современный SMTP работает в связке с целым набором технологий. Так, для защиты соединения применяется TLS-шифрование, которое предотвращает перехват содержимого писем. А для подтверждения подлинности отправителя и борьбы со спамом есть механизмы SMTP AUTH, SPF, DKIM и DMARC.

Как работает SMTP-протокол

Когда пользователь нажимает кнопку «Отправить», его почтовый клиент устанавливает соединение с заранее настроенным SMTP-сервером. С этого момента запускается процесс передачи письма, который включает несколько основных этапов: установку соединения, передачу данных, поиск сервера получателя и завершение сессии. Давайте их рассмотрим.

Установка SMTP-соединения. SMTP использует TCP в качестве транспортного протокола, поэтому в первую очередь он устанавливает TCP-соединение между почтовым клиентом и сервером. После этого клиент отправляет серверу специальную команду приветствия для начала обмена данными и определения поддерживаемых расширений.

Передача данных. После установления соединения клиент отправляет на сервер команды SMTP, в которых содержатся адреса отправителя и получателя, а также само содержимое письма. На стороне сервера этим процессом управляет MSA (mail submission agent) — программа, которая принимает входящее сообщение, проверяет его соответствие техническим стандартам и готовит к дальнейшей маршрутизации.

Поиск сервера получателя. На сервере работает другая программа — MTA (mail transfer agent). Она проверяет, принадлежат ли адреса отправителя и получателя одному домену — например, @skillbox.ru. Если оба адреса относятся к одному домену, то письмо доставляется напрямую внутри системы без обращения к внешним ресурсам.

Если домены различаются, сервер обращается к системе DNS, чтобы определить адрес сервера получателя для пересылки письма. После этого SMTP-сервер отправителя устанавливает соединение с SMTP-сервером получателя и передаёт сообщение по тому же алгоритму.

Закрытие соединения. После передачи данных клиент отправляет SMTP-серверу команду для завершения сессии. Сервер подтверждает получение этой команды, и после этого TCP-соединение закрывается.

Схема процесса отправки письма между разными почтовыми серверами отправителя и получателя
Инфографика: pixelbazaar / SVG Repo / Skillbox Media

Коды, ошибки и порты SMTP

Чтобы наладить взаимопонимание между почтовыми серверами, SMTP использует несколько служебных механизмов: команды для обмена информацией, коды ошибок для указания на проблемы и специальные порты для установления соединения. Разберём каждый из элементов подробнее.


Основные команды

Команды SMTP-протокола — это специальные инструкции, которые управляют передачей писем между клиентом и сервером. Их можно представить как диалог между почтовым клиентом и сервером:

  • HELO / EHLO (Hello). С этой команды начинается отправка письма. Почтовый клиент «представляется» серверу и сообщает своё доменное имя или IP-адрес. Сервер отправляет приветственное сообщение и подтверждает установку соединения.
  • MAIL FROM. После идентификации отправитель указывает адрес электронной почты, с которого отправляется сообщение. Эта команда означает начало новой транзакции. Сервер подтверждает свою готовность принять письмо кодом 250 OK.
  • RCPT TO (Recipient To). Следующий шаг — указание адресата письма. Если сообщение нужно доставить нескольким получателям, можно отправить несколько команд RCPT TO. После каждой такой команды сервер отвечает кодом 250 OK.
  • DATA. Эта команда запускает передачу содержимого письма. После неё сервер отвечает кодом 354 и готовится принять данные. Клиент передаёт текст письма, заголовки, вложения и завершает передачу точкой на отдельной строке. Сервер отвечает 250 OK.
  • QUIT. После отправки письма клиент использует эту команду для завершения соединения. Сервер отвечает кодом 221.
  • RSET (Reset). Эта команда используется для отмены текущей транзакции. Она не разрывает соединение, а просто сбрасывает состояние и удаляет все данные о письме и адресатах.

Схема взаимодействия почтового клиента и SMTP-сервера:

Инфографика: Skillbox Media

Коды ошибок

На схеме выше мы показали идеальный сценарий передачи с надёжным соединением. Однако в реальности письма могут отклоняться, блокироваться или сталкиваться с другими проблемами. Поэтому в случае любого сбоя принимающий сервер выдаёт SMTP-коды ошибок. Эти коды можно поделить на две группы: временные и постоянные.

Первая группа Persistent Transient Failure, или устойчивая временная ошибка. Такие коды начинаются с цифры 4, за которой следует ещё две цифры. Они обычно указывают на временные сбои на почтовом сервере. В некоторых случаях повторная отправка письма решает проблему. Однако часто серверы используют эти ошибки намеренно для задержки или фильтрации писем от подозрительных отправителей.

Например, SMTP-протокол на серверах «Яндекса» может выдать код 421. Это происходит, когда сервер не отвечает в течение установленного времени из-за повышенной нагрузки или других сетевых проблем:

smtp;421 4.4.2 mail.yandex.net Error: timeout exceeded

Вторая группа Permanent Error, или постоянная ошибка. Эти коды начинаются с цифры 5 и указывают на серьёзные проблемы, например на разрыв SMTP-соединения или невозможность доставки сообщения. В отличие от временных ошибок, повторная отправка письма при постоянной ошибке, скорее всего, не даст результата.

Возьмём код 550 в SMTP-протоколе «Яндекса». Сервер сообщает нам, что указанного получателя нет в системе. Это может означать, что в адресе опечатка, почтовый ящик удалён или учётная запись не существует:

smtp;550 5.7.1 No such user!

SMTP-порты

У каждого SMTP-сервера есть свой адрес и порт, по которым почтовый клиент устанавливает с ним соединение. Для разных протоколов электронной почты используются отдельные порты. Если представить интернет как сеть домов по всему миру, то IP-адрес — это «адрес на карте», а порт — конкретная дверь, через которую можно войти.

Изначально протокол SMTP работал только через порт 25. Этот порт до сих пор существует, однако в большинстве пользовательских сетей он заблокирован, так как долгое время использовался спамерами для массовых рассылок. Есть также порт 465, который сегодня практически не используется из-за перехода на современные методы шифрования.

А вот порт 587 — это современный стандарт для отправки почты через SMTP, который использует большинство почтовых сервисов. Этот порт обеспечивает защиту соединения с помощью TLS (Transport Layer Security), что гарантирует шифрование передаваемых данных.

Многие почтовые сервисы также поддерживают порт 2525. Он официально не стандартизирован для SMTP, но используется как запасной вариант на случай, если стандартные порты 25 или 587 окажутся недоступны или заблокированы интернет-провайдером.

Схема подключения к серверам «Яндекс Почты»
Инфографика: pixelbazaar / SVG Repo / Skillbox Media

Практика: отправляем письмо через SMTP с помощью Mailtrap и Python

Чтобы безопасно проверить работу протокола SMTP, вам достаточно создать бесплатный аккаунт в сервисе Mailtrap. Это специализированная платформа для тестирования отправки почты: она имитирует работу реальных почтовых серверов, но все письма попадают не в настоящий ящик получателя, а в «песочницу», которая доступна только вам.

После регистрации в личном кабинете вам нужно скопировать Username и Password, чтобы затем подключиться к тестовому SMTP-серверу:

Скриншот: Mailtrap / Skillbox Media

Далее вам нужно установить Python и выбрать редактор кода. В нём создайте новый файл и добавьте следующий код со своими данными:

import smtplib
from email.mime.text import MIMEText

smtp_server = "smtp.mailtrap.io"
port = 587  
username = "ВАШ_ЛОГИН"   # Вставьте сюда логин из Mailtrap
password = "ВАШ_ПАРОЛЬ"  # Вставьте сюда пароль из Mailtrap

# Вы можете оставить эти адреса как есть или подставить свои. Если подставите свои, Mailtrap всё равно их перехватит, чтобы они не попали в реальную почту
sender = "example@sender.com"
recipient = "example@recipient.com"

# Здесь вы можете менять тему и текст письма
message = MIMEText("Привет! Это тестовое письмо через SMTP и Mailtrap.")
message["Subject"] = "Тест SMTP"  
message["From"] = sender
message["To"] = recipient

with smtplib.SMTP(smtp_server, port) as server:
    server.starttls() 
    server.login(username, password)  
    server.sendmail(sender, recipient, message.as_string())  

print("Письмо отправлено! Проверьте его в интерфейсе Mailtrap.")

Затем откройте в редакторе терминал и запустите скрипт командой:

python ИМЯ_ВАШЕГО_ФАЙЛА.py

После запуска скрипта письмо должно появиться в вашем аккаунте Mailtrap. Вы сможете открыть его прямо в веб-интерфейсе, просмотреть заголовки, содержимое и убедиться, что SMTP-передача сработала:

Скриншот: Mailtrap / Skillbox Media

Больше интересного про код — в нашем телеграм-канале.  Подписывайтесь!





Попробуйте бесплатно 4 топовых направления в IT

Переходите в Telegram и откройте доступ к бесплатным IT-курсам. Попробуйте себя в Python, Java, тестировании ПО, SQL и Excel. Определите, какое направление вам подходит, и получите подарки.

Пройти курс
Практический курс: «Профессия DevOps-инженер» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована