Отправка писем 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 не может обновиться? Теперь вы узнаете об этом мгновенно, даже если почта лежит или письмо попало в спам.
Настройка плагина: проще простого
- Установка: Скачайте плагин Telegram Mail Notifier с
официального сайта
или из репозитория WordPress
- Активация: Включите плагин через меню «Плагины» в админке WordPress
- Настройка: Перейдите в «Инструменты → Telegram Mail»
- Создание бота: Если у вас еще нет бота, напишите @BotFather в Telegram и создайте его командой /newbot
- Подключение: Вставьте полученный токен бота и ваш Chat ID (можно узнать у @userinfobot)
- Тестирование: Нажмите кнопку «Отправить тестовое сообщение» и убедитесь, что все работает
Готово! Теперь все важные письма будут приходить прямо в 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, но вы можете настроить это поведение в расширенных настройках.