ActionMailer не отправляет почту в Rails 3.1.1 - PullRequest
3 голосов
/ 17 ноября 2011

Я получаю сообщение об ошибке в ActionMailer, когда мой работник пытается отправить электронное письмо

Errno::ECONNREFUSED
    Connection refused - connect(2)

/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:546:in `initialize'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:546:in `open'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:546:in `tcp_socket'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:555:in `block in do_start'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/timeout.rb:58:in `timeout'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/timeout.rb:89:in `timeout'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:555:in `do_start'
/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb:525:in `start'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/mail-2.3.0/lib/mail/network/delivery_methods/smtp.rb:128:in `deliver!'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/mail-2.3.0/lib/mail/message.rb:1989:in `do_delivery'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/mail-2.3.0/lib/mail/message.rb:230:in `block in deliver'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/actionmailer-3.1.1/lib/action_mailer/base.rb:432:in `block in deliver_mail'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.1/lib/active_support/notifications.rb:53:in `block in instrument'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.1/lib/active_support/notifications.rb:53:in `instrument'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/actionmailer-3.1.1/lib/action_mailer/base.rb:430:in `deliver_mail'
/Users/bhushan/.rvm/gems/ruby-1.9.2-p290/gems/mail-2.3.0/lib/mail/message.rb:230:in `deliver'
/Users/bhushan/betterlabs_projects/companyplus_beta/cp_frontend/app/workers/set_crawling.rb:29:in `perform'

У меня есть файл setup_mail.rb в инициализаторах с настройками smtp

 ActionMailer::Base.smtp_settings = {
 address: "smtp.gmail.com",
 port: 587,
 domain: 'betterlabs.net',  
 user_name: 'policemerepiche@gmail.com',
 password:
 authentication: 'plain',
 enable_starttls_auto: true
 }

имой метод рассылки

   def send_email(email)
begin
# attachments['result.csv'] = File.read(file)
 mail(to: "bhushanlodha@gmail.com", subject: "hey")
 puts "====Mail Sent===="
 rescue Exception=>e
 puts e.inspect
 end
end

development.rb

  config.action_mailer.delivery_method = :smtp

Любое понимание того, что может быть не так?Спасибо.

Ответы [ 3 ]

6 голосов
/ 15 января 2013

У меня была такая же проблема, когда мои почтовые программы правильно доставляли электронную почту при выполнении из веб-процесса или в консоли Rails, но если они были поставлены в очередь для доставки в рабочем процессе, они вызывали исключение Errno :: ECONNREFUSED.

Я тоже использовал инициализатор для настройки конфигурации.Все в нем пахло так, будто настройки SMTP как-то не учитывались, но только при запуске рабочего процесса.

В конце концов я добавил это в почтовую программу:

m = mail(to: "herpderp@example.com", subject: "Example")
puts m.to_yaml
return m

Это показало, чтоэкземпляр почты имел внутри объект настроек smtp (или на него ссылались изнутри, и включал в to_yaml), и этот объект настроек smtp был без настроек smtp, которые я объявил в своем инициализаторе.Вот выдержка:

settings:
  :address: localhost
  :port: 25
  :domain: localhost.localdomain
  :user_name: 
  :password: 
  :authentication: 
  :enable_starttls_auto: true
  :openssl_verify_mode: 
  :ssl: 
  :tls: 

Очевидно, это было неправильно.Кроме того, при печати Rails.application.config.action_mailer.smtp_settings из того же объявления печатались правильные настройки .

Поэтому, чтобы сузить возможности, я, конечно, переместил свои объявления настроек обратно в разработку.rb и в следующий раз, когда эти настройки были напечатаны на stdout моего работника, они были правильными, и электронная почта доставлена, как и ожидалось.

Поэтому я не могу сказать, что полностью понимаю, как / когда обрабатываются конфигурации, установленные в инициализаторахпотому что у меня не так много видимости в этой глубине основных модулей Rails, но я могу сказать, что где-то там, из-за того, как почтовый экземпляр извлекает настройки smtp из глобальных настроек, есть разница между тем, как и когдаони объявлены в инициализаторе в сравнении с файлом среды.

Урок для меня.Не переходите слишком далеко от стандартных стандартов конфигурации Rails с классом инициализатора.Все работало как положено, как только я перенес конфигурацию обратно в development.rb.Возможно, кто-то еще может помочь объяснить, что происходит между rb-файлами среды и инициализаторами.

2 голосов
/ 27 ноября 2011

Как сказал выше Тило; очевидный тест - определить, можете ли вы подключиться к серверам Gmail:

$ telnet smtp.gmail.com 587
Trying 74.125.53.108...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP ft1sm69312925igc.3

Если вы можете подключиться, то ваши настройки не будут подхвачены во время начальной загрузки.

Я бы проверил, к чему вы на самом деле подключаетесь - иди и добавь несколько операторов put в код smtp (в строке 546 или около нее):

/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb
1 голос
/ 10 января 2012

проверьте ключ :from, который вы определили в начале ActionMailer класса

...