Как настроить почтовый сервер для WordPress на локальном хосте
WordPress отправляет служебные письма через функцию wp_mail(), которая обычно опирается на PHP-механизм mail(). На локальном хосте этот механизм часто не настроен: в среде WordPress отсутствует системный MTA, письмо не появляется в Outlook, а причина ошибки остается неясной. Локальный SMTP-сервер перехватывает отправку, сохраняет содержимое сообщения и позволяет проверить его без выхода в интернет. Подробнее о ネットワークで有線lanと無線lanを端末で同時使用して速度を上げる手順 負荷分散.
Важно различать тестовый и рабочий режимы. Mailpit, MailHog и smtp4dev предназначены для разработки: они принимают письма и показывают их в локальном интерфейсе, не доставляя сообщения получателям. Postfix или Exim способны работать как полноценные почтовые агенты и передавать почту через внешний SMTP-релей. Для тестовой копии WordPress безопаснее использовать перехватывающий сервер, исключающий случайную рассылку.
Практическая схема достаточно проста: запустить SMTP-службу на 127.0.0.1, указать ее адрес в SMTP-плагине WordPress, отправить тестовое письмо и изучить журнал. Такой контур работает в Windows, Linux и macOS, если сайт и почтовый сервер запущены на одном компьютере либо связаны через внутреннюю сеть Docker.
Выберите подходящий SMTP-сервер
Для локальной проверки удобен Mailpit: программа принимает SMTP по порту 1025, предоставляет веб-интерфейс по порту 8025 и не требует доменного имени или почтового провайдера. MailHog работает по похожему принципу, а smtp4dev подойдет разработчикам, которым комфортнее интерфейс на базе .NET. Эти инструменты сохраняют письма только на тестовом компьютере.
Службу лучше привязывать к 127.0.0.1, а не к 0.0.0.0. Первый адрес доступен только самому компьютеру и предотвращает посторонний доступ к почтовому интерфейсу. Адрес 0.0.0.0 открывает порты всем сетевым интерфейсам, поэтому его следует использовать лишь в закрытой сети с дополнительной аутентификацией и правилами брандмауэра.
Если компьютер подключен одновременно к проводной и беспроводной сети, полезно понимать, как система выбирает маршрут. Материал о работе LAN и Wi-Fi показывает, почему локальные адреса и задержки иногда ведут себя неожиданно. Для Mailpit это не меняет схему подключения, зато помогает исключить сетевой конфликт при проверке портов.
Установите и запустите Mailpit
В Windows скачайте исполняемый файл Mailpit, распакуйте его в отдельную папку и проверьте, что система разрешает запуск неизвестных приложений. Если для подготовки среды требуется изменить параметры системы, краткий обзор по настройке Windows поможет проверить пути, брандмауэр и фоновые службы. Python для Mailpit не нужен, поскольку распространяется как самостоятельная программа.
В каталоге с исполняемым файлом выполните в PowerShell:
.\mailpit.exe --smtp 127.0.0.1:1025 --listen 127.0.0.1:8025
После запуска откройте http://127.0.0.1:8025 в браузере. Интерфейс покажет пустую папку с входящими сообщениями, а в PowerShell останется активным журнал соединений. Пока работает это окно, SMTP-порт доступен для WordPress. Проверить его можно командой Test-NetConnection 127.0.0.1 -Port 1025.
В Linux Mailpit устанавливают как отдельный исполняемый файл либо запускают через Docker. Удобный контейнерный вариант выглядит так:
docker run --name mailpit -p 127.0.0.1:1025:1025 -p 127.0.0.1:8025:8025 axllent/mailpit
Обе публикации портов намеренно ограничены петлевым интерфейсом. Состояние контейнера можно посмотреть командой docker logs mailpit, а после перезапуска имя mailpit сохранит прежние сообщения. Если почтовый сервер работает в контейнере, а сайт установлен обычным PHP-приложением, указанный адрес 127.0.0.1 по-прежнему подходит.
Подключите WordPress к локальному SMTP
На локальной копии установите SMTP-плагин, например WP Mail SMTP или FluentSMTP. Он заставляет wp_mail() обращаться напрямую к настроенному SMTP-серверу, минуя ненадежный PHP-вызов mail(). Перед настройкой убедитесь, что сайт запущен на том же компьютере. Если WordPress тоже находится в Docker, вместо 127.0.0.1 укажите имя контейнера Mailpit в общей сети либо host.docker.internal с поддержкой этого адреса в Docker.
В разделе SMTP-параметров плагина задайте адрес сервера 127.0.0.1 и порт 1025. Уровень шифрования оставьте «Нет», автоматическое включение TLS отключите, а аутентификацию выберите «Нет», поскольку локальная тестовая служба не запрашивает имя пользователя и пароль. В качестве адреса отправителя можно указать wordpress@example.test, а отображаемое имя — название сайта.
Эквивалентные параметры WP Mail SMTP можно зафиксировать в wp-config.php до строки запуска WordPress:
define( 'WPMS_SMTP_HOST', '127.0.0.1' );
define( 'WPMS_SMTP_PORT', 1025 );
define( 'WPMS_SMTP_SECURE', '' );
define( 'WPMS_SMTP_AUTH', false );
define( 'WPMS_SMTP_DEBUG', 1 );
Эти константы относятся именно к WP Mail SMTP, поэтому перед их использованием проверьте название плагина и его документацию. Значение localhost иногда разрешается в IPv6-адрес ::1, тогда как Mailpit слушает только IPv4; в таком случае явный 127.0.0.1 снимает ошибку соединения. После сохранения настроек перезапустите PHP или контейнер с WordPress и отправьте тестовое письмо.
Проверьте доставку и устраните ошибки
В Mailpit откройте папку с входящими сообщениями и запустите проверку из SMTP-плагина. Затем отправьте письмо через форму восстановления пароля, регистрацию пользователя или отправку сообщения из контактной формы. В интерфейсе нужно проверить получателя, тему, текст, заголовки отправителя и наличие вложений. Полученное письмо считается захваченным, хотя настоящий адресат его не увидит.
Ошибка connection refused обычно означает, что Mailpit не запущен или слушает другой адрес. Ошибка тайм-аута часто вызвана блокировкой порта брандмауэром или неверным адресом внутри контейнера. Если сервер требует TLS, а в настройках выбран режим «Нет», соединение завершится ошибкой согласования шифрования. Для локального HTTP-сайта TLS обычно не нужен. Если тестовый стенд доступен другим устройствам через защищенный адрес, сначала завершите настройку HTTPS для WordPress, а SMTP проверяйте отдельным тестом.
Журнал плагина и консоль Mailpit помогают сопоставить ошибку PHP с ответом SMTP-сервера. После проверки удалите сохраненные письма, особенно сообщения с паролями, токенами восстановления и тестовыми персональными данными. Не публикуйте веб-интерфейс Mailpit в интернет без аутентификации: в нем видны содержимое сообщений и служебные заголовки. Для локальной разработки достаточно привязки к петлевому адресу и закрытого доступа к порту 8025.
Переведите локальный контур в рабочий режим
Перехватывающий SMTP-сервер не заменяет инфраструктуру для отправки писем клиентам. Если сайт должен работать в интернете, настройте Postfix или Exim как локальный MTA, подключите доверенный SMTP-релей и привяжите исходящие адреса к домену. Для отправки необходимы корректные DNS-записи SPF и DKIM, политика DMARC и возможность принимать обратные DNS-ответы почтовой инфраструктуры. Прием входящих писем дополнительно зависит от MX-записей домена.
Если WordPress и Postfix находятся на одном сервере, интерфейс MTA можно ограничить параметром inet_interfaces = loopback-only, а внешний транспорт задать через relayhost. Открытый релей, доступный посторонним, способен превратить сервер в инструмент массовой рассылки. Отправка через случайный домашний IP без настроенного релея обычно блокируется получателями, поэтому рабочий адрес SMTP следует получать у специализированного почтового провайдера.
Сохраните рядом с проектом версии WordPress, SMTP-плагина и Mailpit, выбранные порты, параметры подключения и результаты проверок. Учетные данные реального почтового сервера должны храниться в защищенном файле конфигурации или переменных окружения, а не в общедоступном репозитории. Временно включайте подробное журналирование, затем отключайте его после устранения ошибок и удаляйте тестовые сообщения.
Запустите контур прямо сейчас: откройте http://127.0.0.1:8025, выполните тест в SMTP-плагине и отправьте письмо восстановления пароля. Убедитесь, что получатель, тема, текст и служебные заголовки заполнены правильно, а в журнале отсутствуют ошибки соединения, после чего сохраните рабочие параметры как основу локальной конфигурации WordPress.