2010-08-02 68 views
12

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

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

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

我应该从哪里开始实施?

+0

嗨@帕特里克,你可以与我分享你的最终解决方案,因为我期待着相同的,谢谢 – iCyborg 2013-07-26 15:42:01

+2

你可以尝试这个教程,非常有帮助http://ngauthier.com/2013/01/rails-unsubscribe-with -active-support-message-verifier.html – duykhoa 2013-08-28 09:43:06

回答

13

你退订链接可能是这样的:http://host/application/[email protected]&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605

生成使用的电子邮件地址和一个神奇的令牌,令牌。理想情况下,你会使用HMAC与SHA256,但即使只是SHA1应该是“足够好”:

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

secret token部分将被固定在你的应用程序,以及[email protected]需求相匹配的电子邮件地址。

当然,如果秘密令牌被揭露,您可以退回给任何人取消订阅每个人。您还可以将每个用户的魔法令牌存储在您的数据库中,以验证URL中的令牌,这不会比这更困难,并且绝对安全得多。

+0

我喜欢这个想法。但很少有问题。我如何从轨道内部生成该令牌?并且该令牌将与每个获得该电子邮件的人相关联? (DB中的新列)。所以当用户点击取消订阅时,我的导轨代码将读取令牌....如果查找表并取消订阅,如果它找到具有该令牌的人 – Patrick 2010-08-02 11:45:28

+0

@Patrick,[Jesse's](http://stackoverflow.com/users/363881/jesse-wolgamott)的答案包含'SecureRandom',这听起来像是魔术令牌的重要来源。您可以将令牌存储在用户模型中,也可以仅使用用户ID和取消订阅令牌创建新表,并在发送电子邮件时填充它。 – sarnold 2010-08-02 23:36:30

+2

这与只使用包含加密电子邮件地址(未散列)和一个或两个秘密令牌的令牌进行比较,然后解密它们以检查应用程序中的秘密令牌与电子邮件地址是否一致,会如何?我认为这些秘密令牌可能是已经存在的东西,比如用户的ID或添加的日期。 – mikato 2013-01-07 20:38:16

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) 

然后是email_delivery的before_create生成一个令牌。每个email_delivery的随机密码生成器应该很好。 SecureRandom在随机令牌方面表现不错:p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"

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

+0

我还没有制造控制器/型号,但我也会尝试你的方法。 – Patrick 2010-08-02 11:54:05

相关问题