Как починить 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-записи (работает, но муторно)
- В Cloudflare → DNS → Records
- Добавьте/отредактируйте:
- Type: A
- Name: mail (или smtp, если используете)
- Content: реальный IP вашего сервера (не Cloudflare!)
- Proxy status: DNS Only (серое облачко!)
- MX-записи тоже должны быть серыми.
- Ждите пропагации (5–30 минут, иногда час).
- В настройках SMTP укажите mail.вашдомен.ru:587 + TLS.
Это работает... иногда. Но кэш DNS на сервере может держаться часами, и всё равно будут таймауты.
Решение №2: Идеальное и вечное (рекомендую всем)
Просто используйте localhost вместо домена.
Да, серьёзно.
В настройках SMTP (WP Mail SMTP, PHPMailer, Python smtplib, Laravel, любой фреймворк):
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):
$mail->isSMTP();
$mail->Host = 'localhost';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = 'sender@domain.ru';
$mail->Password = 'password';
$mail->SMTPSecure = false; // Выключаем
$mail->SMTPAutoTLS = false; // Важно
Python smtplib:
MAIL_SERVER=localhost
MAIL_PORT=587
MAIL_USE_TLS=false
WordPress (WP Mail SMTP):
- SMTP Host: localhost
- Encryption: No Encryption
- Port: 587
Вывод
Не мучайтесь с DNS-записями, портами, сертификатами и Cloudflare-прокси. Просто поставьте localhost + порт 587 + шифрование выключено.
Работает на любом shared-хостинге. Стабильно. Навсегда. Без сюрпризов.
Сохраните эту статью в закладки — и когда в следующий раз перенесёте домен на Cloudflare, вы почините SMTP за 5 минут, а не за день.
А если у вас всё ещё не работает — пишите в комментарии: хостинг, ошибка, конфиг — разберём.
Удачи, и пусть ваши формы всегда отправляются с первого раза! 🚀