Диагностика проблем с отправкой писем в WordPress
Многие сайты на WordPress сталкиваются с проблемой, когда стандартная функция wp_mail() не отправляет письма или делает это с задержкой. Основные симптомы:
- Письма не доходят или попадают в спам;
- Почтовый сервер блокирует исходящие письма;
- Задержки в отправке уведомлений пользователям;
- Провалы в регистрации, восстановлении пароля и других процессах, связанных с почтой.
Первая проверка — убедиться, что хостинг поддерживает функцию mail() PHP и что WordPress не блокирует отправку писем. Для этого можно использовать плагин Check Email или написать простой тест:
if(wp_mail('your-email@example.com', 'Тест отправки почты', 'Тестовое письмо')) {
echo 'Письмо отправлено успешно';
} else {
echo 'Проблема с отправкой';
}Если отправка не срабатывает, вероятнее всего, причина на стороне сервера или настроек PHP.
Почему WP-Cron помогает с отправкой писем
WP-Cron — это имитация планировщика задач, которая запускает события при обращении к сайту. Отправка писем с помощью WP-Cron позволяет:
- Отложить отправку, разгрузив основной процесс;
- Повторить попытки отправки при неудаче;
- Автоматизировать массовую отправку писем;
- Избежать проблем с блокировками на хостинге, выполняя отправку в фоне.
Пошаговое решение: как настроить отправку писем через WP-Cron
1. Отключаем стандартную отправку и создаем очередь писем
Создаем таблицу в базе данных или используем transient для хранения очереди писем. Для примера — очередь в опции:
function add_mail_to_queue($to, $subject, $message, $headers = '', $attachments = []) {
$queue = get_option('wp_mail_queue', []);
$queue[] = compact('to', 'subject', 'message', 'headers', 'attachments');
update_option('wp_mail_queue', $queue);
return true;
}2. Отправка писем из очереди через WP-Cron
Регистрируем событие и функцию для обработки очереди:
add_action('wp_mail_cron_send', 'process_mail_queue');
function process_mail_queue() {
$queue = get_option('wp_mail_queue', []);
if (empty($queue)) return;
foreach ($queue as $key => $mail) {
$sent = wp_mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers'], $mail['attachments']);
if ($sent) {
unset($queue[$key]);
}
}
update_option('wp_mail_queue', $queue);
}
if (!wp_next_scheduled('wp_mail_cron_send')) {
wp_schedule_event(time(), 'five_minutes', 'wp_mail_cron_send');
}Важно: стандартных интервалов WP-Cron недостаточно, поэтому добавим кастомный интервал «five_minutes»:
add_filter('cron_schedules', function($schedules) {
$schedules['five_minutes'] = [
'interval' => 300, // 5 минут
'display' => __('Каждые 5 минут')
];
return $schedules;
});3. Используем функцию add_mail_to_queue вместо wp_mail
В коде или плагинах, где вызывается wp_mail(), меняем на нашу функцию:
add_mail_to_queue('user@example.com', 'Тема письма', 'Текст письма');Проверка результата после внедрения
Чтобы проверить, что отправка через WP-Cron работает:
- Добавьте письмо в очередь через
add_mail_to_queue(). - Запустите вручную событие WP-Cron (если сайт не получает много трафика) через плагин WP Crontrol или вызов
do_action('wp_mail_cron_send');. - Проверьте, что письма пришли и очередь пуста (
get_option('wp_mail_queue')должен вернуть пустой массив). - Если письма не приходят, проверьте логи сервера и настройки почтового сервера.
Частые ошибки и как исправить
- WP-Cron не запускается из-за отсутствия трафика: используйте системный Cron для вызова
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1каждые 5 минут. - Очередь не очищается после отправки: проверьте корректность удаления обработанных писем из массива и обновления опции.
- Письма попадают в спам: настройте SMTP-сервер через плагины, например WP Mail SMTP, вместо стандартной функции
mail(). - Дублирование писем: убедитесь, что не вызываете функцию добавления в очередь несколько раз для одного события.
Практические советы по безопасности и производительности
- Используйте SMTP-серверы с поддержкой аутентификации, чтобы повысить надежность доставки.
- Ограничьте размер очереди, чтобы избежать перегрузок базы данных.
- Добавьте логирование ошибок отправки для последующего анализа.
- Если письмо не отправляется после нескольких попыток, удаляйте его из очереди или перемещайте в отдельный лог ошибок.
Сравнение вариантов реализации очереди отправки писем
| Метод | Преимущества | Недостатки |
|---|---|---|
| Опции WordPress (как в примере) | Просто реализовать, не требует доп. таблиц | Не масштабируется для больших объемов, возможны конфликты |
| Собственная таблица в базе | Масштабируемость, удобство управления очередью | Сложнее в реализации, требует миграций |
| Использование плагинов SMTP и очередей | Надежность, поддержка авторизации и шифрования | Зависимость от сторонних решений, возможные конфликты |