Всем привет! Последнее время я активно занимаюсь доработкой своего блога (который вы сейчас читаете) и в данный момент я решил реализовать механизм подписки читателей на уведомления о новых постах по электронной почте. Перебрав огромное количество вариантов решения этой проблемы я остановился на старом добром плагине под названием Subscribe2. Он позволяет пользователям подписываться только на те категории, которые им интересны, фильтровать посты от определённых авторов и имеет большое число различных настроек, которыми не могут похвастать другие плагины. Подробнее об установке и настройке его и других плагинов и решений, которыми пришлось воспользоваться для внедрения email-уведомлений я постараюсь рассказать в другой раз, сейчас же акцентирую внимание на копании в PHP-коде подопытного, т.к. в моём случае это единственный вариант совершить задуманное.
Вводная
Вообще говоря, прямое редактирование файлов плагина - не всегда хорошая идея: при обновлении изменения затрутся и всё вернётся на круги своя. Но дело в том, что, хоть старый автор плагина и передал бразды его разработки новой команде разработчиков за неозвученную сумму денег, эта новая команда, как видно, не спешит его обновлять: последний раз это было сделано 11 месяцев назад, то есть почти целый год. Я не собираюсь ждать у моря погоды и тешить себя надеждами, что когда-нибудь на них снизойдёт манна небесная и они таки-решатся выпустить новую версию - я хочу результата именно здесь и сейчас, поэтому и приступаю к действию, чего и вам совветую!
Кстати, для редактирования файлов плагина я использую редактор Adobe Brackets (на скриншоте) и плагин к нему eqFTP для заливки файлов на хостинг.
Отправка уведомлений незарегистрированным подписчикам только из определённых категорий
Да, вот такой длиннючий заголовок! Сперва может показаться, что такой функционал там есть и именно за него отвечает данный блок в настройках плагина:
Шо, думаете, это оно и есть? Ха, я тоже так думал... Да хрен там плавал! Красным по серому написано: "Публикации, относящиеся к исключённым рубрикам, не генерируют оповещений и не включаются в обзорные оповещения". АААААА, вот оно чё, Михалыч! После того, как я вдумался в эту фразу, всё стало понятным: если запись З находится в рубриках А, Б и В, и если хоть одна из этих рубрик отмечена тут галочкой - оповещение по ней отправлено не будет!
ИМХО это глупо: ведь если человеку, например, интересна рубрика "Мои стихи", а я напишу какой-нибудь там стишок про мовиль, который находится и в "Авто" и в "Моих стихах" - всё, никаких уведомлений ему по этому стишку не придёт. То есть в ситуациях, когда у записи будет больше одной категории (рубрики) - могут появляться такие казусы. Исправляем!
Находим в файле class-s2-core.php начиная с 404й строки следующий фрагмент:
$check = false; // is the current post assigned to any categories // which should not generate a notification email? foreach ( explode(',', $this->subscribe2_options['exclude']) as $cat ) { if ( in_array($cat, $post_cats) ) { $check = true; } }
Что мы тут видим? Изначально переменная $check у нас false. Если она каким-то волшебным образом становится true - уведомление незарегенным юзерам не шлётся. А может и остальным (это выясняется дальше по коду, нам не важно).
Что происходит в этом коде? Тут поэлементно переберается массив галочек со скриншота выше, и если хоть одна отмеченная категория есть у сабжевого поста - всё, бабуля, приехали!
Нам же нужен немного другой алгоритм: $check мы сделаем сразу тру (ведь мы же с вами тру кулхацкеры, чё там ) и будем сравнивать уже не бульдога с носорогом, а... носорога с бульдогом:
$check = true; //Если тру - значит не отправляем! foreach ( $post_cats as $cat ) { if ( !in_array($cat, explode(',', $this->subscribe2_options['exclude'])) ) { $check = false; } }
То есть перебираем все категории нашего поста, и если хоть одной из них нет в массиве галочек - таможня даёт добро, присваем $check значение false. Старый код я просто закомментировал, вдруг ещё понадобится.
Переопределение формата писем для любых подписчиков
Хитрый автор плагина сделал так, что незарегистрированным пользователям могут приходить только письма в формате Plain Text, то есть голый текст, без какой бы то ни было HTMLьки (мол, покупайте Subscribe2 HTML если хотите такой функционал). Для зарегистрированных пользователей можно выбрать формат писем по умолчанию, но у них есть возможность самостоятельно переопределить эту настройку. Для меня тут вырисовываются две проблемы:
- Я хочу, чтобы все письма были в формате HTML. Ну серьёзно, 2016 год на дворе как-никак
- Я не хочу, чтобы люди получали полные посты по почте. Всё равно они будут некрасивые и криво отформатированные. Пусть люди читают их в блоге!
Значит открываем тот же самый class-s2-core.php и начиная с приблизительно 613й строки видим там следующее:
// Registered Subscribers first // first we send plaintext summary emails $recipients = $this->get_registered("cats=$post_cats_string&format=excerpt&author=$post->post_author"); $recipients = apply_filters('s2_send_plain_excerpt_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $plain_excerpt_body); // next we send plaintext full content emails $recipients = $this->get_registered("cats=$post_cats_string&format=post&author=$post->post_author"); $recipients = apply_filters('s2_send_plain_fullcontent_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $plain_body); // next we send html excerpt content emails $recipients = $this->get_registered("cats=$post_cats_string&format=html_excerpt&author=$post->post_author"); $recipients = apply_filters('s2_send_html_excerpt_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $html_excerpt_body, 'html'); // next we send html full content emails $recipients = $this->get_registered("cats=$post_cats_string&format=html&author=$post->post_author"); $recipients = apply_filters('s2_send_html_fullcontent_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $html_body, 'html'); // and finally we send to Public Subscribers $recipients = apply_filters('s2_send_public_subscribers', $public, $post->ID); $this->mail($recipients, $subject, $plain_excerpt_body, 'text');
Тут тема такая - плагин готовит все 4 варианта письма (хтмл полный/выдержка и текст полный/выдержка), и потом рассылает сначала 4 варианта зарегистрированным пользователям, в зависимовсти от выбранной ими настройки в профиле, и потом голый текст незарегистрированным. Тут-то мы и вмешаемся.
На самом деле тут каждый блок кода состоит из двух частей: сначала формируется список получателей и потом, последней строчкой, этому списку засылается нужный вариант письма. Для себя я решил сделать так: незарегистрированным слать выдержку в HTML, а зарегистрированным предлагать только выдержку, но на выбор HTML или текст, соответственно, код у меня получился такой:
// Registered Subscribers first // first we send plaintext summary emails $recipients = $this->get_registered("cats=$post_cats_string&format=excerpt&author=$post->post_author"); $recipients = apply_filters('s2_send_plain_excerpt_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $plain_excerpt_body); // next we send plaintext full content emails $recipients = $this->get_registered("cats=$post_cats_string&format=post&author=$post->post_author"); $recipients = apply_filters('s2_send_plain_fullcontent_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $html_excerpt_body, 'html'); // next we send html excerpt content emails $recipients = $this->get_registered("cats=$post_cats_string&format=html_excerpt&author=$post->post_author"); $recipients = apply_filters('s2_send_html_excerpt_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $html_excerpt_body, 'html'); // next we send html full content emails $recipients = $this->get_registered("cats=$post_cats_string&format=html&author=$post->post_author"); $recipients = apply_filters('s2_send_html_fullcontent_subscribers', $recipients, $post->ID); $this->mail($recipients, $subject, $html_excerpt_body, 'html'); // and finally we send to Public Subscribers $recipients = apply_filters('s2_send_public_subscribers', $public, $post->ID); $this->mail($recipients, $subject, $html_excerpt_body, 'html');
Теперь, чтобы почувствовать себя великим оптимизатором, также нужно закомментировать расположенную чуть выше по коду генерацию ненужных вариантов писем, дабы меньше нагружать наш хостинг:
// remove excess white space from with $excerpt and $plaintext $excerpt = preg_replace('|[ ]+|', ' ', $excerpt); //$plaintext = preg_replace('|[ ]+|', ' ', $plaintext); // prepare mail body texts $plain_excerpt_body = str_replace("{POST}", $excerpt, $mailtext); //$plain_body = str_replace("{POST}", $plaintext, $mailtext); //$html_body = str_replace("\r\n", "<br />\r\n", $mailtext); //$html_body = str_replace("{POST}", $content, $html_body); $html_excerpt_body = str_replace("\r\n", "<br />\r\n", $mailtext); $html_excerpt_body = str_replace("{POST}", $html_excerpt, $html_excerpt_body); if ( $preview != '' ) { $this->myemail = $preview; $this->myname = __('Plain Text Excerpt Preview', 'subscribe2'); $this->mail(array($preview), $subject, $plain_excerpt_body); //$this->myname = __('Plain Text Full Preview', 'subscribe2'); //$this->mail(array($preview), $subject, $plain_body); $this->myname = __('HTML Excerpt Preview', 'subscribe2'); $this->mail(array($preview), $subject, $html_excerpt_body, 'html'); //$this->myname = __('HTML Full Preview', 'subscribe2'); //$this->mail(array($preview), $subject, $html_body, 'html'); }
Там же можно отключить добавление в текст письма кнопок Фейсбука и Твиттера, закомментировав следующие строки:
$social = apply_filters('s2_social_links', array('facebook', 'twitter')); if ( !empty($social) ) { $social_buttons = $this->social_buttons($social); $content .= $social_buttons; $html_excerpt .= $social_buttons; }
Выше по коду в поисках других кандидатов на отключение я решил не лазить, но если вы что-то ещё найдёте - обязательно напишите в комментариях!
Теперь осталось только убрать отключённые нами варианты в интерфейсе управления подпиской, для этого в файле your_subscriptions.php мотаем до if`а на 110й строке и в нём отключаем пары ставших ненужными строк. У меня получилось вот так:
echo __('Receive email as', 'subscribe2') . ": "; //echo "<label><input type=\"radio\" name=\"s2_format\" value=\"html\"" . checked(get_user_meta($user_ID, $this->get_usermeta_keyname('s2_format'), true), 'html', false) . " />"; //echo " " . __('HTML - Full', 'subscribe2') ."</label> "; echo "<label><input type=\"radio\" name=\"s2_format\" value=\"html_excerpt\"" . checked(get_user_meta($user_ID, $this->get_usermeta_keyname('s2_format'), true), 'html_excerpt', false) . " />"; echo " " . __('HTML - Excerpt', 'subscribe2') . "</label> "; echo "<label><input type=\"radio\" name=\"s2_format\" value=\"post\"" . checked(get_user_meta($user_ID, $this->get_usermeta_keyname('s2_format'), true), 'post', false) . " />"; //echo " " . __('Plain Text - Full', 'subscribe2') . "</label> "; //echo "<label><input type=\"radio\" name=\"s2_format\" value=\"excerpt\"" . checked(get_user_meta($user_ID, $this->get_usermeta_keyname('s2_format'), true), 'excerpt', false) . " />"; echo " " . __('Plain Text - Excerpt', 'subscribe2') . "</label><br /><br />\r\n";
Вот и всё, теперь подписчики будут получать письма только в разрешённых нами форматах!
Скрыть автора публикации из настроек подписки
Речь идёт о последнем пункте собственных настроек подписки "Не отправлять уведомления о публикациях, сделанных данными авторами". Там выбираются авторы, о публикациях которых подписчик не будет получать оповещения. Проблема в том, что иногда в блоге присутствуют "левые" учётки для различных целей, под которыми и так ничего не постится, но которые имеют право на публикацию. Например, для того, чтобы отправлять письма с помощью Subscribe2, мне пришлось создать нового администратора с именем ФрогоБлог и выбрать его в настройках плагина, чтобы уведомления рассылались от его имени и с его почтового ящика. Но проблема в том, что если его оставить в "Пользователях" - он не будет появляться в выпадающем списке, поэтому пришлось назначить ему роль повыше, с которой он благополучно появился в вышеуказанном списке.
Чтобы убрать этот срам с глаз долой и с сердца вон, откроем файл class-s2-admin.php и на 499й строке содержимое оператора foreach обернём в условный оператор if, в котором укажем айдишники неуместных пользователей:
foreach ( $all_authors as $author ) { if ($author->ID != '4') { if ( $i >= $half && 0 == $j ) { echo "</td><td style=\"width: 50%; text-align: left;\">\r\n"; $j++; } if ( 0 == $j ) { echo "<label><input class=\"checkall_author\" type=\"checkbox\" name=\"author[]\" value=\"" . $author->ID . "\""; if ( in_array($author->ID, $selected) ) { echo " checked=\"checked\""; } echo " /> " . $author->display_name . "</label><br />\r\n"; } else { echo "<label><input class=\"checkall_author\" type=\"checkbox\" name=\"author[]\" value=\"" . $author->ID . "\""; if ( in_array($author->ID, $selected) ) { echo " checked=\"checked\""; } echo " /> " . $author->display_name . "</label><br />\r\n"; $i++; } } }
Как видно, в моём случае это айдишник '4'. Если вы не в курсе, айдишник юзера можно узнать, наведя на него мышкой в админке: он будет в параметре user_id.
Кнопка "Подписаться на всё" в настройках подписок пользователя подписывает на всё, кроме исключённых рубрик
Что вы, думали, что я не придумаю заголовок, длиннее самого первого? Как бы не так! Но перейдём от слов к делу: когда наш дорогой зарегистрированный подписчик нажимает у себя в профиле на кнопку "Подписаться на всё" (если, конечно, она включена в настройках Subscribe2), он, конечно ожидает что бы вы думали? Конечно подписку на всё! Но все его воодушевлённые ожидания разбиваются о скалы суровой реальности: вместо этого подписка происходит на всё*!
*За исключением рубрик, которые в настройках плагина отмечены как исключённые.
Ага, там нет такой сноски, я вообще сначала думал, что эта кнопка тупо не работает, т.к. я оставил подписку по умолчанию только на две рубрики и не замечал появляющиеся на них галочки после нажатия на эту злосчастную кнопку.
Короче, я хочу, чтобы эта кнопка делала именно то, что на ней написано: подписывала пользоавтеля на абсолютно все рубрики. Решение элементарное - сначала находим в class-s2-core.php функцию one_click_handler($user_ID, $action) и добавляем к ней необязательный параметр $exclude = false как у следующей за ней функцией all_cats и используем этот параметр в вызове этой функции парой строчек ниже, уот так уот:
function one_click_handler($user_ID, $action, $exclude = true) { if ( !isset($user_ID) || !isset($action) ) { return; } $all_cats = $this->all_cats($exclude);
Благодаря такому ходу конём мы сможем менять поведение этой функции в месте её вызова, на случай, если она используется где-то ещё. В данном случае нас интересует её вызов на 84й строке файла your_subscriptions.php, к которомы мы просто дописываем ещё один параметр false:
} elseif ( isset($_POST['subscribe']) ) { $this->one_click_handler($user_ID, 'subscribe', false); } elseif ( isset($_POST['unsubscribe']) ) { $this->one_click_handler($user_ID, 'unsubscribe');
Таким образом поведение этой функции изменится только здесь и его можно всегда изменить обратно, достаточно лишь убрать добавленный параметр или изменить его на true.
Запрет ручной отправки писем пользователями с определёнными ролями
Быстрая доработка - в самом начале файла send_email.php добавляем дополнительное условие в оператор if:
if ( !function_exists('add_action') || !current_user_can('import') ) { exit(); }
Таким образом, если текущий залогиненный юзер не может делать 'import', а это все, кроме админов - мы сразу выходим. Подробную инфу мы можете погуглить по названию функции current_user_can().
Этот твик отключит сам функционал и страницу этого пункта меню, но сам пункт останется. Чтобы и его не отображать, открываем class-s2-admin.php и там в самом начале находим следующие строки:
$s2mail = add_submenu_page('s2', __('Send Email', 'subscribe2'), __('Send Email', 'subscribe2'), apply_filters('s2_capability', "publish_posts", 'send'), 's2_posts', array(&$this, 'write_menu')); add_action('load-' . $s2mail, array(&$this, 'mail_help')); $s2nonce = wp_hash('subscribe2');
По идее достаточно просто обернуть это в такой же оператор выбора, как мы делали в предыдущем шаге, и всё будет работать как надо:
if ( current_user_can('import') ) { $s2mail = add_submenu_page('s2', __('Send Email', 'subscribe2'), __('Send Email', 'subscribe2'), apply_filters('s2_capability', "publish_posts", 'send'), 's2_posts', array(&$this, 'write_menu')); add_action('load-' . $s2mail, array(&$this, 'mail_help')); $s2nonce = wp_hash('subscribe2'); }
Только надо не забыть убрать отрицание (!), так так тут логика должна работать с точностью до наоборот.
Редактирование кода виджета подписки
Сдандартный виджет был очень лаконичным и не соответствовал моим требованиям: надо же объяснить людям, на что они подписываются в данный момент и рассказать о том, что они могут пописаться на всё, что угодно, просто зарегистрировавшись. Да, в backend-настройках самого виджета есть два поля для добавления кода перед и после его содержимого. Но дело в том, что содержимое-то по мере взаимодействия с виджетом меняется, а содержимое этих полей выводится постоянно. То есть какой смысл сообщать людям, что они могут зарегистрироваться, если они уже зарегистрировались и виджет пишет, что изменить настройки можно в личном профиле? Да, можно написать костыль на JavaScript, который будет всё это исправлять, но зачем лечить симптомы, если мы можем легко вылечить саму болезнь?
Переходим к файлу class-s2-frontend.php и открываем его для редактирования. В самом его начале мы видим функцию load_strings(), которая отвечает за подгрузку строк из файла перевода. В неё я добавил 2 строки before_input и after_input, в которых содержится код, выводимый перед и после формы подписки соответственно. Также я немного изменил строку profile - это проще, чем менять сам перевод.
function load_strings() { $this->before_input='Быстрая подписка на рубрики "<a href="https://блог.фанфрог.рф/category/%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d0%b9-%d1%81%d0%b0%d0%bc">Сделай сам!</a>" и "<a href="https://блог.фанфрог.рф/category/%d1%84%d0%be%d1%82%d0%ba%d0%b8">ФотоБлог</a>":'; $this->after_input='Для подписки на другие рубрики и управления своими настройками, пожалуйста, <a href="https://блог.фанфрог.рф/wp-login.php?action=register">зарегистрируйтесь</a>!'; $this->please_log_in = "<p class=\"s2_message\">" . sprintf(__('To manage your subscription options please <a href="%1$s">login.</a>', 'subscribe2'), get_option('siteurl') . '/wp-login.php') . "</p>"; $this->profile = 'Управлять параметрами подписки вы можете в <a href="https://блог.фанфрог.рф/go/'.get_option('siteurl').'/wp-admin/admin.php?page=s2" target="_blank">своём профиле</a>.';
Но чтобы эти изменения начали использоваться пришлось также заюзать эти строки в самом коде вывода формы на страницу:
// build default form if ( 'true' == strtolower($args['nojs']) ) { $this->form = "<form method=\"post\"" . $action . "><input type=\"hidden\" name=\"ip\" value=\"" . $_SERVER['REMOTE_ADDR'] . "\" />" . $antispam_text . "<label for=\"s2email\">" . $this->before_input . "</label><br /><input type=\"text\" name=\"email\" id=\"s2email\" value=\"" . $value . "\" size=\"" . $args['size'] . "\" />" . $this->input_form_action . "</form>".$this->after_input; } else { $this->form = "<form method=\"post\"" . $action . "><input type=\"hidden\" name=\"ip\" value=\"" . $_SERVER['REMOTE_ADDR'] . "\" />" . $antispam_text . "<label for=\"s2email\">" . $this->before_input . "</label><br /><input type=\"text\" name=\"email\" id=\"s2email\" value=\"" . $value . "\" size=\"" . $args['size'] . "\" onfocus=\"if (this.value == '" . $value . "') {this.value = '';}\" onblur=\"if (this.value == '') {this.value = '" . $value . "';}\" /><div id='subscribeButtons'>" . $this->input_form_action . "</div></form>\r\n".$this->after_input; }
Благодаря этим несложным манипуляциям и мощному (ну, так себе ) CSS-колдунству я добился следующего результата:
Вот, вроде бы, и все правки, которые мне пришлось внести в код этого замечательного плагина. Вам пришлось делать что-то ещё, или у вас не получается что-то из вышеописанного? Не стесняйтесь, пишите в комментариях, я обязательно отвечу!
У меня один вопрос.
Можно ли сделать отписку от публикаций для незарегистрированных пользователей без регистрации? Как подписывались, вбив только свой мэйл, так и отписались вбив свой мэйл.
Конечно, оно так и работает! Смотрите форму у меня в сайдбаре!
не подписаться, а отписаться чтобы от рассылки можно было просто вбив почту. пишет To manage your subscription options please login.
Я у себя ещё вчера проверил сразу же после вашего коммента - ввожу ящик - приходит на почту письмо со ссылкой для подтверждения, по ней подписывается. Потом ввожу этот же ящик, нажимаю "Отписаться" - приходит опять письмо со ссылкой для подтверждения. Попробуйте у меня провернуть эту операцию.
да, работает четко. так по скрипту изменить нужно как написано выше? или в настройках подписчика самого устанавливается? Если не сложно напиши подробнее, заранее спасибо.
Да это штатный функционал же вроде как. Статью я писал тогда же, когда этим всем занимался, и если в ней про эту функцию ничего не сказано - значит она работала "из коробки" и я для неё ничего не дописывал по идее... Щас трохи бухой, пошарил по настройках плагина - из них вроде как следует, что это всё само собой разумеется. Я вот только не могу вспомнить по поводу последнего куска кода, перед моими итоговыми скринами виджета. Может, в них собака зарыта?
Аааа, вроде догнал, я туда просто переменные с текстом выше вставил. Так что нет, это не оно должно быть... Если что, у меня стоит версия плагина 10.21.
у меня просто в принципе регистрации на сайте нет
Короче, в файле class-s2-frontend.php начиная со 131й строчки идёт определение действий плагина после нажатия на кнопки "Подписаться" и "Отписаться" в т.ч. для незарегистрированных пользователей - это штатное описание, значит 100% это было предусмотрено изначально. Попробуй поковырять настройки, если никак - пиши завтра днём, поставлю плагин на локальную копию блога и на светлую голову посмотрю что к чему.
Удалил полностью плагин и поставил заново, всё заработало. хз в чем была проблема.
Ну и отлично!
Отдельное Спасибо за помощь !
В общем все понятно и работает. Но уведомление о новом посте в подписанной рубрике юзеру автоматически не приходит.
Я правильно понимаю, что уведомление уходит при нажатии "Опубликовать"?
Ну да, там же ещё в редакторе внизу должна быть снята галочка с поля Subscribe 2.
О! А может проблема с доставкой почты? Советую плагин Postman SMTP, в нём есть журнал отправленной корреспонденции, классная штука!
Во-первых спасибо за Postman STP. Действительно супер-инструмент. Благодаря журналу, я понял, чтоуведомление не уходит из-за неправильной декодировки адреса
Reply-To. Но, что именно неправильно я не понял. Я снял опцию отправки сообщения админу. Не помогло.
Reply-To - это адрес, на который будет по умолчанию отправляться ответ на письмо. Когда кто-то пишет комментарий, мне приходит уведомление на почту и в Reply-To указано мыло комментатора. Когда я отвечаю, комментатору идёт письмо, в Reply-To которого указано noreply@фанфрог.рф
Т.е, если с сайта отправляется уведомление от админ@адр_сайта, то в replay-to должен стоять, как минимум админ@адр_сайта?
И где это можно увидеть/настроить?
В настройках Postman SMTP, "показать все настройки" и там во второй вкладке у меня прописан этот ящик. Проблема у вас, наверное, в настройках постмана, поковыряйте его. И там же в нём можно тестовое письмо отправить, что как раз и покажет, в каком плагине проблема.
Спасибо. Тестовое письмо отправляется успешно с reply-to или без него. А уведомление нет.

Я закомментировал строчки 309 и 312 в файле class-s2-core.php. Уведомление отправилось. Но
Отправилось только одному юзеру, хотя на категорию подписано несколько. Будем искать
Удачи! Если не получится - помогу, вместе разберёмся. Только не сегодня)
Привет,
подскажите, как показать подписки вне консоли. Например, на отдельной странице?
Привет! Например через $wpdb вытащить из базы данных, таблица wp_subscribe2.
Здравствуйте, подскажите, как изменить стили письма?
Здравствуйте. Вечером буду за компом - посмотрю. Щас с ходу ничего не помню - давно это было...
Блин, совсем забыл посмотреть, извиняюсь! Вы ж про CSS, правильно? Возьмите просто в шаблон вставьте нужные стили с помощью тега style.
"Здравствуйте, подскажите, как изменить стили письма?" - Тоже интересно узнать, а то уже сижу несколько дней и пытаюсь поймать эту фичу
А точнее включить HTML разметку для писем на подписку и отписку.
Если будет возможность, взгляните пожалуйста! Буду очень благодарен!
Здравствуйте! Про стили написал в комментарии 8.2, а про разметку HTML - в статье ж как раз это и описывается в разделе "Переопределение формата писем для любых подписчиков".