Почему важен лимит отправки писем в WooCommerce
WooCommerce активно рассылает письма клиентам — уведомления о заказах, сменах статуса, промоакенты и т.д. При большом объеме писем без ограничения вы рискуете, что почтовый сервис вашего хостинга заблокирует отправку из-за подозрений на спам. Особенно это актуально для магазинов с большим количеством заказов и массовых рассылок.
Диагностика проблемы с массовой отправкой писем
Для начала убедитесь, что именно объем писем влияет на доставляемость:
- Проверьте логи SMTP или сервера почты на предмет ошибок с кодами 421, 450 или 554 — они часто указывают на лимиты отправки.
- Обратите внимание, если письма перестают уходить после определенного количества отправленных сообщений за час.
- Используйте плагины типа
WP Mail Loggingдля фиксации попыток отправки и ошибок.
Пошаговое решение: установка лимита отправки писем WooCommerce
1. Добавьте фильтр для ограничения количества писем за сессию
WooCommerce не имеет встроенного лимита отправки писем, но можно вручную отслеживать и ограничивать их количество за определенный период. Пример кода, ограничивающего отправку не более 10 писем в час:
add_action('phpmailer_init', 'limit_woocommerce_emails_per_hour');
function limit_woocommerce_emails_per_hour($phpmailer) {
static $sent_emails = [];
$current_hour = date('Y-m-d-H');
if (!isset($sent_emails[$current_hour])) {
$sent_emails = [$current_hour => 0];
}
if ($sent_emails[$current_hour] >= 10) {
// Прекратить отправку письма
$phpmailer->ClearAllRecipients();
$phpmailer->Subject = '';
$phpmailer->Body = '';
// Можно логировать попытку превышения лимита
error_log('Лимит писем WooCommerce на час достигнут');
} else {
$sent_emails[$current_hour]++;
}
}2. Используйте очередь отправки писем
Чтобы не блокировать отправку и не терять письма, лучше поставить очередь. Ее можно реализовать на базе WP-Cron и отдельной таблицы в базе данных:
- Сохраняйте письма в таблицу
wp_email_queue. - Создайте WP-Cron задачу, которая будет отправлять письма с ограничением по количеству (например, 5 писем за один запуск).
- Удаляйте отправленные письма из очереди.
Пример создания WP-Cron задачи для отправки очереди:
function send_woocommerce_email_queue() {
global $wpdb;
$limit = 5; // Писем за один запуск
$queue_table = $wpdb->prefix . 'email_queue';
$emails = $wpdb->get_results("SELECT * FROM $queue_table ORDER BY id ASC LIMIT $limit");
foreach ($emails as $email) {
wp_mail($email->to, $email->subject, $email->body, maybe_unserialize($email->headers));
$wpdb->delete($queue_table, ['id' => $email->id]);
}
}
add_action('woocommerce_email_queue_send', 'send_woocommerce_email_queue');
if (!wp_next_scheduled('woocommerce_email_queue_send')) {
wp_schedule_event(time(), 'hourly', 'woocommerce_email_queue_send');
}Проверка результата после внедрения
- Отправьте более 10 писем вручную или смоделируйте массовую отправку.
- Проверьте логи ошибок и убедитесь, что письма после лимита не отправляются или ставятся в очередь.
- Убедитесь, что в базе данных появляется очередь писем и они корректно отправляются по расписанию.
Частые ошибки и как их исправить
- Лимит не срабатывает: проверьте, подключается ли фильтр
phpmailer_initи нет ли конфликтов с другими плагинами, которые могут перезаписывать настройки отправки. - Письма теряются: если вы просто отменяете отправку без очереди, письма могут не дойти. Используйте очередь для надежности.
- WP-Cron не запускается: на некоторых серверах WP-Cron срабатывает только при посещении сайта. Настройте системный cron или используйте плагин, например, WP Crontrol.
Практические советы по безопасности и производительности
- Храните очередь писем в отдельной таблице с индексами для быстрого поиска и удаления.
- Ограничьте WP-Cron задачи, чтобы они не запускались часто и не создавали нагрузку.
- Используйте сторонние SMTP-сервисы с поддержкой API (например, Postmark, Mailgun) для большей надежности и контроля ограничений.
- Для больших магазинов рекомендуем использовать специализированные плагины очереди email, например, «WP Mail Queue».
Сравнение способов ограничения отправки писем WooCommerce
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Фильтр phpmailer_init с лимитом | Простота реализации, не требует доп. таблиц | Письма после лимита теряются, нет очереди | Подходит для малых магазинов |
| Очередь + WP-Cron | Надежная отправка, контроль нагрузки | Сложнее в настройке, требует таблицу и cron | Рекомендуется для средних и больших магазинов |
| Плагины очереди (например, WP Mail Queue) | Готовое решение, поддержка | Может быть платным, зависит от плагина | Для магазинов с высокой нагрузкой |