如何生成取消订阅电子邮件的链接

时间:2010-08-02 11:24:10

标签: ruby-on-rails email

我有一个简单的rails应用程序,用户可以向10多人发送大量电子邮件。在这封电子邮件中,我希望始终在底部有一个链接,最终用户可以点击该链接取消订阅通知。我不知道如何解决这个问题。

电子邮件中是否只有一个通用链接,用户点击该链接然后输入他们的电子邮件地址以取消订阅?但问题是,其他一些用户可以取消订阅其他人。

我想为每封电子邮件生成一个特定的唯一链接,这样当用户点击它时,它会自动从列表中删除该用户,而不是用户必须做一些额外的工作。

我应该从哪里开始实现这个目标?

2 个答案:

答案 0 :(得分:15)

您的取消订阅链接可能如下所示: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中的令牌,这不会比这更难,而且肯定更安全。

答案 1 :(得分:3)

如果您有EmailTemplate的模型和Subscriber的模型,那么您的代码可能如下所示:

@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会生成一个令牌。每封email_delivery的随机密码生成器应该是好的。 SecureRandom在随机令牌方面做得很好:p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"

在您的电子邮件中包含该email_delivery令牌,然后仅根据该令牌进行查找。

相关问题