Не люблю я подписки, но тут пришлось сделать рассылку. Выпуск формируется автоматом, все как надо, но суть не в этом. Естественно надо дать возможность отписаться. Причем отписаться в один клик. Вот решил наработкой поделиться. [spoiler]
Я кстати объявил бойкот тутошнему движку и не собираюсь здесь коды писать
Сразу скажу, что работает только на схеме "персонально каждому подписчику", но я удивлюсь, если кто-то отправляет иначе, если только не группа людей.
2. В init.php помещаем данный код: http://www.d-it.ru/other/?f=unsubscri...e_init.php В GetMailHash советую добавить свою соль, зачем это применяется - опишу чуть ниже. Причем менять только раз и никогда больше.
3. Кидаем компонент на страницу отписки. Скачать его можно тут.
Теперь вкратце как работает алгоритм.
Перед отправкой выпуска каждому конкретному подписчику с помощью кода в init.php подменяются маски - ID подписки и код, основанный на хеше. По идее там можно что угодно написать, главное чтобы злоумышленник не догадался. Хотя, пару mail+ID уже сложно угадать.
Когда пользователь переходит по ссылке, проверяется соответствие хеш+пара (опять с помощью данной функции хеша) и его отписывают. Ему выводится сообщение (после проверки кода и хеша)
Вы действительно хотите отписаться от рассылки на адрес ******? Для подтверждения нажмите эту ссылку.
Если он жмет ссылку, то происходит отписка, вот и вся наука.
Респект автору!!! Спасибо за разъяснение и компонент, это очень хорошее дополнение основному функционалу. а то до этого после каждой рассылки сделанной нашими маркетологами мне сыпались гневные письма пользователей. Вообще уже не один наворот на сайте делал благодаря постам Антона, все работает на ура! Еще раз огромное спасибо автору!
Простите за не проф. вопрос. В какой файл необходимо добавить эту информацию и где можно будет просмотреть статистику? В остльном все работает просто и гениально. Спасибо.
Помогите пожалуйста новичку! Вроде бы делаю все правильно, но не работает механизм отписки и все тут Возможно ошибка в каких-то других моих действиях: В init.php код был добавлен, компонент скопирован в директорию bitrix/components/demo/ В директории personal/ создается файл unsubscribe.php, на эту страницу помещается компонент. В выпуск вставляется ссылка вида http://site.ru/personal/unsubscribe/?...#MAIL_MD5# В результате по клику открывается браузер с страницей 404 и больше ничего не происходит. Хотя, как я понимаю, у подписчика после этого должна быть снята галочка на данную подписку?
Почитать пост еще раз =) - должно помочь. Все работает и на 10-ке. Без проблем. /unsubscribe/ если Вы пользуете папку, то в ней должен быть индексный файл с компанентом отписки /unsubscribe.php - если пользуете просто файл - тогда именно в нем должнен быть компанент отписки.
Бредятина вида: /unsubscribe.php/ - это уже перебор по всем статьям!
да права 777 стоят на обе папки. я уже и с файлом unsubscribe.php пробовал и папку unsubscribe с компонентом размещал в файлы index.php b .section по аналогии с другими компонентами. я думаю тут не в коде уже проблема..хотя кто его знает! Все равно вылазит сообщение "Подписка не найдена"..хм
зайдите по адресу: http://vash_site.ru/personal/ - без авторизации, если будет 404 - смотрите настрофки доступа, только СМСки, а не права самих файлов. Добавил: если пишет что не найдена подписка смотрите сам компонент, и поймите при каком случае эта ошибка выводится, соответственно поправите у себя (компонент править не нада). А вообще файл должен выглядеть так:
Сразу вылезло "Хотите ли вы отписаться бла-бла-бла"...правда при нажатии на ссылки и при выдаче сообщениря что я отписан..я все равно остаюсь в Подписчиках.
Спасибо за решение. Странно, что в движке это не предусмотрели:(
1. Подскажите, пожалуйста, в какой init.php вставлять код? У меня их 3: . .\bitrix\modules\sitestore\install\wizards\bitrix\store\site\services\main\bitrix\init.php . .\bitrix\php_interface\init.php . .\bitrix\wizards\bitrix\demo\public_files\ru\bitrix\php_interface\init.php
2. Поясните, пожалуйста, подробнее, что значит "3. Кидаем компонент на страницу отписки."? Куда надо скопировать файлы из архива и что с ними надо сделать?
а API какое-нибудь есть чтобы в момент формирования выпуска выдёргивать шапку и подвал из модуля "Почтовые шаблоны расширенные". Хотелось бы чтобы в одном месте они были...
Я бы предложил не хешировать и не солить email, а вместо этого использовать код подтверждения подписки, который для каждой подписки уникален и формируется случайным образом при добавлении подписки. Тогда класс SubscribeHandlers становится ненужным и можно обойтись только одной функцией BeforePostingSendMailHandler. Или есть какие-то подводные камни с точки зрения безопасности?
Да и наверно ссылку для отписки удобней будет целиком формировать в функции BeforePostingSendMailHandler, чтобы контент-менеджер потом вставлял в выпуск что-то типа #UNSUBSCRIBE_LINK# вместо http:// www.site.ru/personal/unsubscribe/?mid=#MAIL_ID#&mhash=#MAIL_MD5#
Чернаков Константин написал: Или есть какие-то подводные камни с точки зрения безопасности?
Ну есть такой небольшой камешек безопасности. С помощью данного кода некто может потом войти и _подписаться_ на какие-то рассылки, или поменять мыл. Если на сайте стоит такой компонент конечно. Но это чисто похулиганить. Хотя хулиганство лучше не допускать тоже.
Чернаков Константин написал: Да и наверно ссылку для отписки удобней будет целиком формировать в функции BeforePostingSendMailHandler
Долганин Антон написал: Ну есть такой небольшой камешек безопасности. С помощью данного кода некто может потом войти и _подписаться_ на какие-то рассылки, или поменять мыл. Если на сайте стоит такой компонент конечно. Но это чисто похулиганить. Хотя хулиганство лучше не допускать тоже.
А, ну это не страшно. В моем случае владельцы сайта будут только рады, что кто-то обратно подписался на их рассылку. А сменить мыло не получится, т.к. во всех компонентах управления рассылкой проверяется пара "мыло-код", точнее подписчик выбирается по мылу. В любом случае, спасибо за код, и за сэкономленную кучу времени.
спасибо, наконец то получилось. только один нюанс, чтобы вся эта красота работала, человек должен быть в подписчиках, хоть и анонимных. если отправить рассылку не подписчикам, а всем зарегестрированным, то не и не работает отписка. вопрос, как это решить? спасибо
Новиков Денис написал: если отправить рассылку не подписчикам, а всем зарегестрированным, то не и не работает отписка.
Денис, так в самом слове "отписка" кроется ответ - должна идти прежде "подписка". К сожалению, для неподписчиков механизм работать не будет. Кроме как сначала их сделать подписчиками. Но это уже другая задача.
Долганин Антон, да, спасибо, это уже понял))Отсюда два вопроса. Как существующих пользователей добавить в подписчики. И как чтоб все новые регистровались когда, подписка вставала автоматом
Алексей, имеешь в виду методы? По идее что-то из этой оперы http://bxapi.ru/club/user/1/blog/63592/ Но вообще я бы рекомендовал взять штатный компонент модуля и посмотреть его внутренности.
Антон Долганин, да, мысль - посмотреть исходники... А с учетом того что там и статистика собирается, наверное действительно лучше сам компонент чтоли переделать на "быструю" отписку... Спасиб за подсказку.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».