【问题标题】:Action Mailer in Ruby without Rails - Timeout Error没有 Rails 的 Ruby 中的 Action Mailer - 超时错误
【发布时间】:2012-07-19 01:08:34
【问题描述】:

我正在使用 Action Mailer 发送每日电子邮件,但没有使用 Rails。我还在这里查看了其他问题:Action Mailer 3 without RailsActionMailer and Ramaze

这是我的代码:

require 'action_mailer'

class Mailer < ActionMailer::Base
  def daily_names_email(names,subject="test daily mail",to = "test@domain.com")
  @names = "test names"
  mail(
      :to      => to,
      :from    => "me@domain.com",
      :subject => subject
    ) do |format|
    format.text
    format.html
    end
  end
end

Mailer.raise_delivery_errors = true
Mailer.delivery_method = :smtp
Mailer.smtp_settings = {
 :address   => "smtp.gmail.com",
 :port      => 465,
 :domain    => "google",
 :authentication => :plain,
 :user_name      => "me@domain.com",
 :password       => "*****",
 :enable_starttls_auto => true
}
Mailer.view_paths = File.dirname(__FILE__)
Mailer.logger = Logger.new(STDOUT)

email = Mailer.daily_names_email('hello')

puts email
email.deliver

这是错误输出:

Date: Thu, 19 Jul 2012 08:46:18 +0800
From: me@domain.com
To: me@domain.com

Message-ID: <500758da4dbda_151082d87c10766@ubuntu.mail>
Subject: test daily mail
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_500758da4a289_151082d87c104fb";
 charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_500758da4a289_151082d87c104fb
Date: Thu, 19 Jul 2012 08:46:18 +0800
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-ID: <500758da4c2f6_151082d87c10515@ubuntu.mail>

/usr/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill': Timeout::Error (Timeout::Error)
from /usr/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill'
from /usr/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
from /usr/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
from /usr/lib/ruby/1.9.1/net/smtp.rb:929:in `recv_response'
from /usr/lib/ruby/1.9.1/net/smtp.rb:552:in `block in do_start'
from /usr/lib/ruby/1.9.1/net/smtp.rb:939:in `critical'
from /usr/lib/ruby/1.9.1/net/smtp.rb:552:in `do_start'
from /usr/lib/ruby/1.9.1/net/smtp.rb:519:in `start'
from /var/lib/gems/1.9.1/gems/mail-2.4.4/lib/mail/network/delivery_methods/smtp.rb:144:in `deliver!'
from /var/lib/gems/1.9.1/gems/mail-2.4.4/lib/mail/message.rb:2034:in `do_delivery'
from /var/lib/gems/1.9.1/gems/mail-2.4.4/lib/mail/message.rb:229:in `block in deliver'
from /var/lib/gems/1.9.1/gems/actionmailer-3.2.6/lib/action_mailer/base.rb:415:in `block in deliver_mail'
from /var/lib/gems/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications.rb:123:in `block in instrument'
from /var/lib/gems/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
from /var/lib/gems/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications.rb:123:in `instrument'
from /var/lib/gems/1.9.1/gems/actionmailer-3.2.6/lib/action_mailer/base.rb:413:in `deliver_mail'
from /var/lib/gems/1.9.1/gems/mail-2.4.4/lib/mail/message.rb:229:in `deliver'
from mailer.rb:34:in `<main>''

任何帮助将不胜感激!提前致谢!

【问题讨论】:

  • telnet smtp.gmail.com 485 在我的系统上似乎超时。你对你的主机名和端口号有信心吗?
  • @sarnold,你说得对,根据谷歌支持页面上的link,它应该是 465 或 587
  • 使用端口 465,出现上述错误(已更新)
  • 您是否位于阻止端口 465 或 587 的防火墙后面?

标签: ruby smtp actionmailer google-apps


【解决方案1】:

除非是拼写错误,否则“域”参数是错误的。

:domain =&gt; 'google' 应该是:domain =&gt; 'yourdomain.com'

您在下面给出的代码,使用正确的域可以正常工作

require 'action_mailer'

class Mailer < ActionMailer::Base
  def daily_names_email(names,subject="test daily mail",to = "recipient@domain.com")
  mail(
      :to      => to,
      :from    => "you@yourdomain.com",
      :subject => subject
    ) do |format|
    format.text
    format.html
    end
  end
end

Mailer.raise_delivery_errors = true
Mailer.delivery_method = :smtp
Mailer.smtp_settings = {
 :address   => "smtp.gmail.com",
 :port      => 587,
 :domain    => "yourdomain.com",
 :authentication => :plain,
 :user_name      => "you@yourdomain.com",
 :password       => "*****",
 :enable_starttls_auto => true
}
Mailer.view_paths = File.dirname(__FILE__)
Mailer.logger = Logger.new(STDOUT)

email = Mailer.daily_names_email('hello').deliver

puts email

【讨论】:

  • 嘿@anand。谢谢你的帮助。我已经尝试了上述方法并得到以下响应对于这些设置::port =&gt; 465, :domain =&gt; "domain.com", :authentication =&gt; :login,:port =&gt; 465, :domain =&gt; "domain.com", :authentication =&gt; :plain, 让我得到这个响应:/usr/lib/ruby/1.9.1/net/protocol.rb:146:in 'rescue in rbuf_fill': Timeout::Error(Timeout::Error)from/usr/lib/ruby/1.9.1/net/protocol.rb:140:in 'rbuf_fill'
  • 使用此设置:` :port => 587, :domain => "domain.com", :authentication => :login, :port => 465, :domain => "domain.com ", :authentication => :plain,` 我得到:/usr/lib/ruby/1.9.1/net/smtp.rb:960:in 'check_auth_response': 535-5.7.1 Username and Password not accepted. Learn more at (Net::SMTPAuthenticationError) from /usr/lib/ruby/1.9.1/net/smtp.rb:737:in 'auth_plain' from /usr/lib/ruby/1.9.1/net/smtp.rb:729:in 'authenticate' from /usr/lib/ruby/1.9.1/net/smtp.rb:564:in 'do_start' from /usr/lib/ruby/1.9.1/net/smtp.rb:519:in 'start'
  • 补充一下,我意识到端口号应该是 587 (IMAP),就像你指定的那样,而不是 465 (POP)。但是,当我使用端口 587 时,会出现身份验证错误。我不知道为什么
  • 这很奇怪,因为我正在使用您的代码并且只更改域参数对我有用,是的,端口参数也是如此。根据我看到的消息,您使用的是 1.9.1,如果您使用 RVM 来管理 Ruby 版本,您可以尝试使用不同版本的 Ruby,比如 1.9.2 或更高版本吗?
  • 嗨,阿南德,感谢您再次调查此问题。我现在得到的错误是/home/ritesh/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:197:in default_ssl_context': uninitialized constant Net::SMTP::OpenSSL (NameError) from /home/ritesh/.rvm/rubies/ruby-1.9.3-194/lib/ruby/1.9.1/net/smtp.rb:345:in enable_starttls_auto' from /home/ritesh/.rvm/gems/ruby-1.9.3-p194/gems/mail-2.4.4/lib/mail/network/delivery_methods/smtp.rb:130:in 'deliver!'
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多