2011-11-17 52 views
3

我在的ActionMailer收到錯誤時,我的工作人員正試圖發送電子郵件的ActionMailer Rails中未發送郵件3.1.1

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: '[email protected]', 
password: 
authentication: 'plain', 
enable_starttls_auto: true 
} 

和我的郵件方法

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

development.rb

config.action_mailer.delivery_method = :smtp 

任何有關可能會出錯的信息?謝謝。

+0

我假設你已將'ActionMailer :: Base.delivery_method'設置爲':smtp'? –

+0

我有config.action_mailer.delivery_method =:smtp in development.rb –

+0

您可以直接連接到smtp.gmail.com:587,例如:通過telnet? – Thilo

回答

1

請確保您已定義的:from關鍵在ActionMailer類的開始

+0

我已經寫過名字:來自方法而不是電子郵件。這有幫助! –

2

正如以上所說的Thilo;顯而易見的測試,以確定是否可以連接到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 

如果可以連接,那麼你的設置musn't可以得到引導過程中回升。

我會檢查,看看你在哪裏實際連接到 - 去添加一些看跌語句到SMTP代碼(或大約546線):

/Users/bhushan/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/smtp.rb 
6

我有同樣的問題,我的郵件程序將正確地提供電子郵件,如果從Web進程或Rails控制檯執行,但如果他們排隊等待在工作進程中交付,他們會引發Errno :: ECONNREFUSED異常。

我也在使用初始化器來設置配置。關於它的一切聞起來就像SMTP設置不知怎麼被遺漏了,但只有在工作進程運行時纔會出現。

最後,我已將此添加到郵件:

m = mail(to: "[email protected]", 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正在打印正確的設置

因此,爲了縮小可能性,我當然將設置聲明移回到了development.rb,並且下次這些設置打印在我的工作人員的stdout上時,他們是正確的,並且按預期發送了電子郵件。

所以我不能說我完全理解在初始化器中設置的配置是如何處理的,因爲我沒有那麼深的Rails核心模塊深度的可見性,但我可以說在那裏的某個地方,由於郵件實例如何從全局配置中檢索smtp設置,它們在初始化程序中聲明的方式與環境文件之間有何區別。

爲我學到的教訓。不要過度使用初始化類的標準Rails配置標準。一旦我將配置移回到development.rb中,一切都按預期工作。也許其他人可以幫助解釋環境rb文件和初始化程序之間發生了什麼。

+0

我使用的Rails版本,順便說一句,是3.2.11 –

+3

很高興與你分享!我遇到了同樣的情況,並開始流鼻血。在您的幫助和進一步調查後,我發現原因:從YML文件加載郵件設置時,鍵是字符串,action_mailer不喜歡。這個實現像一個魅力(在你的環境文件中):''config.action_mailer.smtp_settings = YAML.load_file(「#{:: Rails.root} /config/mailer.yml」)[:: Rails.env]' 'config.action_mailer.smtp_settings.symbolize_keys!' – Benj

+0

謝謝!我以爲我瘋了。我的初始化程序允許使用其他delivery_method值和/或散列(例如sendmail_settings或file_settings),因此對於加載的YML文件的each_pair,我可以使用ActionMailer :: Base.send(「#{key} =」,value.is_a?(Hash )?value.symbolize_keys!:value)' –

相關問題