Как создать ссылку для отмены подписки на электронную почту
У меня есть простое приложение для рельсов, где пользователь может отправить массовое письмо на 10+ человек. В этом письме я хотел бы всегда иметь ссылку внизу, которую конечный пользователь может щелкнуть, чтобы отписаться от уведомлений. Я не очень понимаю, как я должен справиться с этим.
может ли быть только общая ссылка в электронной почте, которую пользователи нажимают, затем введите свой адрес электронной почты, чтобы отменить подписку? Но проблема в том, что какой-то другой пользователь мог отписаться от кого-то другого.
Я хотел бы создать конкретную уникальную ссылку для каждого электронного письма, чтобы при нажатии пользователем она автоматически удаляла этого пользователя из списка, а не пользователя, чтобы выполнить дополнительную работу.
С чего начать, чтобы реализовать это?
Ответы
Ответ 1
Ваши ссылки для отписки могут выглядеть так: http://host/application/[email protected]&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605
Создайте токен, используя адрес электронной почты и волшебный токен. В идеале вы бы использовали HMAC с SHA256, но даже просто sha1 должен быть "достаточно хорошим":
$ echo "secret token [email protected]" | sha1sum
598bbdf39bc8f27b07fe85b6a7dd8decef641605 -
Часть secret token
будет исправлена в вашем приложении, а [email protected]
должна соответствовать адресу электронной почты.
Конечно, если секретный токен когда-либо раскрывается, вы возвращаетесь к тому, кто отписывает всех. Вы также можете хранить маркерные маркеры для каждого пользователя в своей базе данных, чтобы проверить маркеры в URL-адресах, что было бы не намного сложнее, чем это, и, безусловно, намного безопаснее.
Ответ 2
Если у вас есть модель для EmailTemplate и модель для подписчика, то ваш код может выглядеть примерно так:
@email_template = EmailTemplate.find(3)
@email_template.subscribers.each do |subscriber|
Notifier.deliver_template(:email_template=>@email_template, :subscriber=>subscriber)
end
поэтому вы можете перейти на
email_delivery = EmailDelivery.create(:email_template=>@email_template, :subscriber=>subscriber)
Notifier.deliver_template(email_delivery)
И затем email_delivery before_create генерирует токен. Генератор случайных паролей для электронной почты должен быть хорошим. SecureRandom делает хорошую работу в случайных токенах: p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"
Включите этот токен email_delivery в свой адрес электронной почты, а затем выполните поиск, основанный исключительно на этом.