[英]How can I resend a Devise confirmation email automatically, but only once, for users who have not confirmed?
我使用Rails与设计confirmable
。 用户注册后,Devise会自动向他们发送一封确认电子邮件。 如果三天后仍未确认,我想再给他们发送一封包含新令牌的确认电子邮件。 如果他们在第二封电子邮件后仍未确认,我们将不再发送给他们。 在时间轴上映射:
我不想在用户模型中添加新列来跟踪发送确认电子邮件的次数,因为我认为我可以在每天运行的Worker中使用已有的信息来进行确认。 但是,我在为正确的逻辑做一些努力。
这是我到目前为止的内容:
# workers/resend_confirmation_worker.rb
class ResendConfirmationWorker
include Sidekiq::Worker
sidekiq_options queue: :resend_confirmation, retry: false
def perform
users = User.where('confirmation_sent_at IS NOT NULL and
confirmed_at IS NULL')
users.each do |user|
return if user.created_at < Time.zone.now - 4.days || user.created_at > Time.zone.now - 3.days
user.resend_confirmation!
end
end
# config/clock.rb
module Clockwork
every(1.day, 'Resend confirmation') { ResendConfirmationWorker.perform_async }
end
感谢任何帮助或改进建议。
如果您打算每天运行一次该工作程序,则可能使用类似以下的方法:
User.where('
confirmed_at IS NULL
AND created_at >= ?
AND created_at <= ?
', 2.days.ago.beginning_of_day, 2.days.ago.end_of_day)
如果您在星期三运行此命令,它将获取在星期一注册的所有未确认用户。
d = 2.days.ago
users = User.where.not(confirmation_sent_at: nil)
.where(confirmed_at: nil)
.where(created_at: d.beginning_of_day..d.end_of_day)
users.find_each do |user|
user.resend_confirmation!
end
max发布的答案几乎是完美的,但是您需要使用user.send_confirmation_instructions
而不是resend_confirmation!
,并且如果该工人一天偶然地不止一次运行(例如由于dyno重新启动),人们可能会收到太多确认电子邮件。
现在我要弄清楚的是为什么我的测试无法正常工作 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.