Не люблю я подписки, но тут пришлось сделать рассылку. Выпуск формируется автоматом, все как надо, но суть не в этом. Естественно надо дать возможность отписаться. Причем отписаться в один клик. Вот решил наработкой поделиться. [spoiler]
Я кстати объявил бойкот тутошнему движку и не собираюсь здесь коды писать
Сразу скажу, что работает только на схеме "персонально каждому подписчику", но я удивлюсь, если кто-то отправляет иначе, если только не группа людей.
2. В init.php помещаем данный код: http://www.d-it.ru/other/?f=unsubscri...e_init.php В GetMailHash советую добавить свою соль, зачем это применяется - опишу чуть ниже. Причем менять только раз и никогда больше.
3. Кидаем компонент на страницу отписки. Скачать его можно тут.
Теперь вкратце как работает алгоритм.
Перед отправкой выпуска каждому конкретному подписчику с помощью кода в init.php подменяются маски - ID подписки и код, основанный на хеше. По идее там можно что угодно написать, главное чтобы злоумышленник не догадался. Хотя, пару mail+ID уже сложно угадать.
Когда пользователь переходит по ссылке, проверяется соответствие хеш+пара (опять с помощью данной функции хеша) и его отписывают. Ему выводится сообщение (после проверки кода и хеша)
Вы действительно хотите отписаться от рассылки на адрес ******? Для подтверждения нажмите эту ссылку.
Если он жмет ссылку, то происходит отписка, вот и вся наука.
зайдите по адресу: 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С-Битрикс».