2010-08-02 9 views
12

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

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

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

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

+0

Привет, @Patrick, можете ли вы поделиться своим окончательным решением со мной, поскольку я ищу то же самое, спасибо – iCyborg

+2

вы можете попробовать этот урок, очень полезно http://ngauthier.com/2013/01/rails-unsubscribe-with -active-support-message-verifier.html – duykhoa

ответ

13

Ваша неподписывают ссылка может выглядеть следующим образом: http://host/application/[email protected]&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605

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

$ echo "secret token [email protected]" | sha1sum 
598bbdf39bc8f27b07fe85b6a7dd8decef641605 - 

secret token часть будет установлена ​​в вашем приложении, и [email protected] должен соответствовать адрес электронной почты.

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

+0

Мне нравится эта идея. но мало вопросов. Как создать этот токен изнутри рельсов? и этот токен будет связан с каждым человеком, который получит право на электронную почту? (новый столбец в БД). Поэтому, когда пользователь нажимает, чтобы отменить подписку, мой код rails читает токен .... выполняет поиск по таблице и отменяет подписку, если найдет человека с этим токеном – Patrick

+0

@Patrick, [Jesse's] (http://stackoverflow.com/users/363881/jesse-wolgamott) включает в себя 'SecureRandom', который звучит как отличный источник для магических токенов. Вы можете либо сохранить токен в своей модели пользователя, либо создать новую таблицу с идентификаторами только идентификатора пользователя и отказа от подписки и заполнить его при отправке писем. – sarnold

+2

Как это сравнить с использованием только токена, который содержит зашифрованный адрес электронной почты (не хэшированный), и секретный токен или два, а затем расшифровать их, чтобы проверить приложение, что секретные токены согласны с адресом электронной почты? Я думаю, что секретными токенами могут быть вещи, которые уже существуют, например, идентификатор пользователя или дата добавления. – mikato

3

Если у вас есть модель 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 в генерирует токен. Генератор случайных паролей для электронной почты должен быть хорошим. SecureRandom делает хорошую работу в случайных жетонах: p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"

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

+0

Я еще не сделал контроллеры/модели, но я тоже попробую ваш подход. – Patrick

Смежные вопросы