我尝试发送带有动作邮件的电子邮件,它给了我一个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
,毫无希望。
任何想法
答案 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实例,请查看您的安全组。