2010-08-02 92 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

相關問題