SMTP-перевірка через telnet

Практичний посібник із ручного тестування поштового сервера. Дізнайтеся, що робить кожна SMTP-команда, як відповідає сервер і як провести повну сесію перевірки через telnet або openssl.

SMTP (Simple Mail Transfer Protocol) — це текстовий, порядковий протокол. Це означає, що ви можете спілкуватися з поштовим сервером напряму з термінала й читати точно те, що він відповідає, — без жодного спеціального ПЗ. Це найпрозоріший спосіб перевірити, чи існує скринька, чи доступний сервер і як його налаштовано.

1. Підключення до поштового сервера

Спершу знайдіть поштовий сервер (MX-хост) домену, потім відкрийте TCP-з'єднання до його SMTP-порту. Класичний порт — 25. Порти відправлення 587 і 2525 використовуються зі STARTTLS; порт 465 — це неявний TLS (SMTPS).

Звичайне з'єднання (порт 25):

telnet mail.example.com 25

Порт STARTTLS (587 або 25) — telnet не вміє TLS, скористайтеся openssl:

openssl s_client -connect mail.example.com:587 -starttls smtp -crlf

Порт неявного TLS (465):

openssl s_client -connect mail.example.com:465 -crlf

Зверніть увагу: багато домашніх і мобільних провайдерів блокують вихідний порт 25 для боротьби зі спамом. Якщо telnet ... 25 просто «висне», це зазвичай ваш провайдер, а не поштовий сервер. Тестуйте із сервера/VPS, де порт 25 відкритий, або використовуйте порти відправлення.

2. Пояснення SMTP-команд

Ви вводите команди (регістр не важливий); сервер відповідає 3-значним кодом і текстом. Завершуйте кожну команду натисканням Enter (CRLF).

КомандаЩо робить
HELO domainЗастаріле привітання. Ідентифікує хост, що підключається, за іменем. Сервер відповідає 250.
EHLO domainСучасне привітання (Extended HELO). Те саме, що HELO, але сервер також перелічує підтримувані розширення (STARTTLS, AUTH, SIZE, PIPELINING…).
MAIL FROM:<addr>Починає новий лист і задає відправника конверта («return path»). Відповідь 250, якщо прийнято.
RCPT TO:<addr>Ключова команда для перевірки. Просить сервер прийняти отримувача. 250 = скриньку прийнято; 550 = такого користувача немає; 4xx = спробуйте пізніше (напр. greylisting).
DATAПочинає тіло листа. Сервер відповідає 354; ви надсилаєте заголовки + тіло й завершуєте одинарною крапкою . в окремому рядку. (Для перевірки адреси до цього кроку справа не доходить.)
RSETСкидає поточну транзакцію (забуває MAIL FROM / RCPT TO) без закриття з'єднання.
VRFY userПросить сервер перевірити ім'я/адресу користувача. Створена саме для цього, але майже завжди вимкнена сьогодні (повертає 252 або 502), бо розкриває дійсні адреси спамерам.
EXPN listПросить сервер розгорнути список розсилки до його учасників. Як і VRFY, вимкнена майже скрізь з тієї ж причини приватності.
STARTTLSОновлює звичайне з'єднання до шифрованого TLS (на портах 25/587). Пропонується лише якщо вказана у відповіді EHLO.
AUTH LOGIN / PLAINАвтентифікує користувача (потрібно, щоб надсилати пошту через порти відправлення, не для перевірки).
NOOPНічого не робить; сервер відповідає 250. Корисна, щоб тримати з'єднання живим або перевірити відгук.
HELPПросить сервер перелічити команди, які він підтримує.
QUITВвічливо завершує сесію. Сервер відповідає 221 і закриває з'єднання.

3. Коди відповідей

Перша цифра вказує на категорію, тож ви можете прочитати будь-яку відповідь, навіть не знаючи точного коду:

  • 2xx — успіх (команду прийнято).
  • 3xx — проміжний стан, сервер очікує більше вводу (напр. 354 після DATA).
  • 4xx — тимчасова помилка: спробуйте пізніше. Адреса все одно може бути дійсною.
  • 5xx — стала помилка: команду або адресу відхилено.
КодЗначення
220Сервіс готовий (вітальний банер).
221Закриття з'єднання (відповідь на QUIT).
250OK — команду прийнято (відповідь, якої ви хочете після RCPT TO).
251 / 252Користувач не локальний, але буде переадресований / неможливо перевірити, але спробує доставити.
354Починайте надсилати тіло листа (після DATA).
421Сервіс недоступний, закривається — часто обмеження частоти.
450 / 451 / 452Тимчасова проблема (скринька зайнята, локальна помилка, мало місця). Тут часто проявляється greylisting.
502Команду не реалізовано (типова відповідь на VRFY / EXPN).
550Скринька недоступна / такого користувача немає — адреса не існує.
551 / 552 / 553 / 554Користувач не локальний / перевищено квоту / хибне ім'я скриньки / транзакція не вдалася.

4. Повний робочий приклад

Перевіряємо, чи існує john@example.com. Рядки, які вводите ви, позначено >; решта — це сервер:

$ telnet mail.example.com 25 220 mail.example.com ESMTP ready > EHLO checkemail.test 250-mail.example.com Hello checkemail.test 250-STARTTLS 250-SIZE 52428800 250 PIPELINING > MAIL FROM:<probe@checkemail.test> 250 2.1.0 Ok > RCPT TO:<john@example.com> 250 2.1.5 Ok ← скринька ІСНУЄ > RSET 250 2.0.0 Ok > QUIT 221 2.0.0 Bye

Якщо ж отримувача не існує, ви побачите щось на кшталт:

> RCPT TO:<nosuchuser@example.com> 550 5.1.1 <nosuchuser@example.com>: Recipient address rejected: User unknown

5. Що робить результат непевним

  • Greylisting — сервер навмисно повертає тимчасову 4xx на першій спробі, пропонуючи повернутися пізніше. 4xx не означає, що адреса недійсна.
  • Catch-all-домени — деякі сервери приймають будь-якого отримувача з 250 і розбираються пізніше. Тоді RCPT TO не може довести існування конкретної скриньки. Щоб виявити catch-all, спробуйте явно випадкову адресу: якщо її теж прийнято — домен catch-all.
  • Захист від зловживань — сервери можуть затримувати, приховувати справжній статус або блокувати повторні запити з однієї IP. Тестуйте чемно й не «бомбардуйте» сервер.
  • VRFY / EXPN вимкнені — не покладайтеся на них; практичний сигнал — це RCPT TO.

Хочете, щоб це робилося автоматично, разом із MX-пошуком, виявленням catch-all і чітким вердиктом? Скористайтеся нашою перевіркою Email на головній сторінці.