как сгенерировать ссылку для отписки от почты - PullRequest
14 голосов
/ 02 августа 2010

У меня есть простое приложение для рельсов, где пользователь может отправить массовое электронное письмо более 10 человек. В этом письме я хотел бы всегда иметь ссылку внизу, по которой конечный пользователь может нажать, чтобы отписаться от уведомлений. Я понятия не имею, как я должен заняться этим.

может ли в письме быть просто общая ссылка, по которой пользователи нажимают, а затем вводят свой адрес электронной почты, чтобы отписаться? Но проблема в том, что какой-то другой пользователь может отписаться от кого-то еще.

Я хотел бы создать уникальную уникальную ссылку для каждого электронного письма, чтобы при щелчке по нему пользователь автоматически удалял этого пользователя из списка, а не того, чтобы пользователю приходилось выполнять какую-то дополнительную работу.

С чего начать, чтобы реализовать это?

Ответы [ 2 ]

15 голосов
/ 02 августа 2010

Ваши ссылки для отписки могут выглядеть так: http://host/application/unsubscribe?address=example@example.com&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605

Создайте токен, используя адрес электронной почты и магический токен. В идеале вы должны использовать HMAC с SHA256, но даже просто sha1 должно быть «достаточно хорошим»:

$ echo "secret token example@example.com" | sha1sum
598bbdf39bc8f27b07fe85b6a7dd8decef641605  -

Часть secret token будет исправлена ​​в вашем приложении, а example@example.com должен соответствовать адресу электронной почты.

Конечно, если секретный токен когда-либо будет раскрыт, вы вернетесь ко всем, кто отписался от всех. Вы также можете хранить магические токены для каждого пользователя в своей базе данных, чтобы проверять токены в URL-адресах, что будет не намного сложнее, чем это, и определенно намного безопаснее.

3 голосов
/ 02 августа 2010

Если у вас есть модель для 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)

И затемbefore_create email_delivery генерирует токен.Генератор случайных паролей на email_delivery должен быть хорош. SecureRandom отлично справляется со случайными токенами: p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"

Включите этот токен email_delivery в свою электронную почту, а затем выполните поиск, основываясь исключительно на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...