Как починить SMTP после переноса на Cloudflare за 5 минут (и не сойти с ума)

Вы перенесли домен на Cloudflare — сайт ускорился, DDoS-защита появилась, всё красиво. А потом внезапно перестали работать формы обратной связи, уведомления, регистрация и любые письма с сайта.

Знакомо? Таймауты, "Connection refused", "Could not connect to SMTP host", сертификаты, спам... Вы гуглите часы, читаете форумы Cloudflare, меняете порты — а ничего не помогает.

Я тоже прошёл этот ад (вместе с одним упорным разработчиком мы потратили почти целый день). И вот — рабочее решение, которое спасёт вас от страданий.

Почему SMTP ломается после Cloudflare

Cloudflare проксирует только HTTP/HTTPS (порты 80 и 443). Все остальные порты (25, 465, 587 — это SMTP) он не пропускает (кроме Enterprise-плана за бешеные деньги).

Когда ваш сайт пытается отправить письмо:

  • Он подключается к mail.вашдомен.ru:587
  • DNS Cloudflare возвращает IP Cloudflare (не ваш реальный сервер)
  • Соединение идёт на порт 587 к Cloudflare → он его просто игнорирует → таймаут.

Даже если вы переключили запись mail в "DNS Only" (серое облачко) — часто остаётся кэш, наследование от root-записи или просто неполная пропагация.

Решение №1: Правильные DNS-записи (работает, но муторно)

  1. В Cloudflare → DNS → Records
  2. Добавьте/отредактируйте:
    • Type: A
    • Name: mail (или smtp, если используете)
    • Content: реальный IP вашего сервера (не Cloudflare!)
    • Proxy status: DNS Only (серое облачко!)
  3. MX-записи тоже должны быть серыми.
  4. Ждите пропагации (5–30 минут, иногда час).
  5. В настройках SMTP укажите mail.вашдомен.ru:587 + TLS.

Это работает... иногда. Но кэш DNS на сервере может держаться часами, и всё равно будут таймауты.

Решение №2: Идеальное и вечное (рекомендую всем)

Просто используйте localhost вместо домена.

Да, серьёзно.

В настройках SMTP (WP Mail SMTP, PHPMailer, Python smtplib, Laravel, любой фреймворк):

env
SMTP Host: localhost Port: 587 Encryption: None (без TLS/SSL) Username: ваш_ящик@вашдомен.ru Password: ваш_пароль

Почему это работает и безопасно

  • Соединение идёт внутри сервера (loopback) — Cloudflare вообще не в деле.
  • На shared-хостингах (Webhat.by, Beget, Hostinger, cPanel и т.д.) Exim/Postfix разрешает аутентификацию на localhost без шифрования.
  • Никто не может подслушать — трафик не выходит за сервер.
  • Аутентификация проходит → письма уходят от настоящего адреса → не в спам.
  • Никаких проблем с self-signed сертификатами, верификацией, портами.

Мы это проверили на реальном проекте: тесты показали "235 Authentication succeeded" — и письма полетели.

Примеры настройки

PHPMailer (PHP):

PHP
$mail->isSMTP();$mail->Host = 'localhost';$mail->Port = 587;$mail->SMTPAuth = true;$mail->Username = '[email protected]';$mail->Password = 'password';$mail->SMTPSecure = false; // Выключаем$mail->SMTPAutoTLS = false; // Важно

Python smtplib:

Python
MAIL_SERVER=localhostMAIL_PORT=587MAIL_USE_TLS=false

WordPress (WP Mail SMTP):

  • SMTP Host: localhost
  • Encryption: No Encryption
  • Port: 587

Вывод

Не мучайтесь с DNS-записями, портами, сертификатами и Cloudflare-прокси. Просто поставьте localhost + порт 587 + шифрование выключено.

Работает на любом shared-хостинге. Стабильно. Навсегда. Без сюрпризов.

Сохраните эту статью в закладки — и когда в следующий раз перенесёте домен на Cloudflare, вы почините SMTP за 5 минут, а не за день.

А если у вас всё ещё не работает — пишите в комментарии: хостинг, ошибка, конфиг — разберём.

Удачи, и пусть ваши формы всегда отправляются с первого раза! 🚀