2010-08-02 7 views
12

사용자가 10 명이 넘는 사용자에게 대량 메일을 보낼 수있는 간단한 레일 앱이 있습니다. 이 이메일에서는 최종 사용자가 클릭하여 알림을 수신 거부 할 수있는 링크를 항상 갖고 싶습니다. 나는이 문제를 어떻게 다뤄야하는지 잘 모른다.이메일 수신 거부 링크를 생성하는 방법

전자 메일에는 사용자가 클릭 한 다음 전자 메일 주소를 입력하여 자신을 등록 취소 할 수있는 일반적인 링크가있을 수 있습니까? 그러나이 문제는 다른 사용자가 다른 사람을 구독 취소 할 수 있다는 것입니다.

전자 메일마다 고유 한 고유 링크를 생성하여 사용자가 클릭 할 때 추가 작업을 수행하지 않고 목록에서 해당 사용자를 자동으로 제거하도록하고 싶습니다.

구현하려면 어디에서 시작해야합니까?

+0

안녕하세요 @ 패트릭, 내가 똑같은 찾고있는 것처럼 내 마지막 솔루션을 공유 할 수 있습니다. 감사합니다 – iCyborg

+2

이 튜토리얼을 시도해 볼 수 있습니다. 매우 유용한 http://ngauthier.com/2013/01/rails-unsubscribe-with -active-support-message-verifier.html – duykhoa

답변

13

귀하의 수신 거부 링크는 다음과 같이 수 : http://host/application/[email protected]&token=598bbdf39bc8f27b07fe85b6a7dd8decef641605

는 이메일 주소와 마법의 토큰을 사용하여 토큰을 생성합니다. 이상적으로, 당신은 SHA256와 HMAC를 사용 싶지만, 심지어 단지 SHA1은 '충분'해야 다음 secret token 부분은 응용 프로그램에서 수정 될 것

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

하고 [email protected] 요구에 이메일 주소와 일치 할 수 있습니다.

물론 비밀 토큰이 밝혀지면 모든 사람을 탈퇴 한 사람에게 돌아온 것입니다. 또한 사용자 별 마법 토큰을 데이터베이스에 저장하여 URL의 토큰을 검증 할 수 있습니다.이 토큰은 이보다 더 어렵지는 않을 것이며 확실히 안전합니다. 당신이 emailTemplate를위한 모델 및 가입자에 대한 모델이있는 경우

+0

이 아이디어가 마음에 들어요. 그러나 몇 가지 질문. 레일에서 토큰을 어떻게 생성합니까? 그 토큰은 이메일을받는 각자와 관련이있을 것입니까? (DB의 새 열). 그래서 사용자가 탈퇴하기 위해 클릭하면, 내 레일 코드는 토큰을 읽습니다 .... 그 토큰을 가진 사람을 찾으면 테이블과 탈퇴에 ​​대한 조회를 수행합니다. – Patrick

+0

@Patrick, [Jesse 's] (http://stackoverflow.com/users/363881)/jesse-wolgamott) 답변에는 'SecureRandom'이 포함되어 있는데, 이는 마술 토큰의 훌륭한 소스처럼 들린다. 사용자 모델에 토큰을 저장하거나 사용자 ID만으로 새 테이블을 만들고 토큰을 구독 취소하고 전자 메일을 보낼 때 토큰을 채울 수 있습니다. – sarnold

+2

이것은 암호화 된 전자 메일 주소 (해시되지 않음)와 비밀 토큰 (또는 두 개)을 포함하는 토큰을 사용한 다음 비밀 토큰이 전자 메일 주소와 일치하는지 응용 프로그램에서 확인하기 위해 해독하는 것과 어떻게 비교 될까요? 나는 비밀 토큰이 사용자의 ID 나 추가 된 날짜와 같은 이미 존재할 수 있다고 생각하고있다. – mikato

3

, 다음 코드 같은 것을 볼 수 있습니다 그래서

@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

관련 문제