wpmail.ru wordpress WP Mail

Отложенная отправка писем в WordPress: настройка и примеры

Отправка электронных писем — важная часть работы многих сайтов на 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 популярных почтовых провайдеров.

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее