2010-08-02 53 views
12

Tôi có một ứng dụng đường ray đơn giản nơi người dùng có thể gửi email hàng loạt tới hơn 10 người. Trong email này, tôi muốn luôn có liên kết ở cuối mà người dùng cuối có thể nhấp để hủy đăng ký nhận thông báo. Tôi không có nhiều ý tưởng làm thế nào tôi nên giải quyết điều này.cách tạo liên kết để hủy đăng ký nhận email

có thể chỉ là một liên kết chung trong email mà người dùng nhấp vào sau đó nhập địa chỉ email của họ để hủy đăng ký bản thân? Nhưng vấn đề với điều này là một số người dùng khác có thể hủy đăng ký người khác.

Tôi muốn tạo một liên kết cụ thể cho mỗi email để khi người dùng nhấp vào nó, nó sẽ tự động xóa người dùng đó khỏi danh sách thay vì người dùng phải thực hiện thêm một số công việc.

Tôi nên bắt đầu từ đâu để triển khai tính năng này?

+0

Xin chào @Patrick, bạn có thể chia sẻ giải pháp cuối cùng của mình với tôi như tôi đang tìm kiếm giống nhau không, Cảm ơn – iCyborg

+2

bạn có thể thử hướng dẫn này, rất hữu ích http://ngauthier.com/2013/01/rails-unsubscribe-with -active-support-message-verifier.html – duykhoa

Trả lời

13

liên kết ngừng đăng ký bạn có thể trông như thế này: http://host/application/[email protected]&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605

Tạo token bằng cách sử dụng địa chỉ email và một mã thông báo kỳ diệu. Tốt nhất, bạn muốn sử dụng HMAC với SHA256, nhưng thậm chí chỉ cần sha1 nên 'đủ tốt':

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

Phần secret token sẽ được cố định trong ứng dụng của bạn, và [email protected] nhu cầu để phù hợp với địa chỉ email.

Tất nhiên, nếu mã bí mật được tiết lộ, bạn sẽ quay lại với bất kỳ ai hủy đăng ký tất cả mọi người. Bạn cũng có thể lưu trữ mã thông báo ma thuật cho mỗi người dùng trong cơ sở dữ liệu của mình để xác thực mã thông báo trong URL, điều đó sẽ không khó khăn hơn nhiều so với điều này và chắc chắn an toàn hơn nhiều.

+0

Tôi thích ý tưởng này. nhưng ít câu hỏi. Làm cách nào để tạo mã thông báo đó từ bên trong đường ray? và mã thông báo đó sẽ được liên kết với mỗi người nhận email ngay? (một cột mới trong DB). Vì vậy, khi người dùng nhấp để hủy đăng ký, mã đường ray của tôi đọc mã thông báo .... không tra cứu trên bảng và hủy đăng ký nếu tìm thấy người có mã thông báo đó – Patrick

+0

@Patrick, [Jesse's] (http://stackoverflow.com/users/363881/jesse-wolgamott) câu trả lời bao gồm 'SecureRandom', mà âm thanh như một nguồn tuyệt vời cho thẻ ma thuật. Bạn có thể lưu trữ mã thông báo trong Mô hình người dùng của mình hoặc tạo một bảng mới chỉ với id người dùng và mã thông báo hủy đăng ký và điền mã đó khi bạn gửi email. – sarnold

+2

Làm cách nào để so sánh việc sử dụng mã thông báo có chứa địa chỉ email được mã hóa (không được băm) và mã thông báo bí mật hoặc hai mã, sau đó giải mã chúng để kiểm tra trong ứng dụng các mã bí mật đồng ý với địa chỉ email? Tôi đang nghĩ rằng các mã thông báo bí mật có thể là những thứ đã tồn tại như id của người dùng hoặc ngày được thêm vào. – mikato

3

Nếu bạn có một mô hình cho EmailTemplate và một mô hình cho thuê bao, sau đó mã của bạn có thể trông giống như:

@email_template = EmailTemplate.find(3) 
@email_template.subscribers.each do |subscriber| 
    Notifier.deliver_template(:email_template=>@email_template, :subscriber=>subscriber) 
end 

như vậy, bạn có thể thay đổi để

email_delivery = EmailDelivery.create(:email_template=>@email_template, :subscriber=>subscriber) 
Notifier.deliver_template(email_delivery) 

Và sau đó before_create của email_delivery tạo một mã thông báo. Một trình tạo mật khẩu ngẫu nhiên cho mỗi email_delivery nên được tốt. SecureRandom thực hiện công việc tốt tại các mã thông báo ngẫu nhiên: p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"

Bao gồm email đóthông báo mã hóa trong email của bạn, sau đó thực hiện tra cứu dựa trên đó.

+0

Tôi chưa tạo các bộ điều khiển/mô hình nhưng tôi cũng sẽ thử cách tiếp cận của bạn. – Patrick

Các vấn đề liên quan