Практичний посібник із ручного тестування поштового сервера. Дізнайтеся, що робить кожна SMTP-команда, як відповідає сервер і як провести повну сесію перевірки через telnet або openssl.
SMTP (Simple Mail Transfer Protocol) — це текстовий, порядковий протокол. Це означає, що ви можете спілкуватися з поштовим сервером напряму з термінала й читати точно те, що він відповідає, — без жодного спеціального ПЗ. Це найпрозоріший спосіб перевірити, чи існує скринька, чи доступний сервер і як його налаштовано.
Спершу знайдіть поштовий сервер (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 відкритий, або використовуйте порти відправлення.
Ви вводите команди (регістр не важливий); сервер відповідає 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 і закриває з'єднання. |
Перша цифра вказує на категорію, тож ви можете прочитати будь-яку відповідь, навіть не знаючи точного коду:
354 після DATA).| Код | Значення |
|---|---|
220 | Сервіс готовий (вітальний банер). |
221 | Закриття з'єднання (відповідь на QUIT). |
250 | OK — команду прийнято (відповідь, якої ви хочете після RCPT TO). |
251 / 252 | Користувач не локальний, але буде переадресований / неможливо перевірити, але спробує доставити. |
354 | Починайте надсилати тіло листа (після DATA). |
421 | Сервіс недоступний, закривається — часто обмеження частоти. |
450 / 451 / 452 | Тимчасова проблема (скринька зайнята, локальна помилка, мало місця). Тут часто проявляється greylisting. |
502 | Команду не реалізовано (типова відповідь на VRFY / EXPN). |
550 | Скринька недоступна / такого користувача немає — адреса не існує. |
551 / 552 / 553 / 554 | Користувач не локальний / перевищено квоту / хибне ім'я скриньки / транзакція не вдалася. |
Перевіряємо, чи існує 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
4xx на першій спробі, пропонуючи повернутися пізніше. 4xx не означає, що адреса недійсна.250 і розбираються пізніше. Тоді RCPT TO не може довести існування конкретної скриньки. Щоб виявити catch-all, спробуйте явно випадкову адресу: якщо її теж прийнято — домен catch-all.Хочете, щоб це робилося автоматично, разом із MX-пошуком, виявленням catch-all і чітким вердиктом? Скористайтеся нашою перевіркою Email на головній сторінці.