Диагностика проблемы с отправкой писем через PHPMailer в WordPress
Когда WordPress не отправляет письма (например, уведомления регистрации, сброс пароля, оповещения WooCommerce), чаще всего виноват PHPMailer — встроенный класс для SMTP и mail-функций PHP. Проблемы могут возникать по разным причинам: неправильные настройки SMTP, блокировка хостингом, ошибки в коде, отсутствие корректной инициализации PHPMailer, несовместимость с плагинами.
Для диагностики включите логирование ошибок почты. Добавьте в wp-config.php следующие строки:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Затем попробуйте отправить письмо (например, через форму контакта или сброс пароля). Логи ошибок появятся в wp-content/debug.log. Проверьте наличие ошибок, связанных с PHPMailer или SMTP.
Проверка базовой работы mail()
Чтобы исключить проблемы с серверной функцией mail(), создайте файл test-mail.php на сервере с таким кодом:
<?php
$to = 'ваш-email@example.com';
$subject = 'Тест mail()';
$message = 'Это тестовое письмо.';
$headers = 'From: webmaster@example.com' . "\r\n";
if(mail($to, $subject, $message, $headers)) {
echo 'Письмо отправлено';
} else {
echo 'Ошибка при отправке';
}Если письмо не приходит, проблема на уровне сервера — обратитесь к хостеру.
Пошаговое решение: настройка PHPMailer через SMTP в WordPress
Лучший способ гарантировать отправку писем — использовать внешний SMTP-сервер (Gmail, Яндекс, почта хостинга). Для этого подключите к WordPress кастомный обработчик письма, переопределяющий настройки PHPMailer.
Шаг 1. Создайте плагин или добавьте код в functions.php темы
Пример кода для настройки SMTP через фильтр phpmailer_init:
add_action('phpmailer_init', 'custom_phpmailer_smtp');
function custom_phpmailer_smtp(PHPMailer\PHPMailer\PHPMailer $phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.yourmail.com'; // SMTP сервер
$phpmailer->SMTPAuth = true; // Включаем аутентификацию
$phpmailer->Port = 587; // Порт SMTP
$phpmailer->Username = 'your-email@yourmail.com'; // Логин SMTP
$phpmailer->Password = 'yourpassword'; // Пароль SMTP
$phpmailer->SMTPSecure = 'tls'; // Шифрование
$phpmailer->From = 'your-email@yourmail.com'; // От кого
$phpmailer->FromName = 'Ваш сайт'; // Имя отправителя
$phpmailer->CharSet = 'UTF-8'; // Кодировка
}Замените параметры на свои данные SMTP-провайдера.
Шаг 2. Проверьте отправку письма через стандартные функции WordPress
Используйте функцию wp_mail() для теста:
wp_mail('your-email@example.com', 'Тест SMTP', 'Проверка работы SMTP от WordPress');Если письмо пришло — настроено корректно.
Проверка результата после внедрения решения
1. Отправьте тестовое письмо через форму контакта или сброс пароля.
2. Проверьте почтовый ящик на получение.
3. Посмотрите в wp-content/debug.log на наличие ошибок.
Если письма не приходят, проверьте настройки SMTP и порты, блокировки на хостинге (firewall, antivirus).
Частые ошибки и как их исправить
- Ошибка авторизации SMTP (535): проверьте логин и пароль SMTP, убедитесь, что аккаунт не заблокирован.
- Сообщение «Connection timed out» или «Could not connect to SMTP host»: проверьте порт и доступность SMTP сервера, иногда нужно использовать SSL 465 или TLS 587.
- Письма попадают в спам: настройте SPF, DKIM, DMARC записи DNS для вашего домена.
- Конфликт плагинов почты: отключите другие SMTP и почтовые плагины, чтобы избежать дублирования настроек.
- Неверный From address: многие SMTP-сервера требуют, чтобы адрес отправителя совпадал с аккаунтом SMTP.
Практические советы по безопасности и производительности
- Не храните пароли SMTP в открытом виде в коде. Используйте константы в
wp-config.phpили переменные окружения. - Ограничьте доступ к файлам конфигурации и используйте SSL для подключения к SMTP.
- Для массовой рассылки используйте специализированные сервисы (SendGrid, Mailgun) с API, а не SMTP.
- Периодически проверяйте логи ошибок почты для своевременного обнаружения проблем.
Сравнение вариантов настройки отправки писем в WordPress
| Метод | Плюсы | Минусы | Пример кода/плагина |
|---|---|---|---|
| Стандартная функция mail() | Простота, не требует настроек | Низкая надежность, письма часто в спам | Нет кода |
| Настройка PHPMailer через SMTP (код) | Контроль, надежность | Требует знаний SMTP, конфигурации | Код выше в статье |
| Плагины SMTP (WP Mail SMTP, Easy WP SMTP) | Удобство настройки, интерфейс | Зависимость от плагина, возможные конфликты | WP Mail SMTP |