Свежие статьи

Отправка писем WordPress в Telegram бота с фильтрацией и настройками

Отправка писем WordPress в Telegram бота с фильтрацией и настройками

Рождение идеи: от сниппета до плагина

Всё началось с классической проблемы владельца сайта: «Почему я узнаю о новом заказе спустя три часа после его оформления?!» Знакомо, правда? Электронная почта — штука ненадежная. Письма попадают в спам, теряются среди рекламы или просто приходят с задержкой, когда клиент уже ушел к конкурентам.

Изначально решение было простым — небольшой сниппет кода в functions.php:

/**
 * Отправка почты WordPress в Telegram бота. Код рабочий поместите в конец файла functions.php вашей дочерней темы
 */

// Добавляем страницу настроек в раздел "Инструменты"
add_action('admin_menu', 'telegram_mail_add_admin_menu');
function telegram_mail_add_admin_menu() {
    add_management_page(
        'Настройки Telegram бота',
        'Telegram Mail',
        'manage_options',
        'telegram-mail-settings',
        'telegram_mail_settings_page'
    );
}

// Регистрируем настройки
add_action('admin_init', 'telegram_mail_register_settings');
function telegram_mail_register_settings() {
    register_setting('telegram_mail_settings', 'telegram_mail_bot_token');
    register_setting('telegram_mail_settings', 'telegram_mail_chat_id');
    register_setting('telegram_mail_settings', 'telegram_mail_admin_email');
}

// Страница настроек
function telegram_mail_settings_page() {
    if (!current_user_can('manage_options')) {
        return;
    }
    
    // Сохранение настроек
    if (isset($_POST['submit']) && check_admin_referer('telegram_mail_settings')) {
        update_option('telegram_mail_bot_token', sanitize_text_field($_POST['telegram_mail_bot_token']));
        update_option('telegram_mail_chat_id', sanitize_text_field($_POST['telegram_mail_chat_id']));
        update_option('telegram_mail_admin_email', sanitize_email($_POST['telegram_mail_admin_email']));
        echo '<div class="notice notice-success"><p>Настройки сохранены!</p></div>';
    }
    
    $bot_token = get_option('telegram_mail_bot_token', '');
    $chat_id = get_option('telegram_mail_chat_id', '');
    $admin_email = get_option('telegram_mail_admin_email', '');
    ?>
    <div class="wrap">
        <h1>Настройки Telegram бота для почты</h1>
        <form method="post" action="">
            <?php wp_nonce_field('telegram_mail_settings'); ?>
            <table class="form-table">
                <tr>
                    <th scope="row">
                        <label for="telegram_mail_bot_token">Токен бота</label>
                    </th>
                    <td>
                        <input type="text" 
                               id="telegram_mail_bot_token" 
                               name="telegram_mail_bot_token" 
                               value="<?php echo esc_attr($bot_token); ?>" 
                               class="regular-text"
                               placeholder="123456789:ABCdefGHIjklMNOpqrsTUVwxyz">
                        <p class="description">Получите токен у @BotFather в Telegram</p>
                    </td>
                </tr>
                <tr>
                    <th scope="row">
                        <label for="telegram_mail_chat_id">Chat ID</label>
                    </th>
                    <td>
                        <input type="text" 
                               id="telegram_mail_chat_id" 
                               name="telegram_mail_chat_id" 
                               value="<?php echo esc_attr($chat_id); ?>" 
                               class="regular-text"
                               placeholder="123456789 или @channel_username">
                        <p class="description">ID чата или канала (например: 123456789 или @your_channel)</p>
                    </td>
                </tr>
                <tr>
                    <th scope="row">
                        <label for="telegram_mail_admin_email">Email администратора</label>
                    </th>
                    <td>
                        <input type="email" 
                               id="telegram_mail_admin_email" 
                               name="telegram_mail_admin_email" 
                               value="<?php echo esc_attr($admin_email); ?>" 
                               class="regular-text"
                               placeholder="admin@example.com">
                        <p class="description">Письма будут отправляться в Telegram только если получатель - этот email</p>
                    </td>
                </tr>
            </table>
            <?php submit_button(); ?>
        </form>
        
        <div class="card" style="max-width: 600px; margin-top: 20px;">
            <h2>Как получить токен бота:</h2>
            <ol>
                <li>Откройте Telegram и найдите бота <strong>@BotFather</strong></li>
                <li>Отправьте команду <code>/newbot</code></li>
                <li>Следуйте инструкциям и получите токен</li>
                <li>Вставьте токен в поле выше</li>
            </ol>
            
            <h2>Как получить Chat ID:</h2>
            <ol>
                <li>Для личных сообщений: найдите бота <strong>@userinfobot</strong> и отправьте ему любое сообщение</li>
                <li>Для канала: добавьте бота как администратора канала и используйте @channel_username</li>
                <li>Или используйте бота <strong>@getidsbot</strong> для получения ID</li>
            </ol>
        </div>
    </div>
    <?php
}

// Функция для очистки текста от лишних пробелов и переносов строк
function telegram_mail_clean_text($text) {
    // Удаляем HTML теги и конвертируем в простой текст
    $text = wp_strip_all_tags($text);
    
    // Удаляем изображения (уже удалены через wp_strip_all_tags, но на всякий случай)
    $text = preg_replace('/\[img[^\]]*\].*?\[\/img\]/is', '', $text);
    $text = preg_replace('/<img[^>]*>/is', '', $text);
    
    // Удаляем HTML entities
    $text = html_entity_decode($text, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    
    // Нормализуем все виды пробелов и переносов строк
    // Заменяем все виды пробелов (табуляции, возврат каретки) на пробел
    $text = preg_replace('/[\t\r]+/u', ' ', $text);
    
    // Заменяем все переносы строк на пробелы (сначала)
    $text = preg_replace('/\n+/u', ' ', $text);
    
    // Заменяем множественные пробелы на один
    $text = preg_replace('/[ ]{2,}/u', ' ', $text);
    
    // Теперь добавляем переносы строк только в нужных местах для читаемости
    // После двоеточия, если следующее слово с большой буквы (заголовки)
    $text = preg_replace('/:\s+([А-ЯЁA-Z])/u', ":\n$1", $text);
    
    // После точки, если следующее слово с большой буквы и это начало нового предложения
    // Но только если перед точкой не число (чтобы не разрывать "1. Пункт")
    $text = preg_replace('/([^0-9])\.\s+([А-ЯЁA-Z][а-яёa-z]{2,})/u', "$1.\n$2", $text);
    
    // Удаляем пробелы в начале и конце всего текста
    $text = trim($text);
    
    // Финальная очистка - убираем множественные переносы (оставляем максимум 1)
    $text = preg_replace('/\n{2,}/u', "\n", $text);
    
    // Удаляем пробелы в начале и конце каждой строки
    $lines = explode("\n", $text);
    $lines = array_map('trim', $lines);
    $lines = array_filter($lines, function($line) {
        return !empty($line);
    });
    $text = implode("\n", $lines);
    
    return $text;
}

// Функция для отправки сообщения в Telegram
function telegram_mail_send_message($message) {
    $bot_token = get_option('telegram_mail_bot_token');
    $chat_id = get_option('telegram_mail_chat_id');
    
    // Проверяем наличие настроек
    if (empty($bot_token) || empty($chat_id)) {
        return false;
    }
    
    $url = "https://api.telegram.org/bot{$bot_token}/sendMessage";
    
    $data = array(
        'chat_id' => $chat_id,
        'text' => $message,
        'parse_mode' => 'HTML'
    );
    
    $response = wp_remote_post($url, array(
        'body' => $data,
        'timeout' => 10
    ));
    
    if (is_wp_error($response)) {
        error_log('Telegram Mail Error: ' . $response->get_error_message());
        return false;
    }
    
    return true;
}

// Статическая переменная для защиты от дублирования писем
$telegram_mail_sent = array();

// Перехватываем все письма WordPress (отключено, используем только phpmailer_init)
// add_filter('wp_mail', 'telegram_mail_intercept', 10, 1);

// Перехват через phpmailer_init (более надежный способ)
add_action('phpmailer_init', 'telegram_mail_phpmailer_intercept', 999);
function telegram_mail_phpmailer_intercept($phpmailer) {
    global $telegram_mail_sent;
    
    $bot_token = get_option('telegram_mail_bot_token');
    $chat_id = get_option('telegram_mail_chat_id');
    $admin_email = get_option('telegram_mail_admin_email', '');
    
    // Если настройки не заполнены, не перехватываем письма
    if (empty($bot_token) || empty($chat_id)) {
        return;
    }
    
    // Получаем адреса получателей
    $to_addresses = $phpmailer->getToAddresses();
    if (empty($to_addresses)) {
        return;
    }
    
    // Проверяем, есть ли среди получателей email администратора
    $admin_email_lower = strtolower(trim($admin_email));
    $is_admin_email = false;
    
    foreach ($to_addresses as $address) {
        $email = strtolower(trim($address[0]));
        if ($email === $admin_email_lower) {
            $is_admin_email = true;
            break;
        }
    }
    
    // Если письмо не адресовано администратору, не отправляем в Telegram
    if (empty($admin_email) || !$is_admin_email) {
        return;
    }
    
    // Получаем данные письма
    $to = implode(', ', array_column($to_addresses, 0));
    $subject = $phpmailer->Subject;
    $body = $phpmailer->Body;
    
    // Создаем уникальный ключ для проверки дублирования
    // Используем комбинацию получателя, темы и хеш тела письма
    $mail_hash = md5($to . $subject . $body);
    
    // Проверяем, не отправляли ли мы уже это письмо
    if (!isset($telegram_mail_sent)) {
        $telegram_mail_sent = array();
    }
    
    // Если письмо уже было отправлено, пропускаем
    if (in_array($mail_hash, $telegram_mail_sent)) {
        return;
    }
    
    // Добавляем хеш в список отправленных
    $telegram_mail_sent[] = $mail_hash;
    
    // Ограничиваем размер массива (храним последние 50 писем)
    if (count($telegram_mail_sent) > 50) {
        $telegram_mail_sent = array_slice($telegram_mail_sent, -50);
    }
    
    // Очищаем и форматируем тело сообщения
    $body_text = telegram_mail_clean_text($body);
    
    // Если после очистки текст пустой, не отправляем
    if (empty(trim($body_text))) {
        return;
    }
    
    // Форматируем сообщение для Telegram
    $subject_display = !empty($subject) ? $subject : 'Без темы';
    $telegram_message = "<b>📧 " . esc_html($subject_display) . "</b>\n\n";
    $telegram_message .= "<b>Кому:</b> " . esc_html($to) . "\n\n";
    $telegram_message .= "<b>Сообщение:</b>\n" . esc_html($body_text);
    
    // Отправляем в Telegram
    telegram_mail_send_message($telegram_message);
}

 

Этот код работал, но… Как говорится, аппетит приходит во время еды. Захотелось фильтровать письма по темам, поддерживать несколько адресов администраторов, добавить настройки через админку… И вот так, шаг за шагом, родился полноценный плагин Telegram Mail Notifier.

Кому пригодится Telegram Mail Notifier

Если вы узнали себя хотя бы в одном из этих пунктов, этот плагин для вас:

  • Владельцы интернет-магазинов: Узнавайте о новых заказах, пока они еще «горячие»
  • Администраторы сайтов: Получайте системные уведомления, не заглядывая в почту
  • Блогеры: Мгновенно реагируйте на комментарии и сообщения из форм
  • Фрилансеры: Управляйте уведомлениями с нескольких сайтов в одном месте
  • Команды разработки: Делитесь важными системными сообщениями с коллегами

И, конечно, все, кто устал от фразы «А я не видел это письмо» — теперь вы точно его увидите!

Как это работает: основные сценарии использования

Сценарий №1: WooCommerce на стероидах

Представьте: клиент оформляет заказ, а через секунду вы уже получаете уведомление в Telegram. Пока конкуренты проверяют почту раз в час, вы уже связались с клиентом и подтвердили заказ. Волшебство? Нет, просто хорошая автоматизация.

Сценарий №2: Мгновенная реакция на обратную связь

Потенциальный клиент заполняет форму на сайте с вопросом о ваших услугах. Вместо того чтобы это письмо затерялось среди десятков других, вы получаете аккуратное уведомление в Telegram и отвечаете через 5 минут. Клиент впечатлен вашей оперативностью!

Сценарий №3: Сайт под контролем 24/7

Ваш сайт пытаются взломать? Возникли проблемы с платежным шлюзом? WordPress не может обновиться? Теперь вы узнаете об этом мгновенно, даже если почта лежит или письмо попало в спам.

Настройка плагина: проще простого

  1. Установка: Скачайте плагин Telegram Mail Notifier с
    официального сайта

    или из репозитория WordPress

  2. Активация: Включите плагин через меню «Плагины» в админке WordPress
  3. Настройка: Перейдите в «Инструменты → Telegram Mail»
  4. Создание бота: Если у вас еще нет бота, напишите @BotFather в Telegram и создайте его командой /newbot
  5. Подключение: Вставьте полученный токен бота и ваш Chat ID (можно узнать у @userinfobot)
  6. Тестирование: Нажмите кнопку «Отправить тестовое сообщение» и убедитесь, что все работает

Готово! Теперь все важные письма будут приходить прямо в Telegram.

Продвинутые настройки для настоящих профи

Фильтрация — ваш лучший друг

Не хотите получать абсолютно все письма? Настройте фильтры:

  • Whitelist: Указывайте ключевые слова, и только письма с ними в теме будут отправляться в Telegram
  • Blacklist: Блокируйте спам и ненужные уведомления по ключевым словам

Несколько администраторов — не проблема

У вас команда из нескольких человек? Просто добавьте все email-адреса администраторов в настройках, по одному на строку, и все будут получать нужные уведомления.

Типы писем: выбирайте, что важно

Настройте отправку только определенных типов писем:

  • Уведомления WooCommerce
  • Сообщения из форм обратной связи
  • Системные уведомления WordPress
  • И другие типы писем

Реальные истории успеха

История Алексея, владельца интернет-магазина

«Раньше я проверял почту каждый час, боясь пропустить заказ. Теперь я получаю уведомления мгновенно и могу оперативно связаться с клиентом. Скорость обработки заказов выросла на 40%, а клиенты довольны быстрой реакцией.»

Опыт Марины, фрилансера

«Я веду 12 сайтов для разных клиентов. Проверять почту для каждого было кошмаром. Сейчас все важные уведомления приходят в один Telegram-канал, и я могу быстро реагировать на проблемы, не пропуская ничего важного.»

Кейс команды разработчиков «WebPro»

«Мы настроили отправку системных уведомлений в общий чат команды. Теперь все видят, когда возникают проблемы, и мы решаем их коллективно, не теряя времени на пересылку писем друг другу.»

Почему Telegram, а не что-то еще?

  • Скорость: Уведомления приходят мгновенно, в отличие от email
  • Надежность: Не попадает в спам и работает даже при проблемах с почтовыми серверами
  • Мобильность: Всегда с вами на смартфоне, даже когда вы не за компьютером
  • Гибкость: Можно настроить разные каналы для разных типов уведомлений
  • Интеграция: Работает с другими сервисами через Telegram-ботов

Как получить плагин уже сегодня

Telegram Mail Notifier доступен для скачивания и скоро появится в официальном репозитории WordPress.

Вместо заключения

Помните времена, когда для проверки почты нужно было запускать специальную программу? Потом мы перешли на веб-интерфейсы, а сейчас пришло время сделать следующий шаг — получать только важные уведомления там, где вам удобно.

Telegram Mail Notifier — это не просто плагин, это новый подход к работе с уведомлениями WordPress. Попробуйте — и вы уже не сможете вернуться к постоянной проверке почты.

А если у вас есть идеи по улучшению плагина или вопросы по его работе — не стесняйтесь писать! Ведь лучшие продукты создаются в диалоге с пользователями.

FAQ: Отвечаем на ваши вопросы

В: Может ли плагин отправлять вложения из писем? О: На данный момент плагин отправляет только текст писем, но мы работаем над поддержкой вложений в будущих версиях.

В: Как настроить отправку в групповой чат? О: Добавьте вашего бота в групповой чат, сделайте его администратором и укажите ID чата в настройках плагина.

В: Будет ли плагин работать с другими плагинами для форм? О: Да, плагин работает со всеми формами, которые используют стандартную функцию wp_mail() для отправки писем.

В: Ограничено ли количество уведомлений? О: Нет, вы можете получать неограниченное количество уведомлений, но помните о лимитах API Telegram (до 30 сообщений в секунду).

В: Как настроить форматирование текста в уведомлениях? О: Плагин автоматически очищает HTML и форматирует текст для лучшей читаемости в Telegram, но вы можете настроить это поведение в расширенных настройках.

СКАЧАТЬ ПЛАГИН>>>

Узнайте первым о выходе новых статей

Подпишитесь на рассылку чтобы получать проверенные полезные фишки по созданию сайтов. В хозяйстве пригодится, не пожелеете!

Друзья, если смог помочь, перечислите 100 рублей на постройку кораблей!

Запись на бесплатное пробное занятие

Вы очень любознательны. Иначе бы не нажали на эту кнопку