首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionMailer执行超时

ActionMailer执行超时
EN

Stack Overflow用户
提问于 2010-06-10 04:18:56
回答 1查看 864关注 0票数 4

当尝试向用户发送电子邮件以重置其密码时,我不断收到执行超时错误。其他邮件功能正常工作,所以我知道配置设置是正确的。标题为:"Timeout::Error in Password resetsController#create“

下面是password_resets_controller:

代码语言:javascript
复制
def create  
 @user = User.find_by_email(params[:email])  
 if @user  
  User.deliver_password_reset_instructions(@user.id)
  flash[:notice] = "Instructions to reset your password have been emailed to you. " +  
  "Please check your email."  
  redirect_to '/'  
 else  
  flash[:notice] = "No user was found with that email address"  
  render :action => :new
 end  
end

下面是User.rb内部的方法

代码语言:javascript
复制
def self.deliver_password_reset_instructions(user_id)
 user = User.find(user_id)
 user.reset_perishable_token!  
 Emailer.deliver_password_reset_instructions(user)
end

最后,下面是emailer.rb内部的实际方法:

代码语言:javascript
复制
default_url_options[:host] = "http://0.0.0.0:3000"  #development
 def password_reset_instructions(user)  
    @subject                            = "Application Password Reset"  
    @from                               = 'Notice@myApp.com' 
    @recipients                         = user.email  
    @sent_on                            = Time.now  
    @body["edit_password_reset_url"]    =  edit_password_reset_url(user.perishable_token)  
    @headers["X-SMTPAPI"] = "{\"category\" : \"Password Recovery\"}"#send grid category header
  end

为什么错误消息中的"Password“是指导致超时::error

EN

回答 1

Stack Overflow用户

发布于 2013-10-05 15:34:04

从主控制器请求线程发送电子邮件(或其他长时间运行的进程)不是一个好主意。发送电子邮件可能会因为各种不受您控制的原因而超时(例如,出站电子邮件传送服务器关闭),您不希望应用程序服务器和用户因此而受到影响。

更好的方法是使用像延迟作业(DJ)这样的排队机制来对这些电子邮件任务进行排队,并让它们在控制器线程之外进行处理。

请参阅https://github.com/collectiveidea/delayed_job

将这个(或另一个排队系统)集成到您的rails应用程序中相当简单。据说Rails4内置了队列服务(我还没用过) http://blog.remarkablelabs.com/2012/12/asynchronous-action-mailer-rails-4-countdown-to-2013

例如,如果您在应用程序中使用DJ,则新代码将如下所示

代码语言:javascript
复制
def self.deliver_password_reset_instructions(user_id)
 user = User.find(user_id)
 user.reset_perishable_token!  
 # this is the only line that changes
 Emailer.delay.deliver_password_reset_instructions(user)
end

这些作业存储在数据库中,并在发生诸如超时之类的错误时重试。

你可以在github页面上阅读更多关于DJ的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3009605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档