Отправка электронных писем — важная часть работы многих сайтов на WordPress. Но иногда возникает необходимость не отправлять письма мгновенно, а откладывать их на определённое время. Это полезно для рассылок, уведомлений или когда сервер ограничен по ресурсам и не может сразу обработать большой объём отправки.
Зачем нужна отложенная отправка писем в WordPress
Отложенная отправка помогает разгрузить сервер, улучшить доставляемость писем и избежать блокировок почтовых сервисов. Например, если вы рассылаете новости или уведомления, можно отложить отправку на ночь или равномерно распределить по времени.
Кроме того, отложенная отправка позволяет создавать цепочки писем с задержками — это удобно для email-маркетинга и триггерных рассылок.
Реализовать такую функциональность можно как с помощью плагинов, так и при помощи собственного кода с использованием WP-Cron и пользовательской таблицы для хранения задач.
Плагины для отложенной отправки писем в WordPress
Плагин WP Mail SMTP с расширениями
WP Mail SMTP — популярный плагин для настройки отправки писем через SMTP. В сочетании с дополнительными модулями или платными расширениями, он позволяет планировать отправку писем и ставить их в очередь.
Подробнее и скачать: https://wpshop.ru/plugins/wp-mail-smtp
Плагин Post SMTP Mailer/Email Log
Этот плагин умеет логировать отправку писем и поддерживает очередь. Вы можете настроить отложенную отправку с помощью внутренних функций или интеграции с WP-Cron.
Подробнее: https://wpshop.ru/plugins/post-smtp
Плагин Queue Mail
Queue Mail — специализированный плагин для постановки писем в очередь и отложенной отправки. Он позволяет настраивать количество писем за один запуск WP-Cron и интервалы отправки.
Пример: можно отложить отправку уведомлений на 10 минут после события, чтобы сгладить нагрузку.
Как реализовать отложенную отправку писем в WordPress с помощью кода
Если вы хотите более гибко управлять отправкой и не зависеть от плагинов, можно написать собственный код для очереди писем.
Основная идея: сохранять письма в отдельной таблице базы данных, и запускать WP-Cron событие, которое периодически отправляет письма из очереди.
Создание таблицы для очереди писем
function wpmail_create_mail_queue_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_mail_queue';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
to_email varchar(255) NOT NULL,
subject varchar(255) NOT NULL,
message text NOT NULL,
headers text DEFAULT NULL,
scheduled datetime NOT NULL,
sent tinyint(1) DEFAULT 0,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wpmail_create_mail_queue_table');Этот код создаст таблицу wp_wpmail_mail_queue с полями для хранения информации о письмах и времени их отправки.
Функция для добавления письма в очередь
function wpmail_add_mail_to_queue($to, $subject, $message, $headers = '', $delay_minutes = 0) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_mail_queue';
$scheduled_time = date('Y-m-d H:i:s', strtotime("+{$delay_minutes} minutes"));
$wpdb->insert($table_name, [
'to_email' => $to,
'subject' => $subject,
'message' => $message,
'headers' => maybe_serialize($headers),
'scheduled' => $scheduled_time,
'sent' => 0
]);
}Теперь стандартные вызовы wp_mail можно заменить на вызов wpmail_add_mail_to_queue, чтобы письма попадали в очередь и отправлялись позже.
WP-Cron для обработки очереди писем
Зарегистрируем событие, которое будет запускать функцию отправки писем:
function wpmail_schedule_cron() {
if (!wp_next_scheduled('wpmail_send_queued_emails')) {
wp_schedule_event(time(), 'every_five_minutes', 'wpmail_send_queued_emails');
}
}
add_action('wp', 'wpmail_schedule_cron');
add_action('wpmail_send_queued_emails', 'wpmail_process_mail_queue');Создадим интервал 5 минут для WP-Cron:
function wpmail_cron_schedules($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300,
'display' => __('Every 5 Minutes')
];
return $schedules;
}
add_filter('cron_schedules', 'wpmail_cron_schedules');И функцию обработки очереди:
function wpmail_process_mail_queue() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_mail_queue';
$now = current_time('mysql');
$mails = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table_name WHERE scheduled <= %s AND sent = 0 LIMIT 10",
$now
));
foreach ($mails as $mail) {
$headers = maybe_unserialize($mail->headers);
$sent = wp_mail($mail->to_email, $mail->subject, $mail->message, $headers);
if ($sent) {
$wpdb->update($table_name, ['sent' => 1], ['id' => $mail->id]);
}
}
}Оптимизация и надежность очереди писем
При большом объеме писем стоит продумать лимиты отправки за одно срабатывание WP-Cron, чтобы не перегружать сервер и не попадать в спам-фильтры.
Также полезно хранить логи отправки и ошибки, чтобы диагностировать проблемы.
Для улучшения надежности можно использовать сторонние сервисы SMTP и API, например SendGrid, Mailgun или Postmark, которые лучше справляются с массовой рассылкой.
Пример логирования ошибок отправки
function wpmail_process_mail_queue() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_mail_queue';
$now = current_time('mysql');
$mails = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table_name WHERE scheduled <= %s AND sent = 0 LIMIT 10",
$now
));
foreach ($mails as $mail) {
$headers = maybe_unserialize($mail->headers);
$sent = wp_mail($mail->to_email, $mail->subject, $mail->message, $headers);
if ($sent) {
$wpdb->update($table_name, ['sent' => 1], ['id' => $mail->id]);
} else {
error_log('Ошибка отправки письма ID ' . $mail->id . ' на адрес ' . $mail->to_email);
}
}
}Выводы и рекомендации
Отложенная отправка писем в WordPress — мощный инструмент для повышения стабильности сайта и качества коммуникаций с пользователями.
Используйте готовые решения, если хотите быстро получить функционал, или напишите свой код для максимальной гибкости.
Не забывайте про тестирование и мониторинг очереди писем, чтобы вовремя обнаружить и исправить сбои.
Для интеграции с профессиональными SMTP-сервисами и улучшения доставляемости рекомендуем рассмотреть плагины, которые поддерживают API популярных почтовых провайдеров.