Actionmailer“Timeout :: Error”的问题?

时间:2010-08-02 03:07:45

标签: ruby-on-rails actionmailer

我尝试发送带有动作邮件的电子邮件,它给了我一个Timeout::Error (execution expired):,即使在控制台中它说电子邮件已发送:  它显示

    Sent mail to aldeirm2@gmail.com

然后显示已发送的电子邮件,然后显示以下错误:

Timeout::Error (execution expired):
  /usr/lib/ruby/1.8/timeout.rb:60:in `open'
  /usr/lib/ruby/1.8/net/smtp.rb:551:in `do_start'
  /usr/lib/ruby/1.8/net/smtp.rb:551:in `do_start'
  /usr/lib/ruby/1.8/net/smtp.rb:525:in `start'
  app/models/appointment.rb:10:in `tomorrows_appointments'
  app/models/appointment.rb:8:in `each'
  app/models/appointment.rb:8:in `tomorrows_appointments'
  app/controllers/show_appointments_controller.rb:11:in `send_email'
  -e:2:in `load'
  -e:2

Rendered rescues/_trace (35.8ms)
Rendered rescues/_request_and_response (0.3ms)
Rendering rescues/layout (internal_server_error)

这是我的设置:

config.cache_classes = false
config.whiny_nils = true
config.action_controller.consider_all_requests_local = true
config.action_view.debug_rjs                         = true
config.action_controller.perform_caching             = false

config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :domian               => "gmail.com",
  :authentication       => :login,
  :user_name            => "username",
  :password             => "blablabla",
}

我还尝试将authentication设置为:plain,并使用username@gmail.com作为user_name,毫无希望。

任何想法

3 个答案:

答案 0 :(得分:3)

我在那里看到了一个错字:你写道  :domian => “gmail.com”,

而不是

:domain => “gmail.com”,

答案 1 :(得分:1)

SMTP请求似乎偶尔会超时,可能取决于您为超时设置的时间长短。您将获得的另一个问题是,当用户等待您的服务器与Gmail的SMTP服务器通信时,网络应用会出现延迟。

我知道gmail是新的rails应用程序的流行选项,但我不认为这是一个长期解决方案,因为你必须通过具有每日发送限制的特定Gmail帐户发送邮件。即使使用其他帐户,我发现SMTP超时也是一个问题。

现在我使用SendGrid发送电子邮件,并发现通过postfix使用sendgrid作为中继主机是有利的选择。这意味着用户可以更快地从Web应用程序获得响应,并且邮件通过postfix排队,然后通过sendgrid发送(因此不会超时!)。

请参阅此处了解sendgrid的postfix设置说明: http://wiki.sendgrid.com/doku.php?id=postfix

然后,在您的rails环境中,您只需要以下内容:

config.action_mailer.delivery_method = :sendmail
config.action_mailer.sendmail_settings = {
  :location       => '/usr/sbin/sendmail',
  :arguments      => '-i -t'
}

答案 2 :(得分:1)

如果其他人遇到同样的问题:

确保您的防火墙允许到端口587的传出连接

对于 iptables ,您可以列出所有现有规则:

sudo iptables -L

查看必要规则here

如果您使用的是 AWS实例,请查看您的安全组。