【问题标题】:Rails mailer Connection refused - localhostRails 邮件程序连接被拒绝 - 本地主机
【发布时间】:2015-06-01 12:21:39
【问题描述】:

红宝石版本 2.2.0
Rails 4.1.4
actionmailer- 4.1.4
邮件 - 2.5.4

在rails c(开发)中输入“Mailer.method.deliver”时遇到以下错误日志

Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 25
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:541:in `initialize'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:541:in `open'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:541:in `tcp_socket'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:551:in `block in do_start'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/timeout.rb:89:in `block in timeout'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/timeout.rb:99:in `call'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/timeout.rb:99:in `timeout'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:550:in `do_start'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/2.2.0/net/smtp.rb:520:in `start'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb:112:in `deliver!'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/message.rb:2129:in `do_delivery'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/message.rb:232:in `block in deliver'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionmailer-4.1.4/lib/action_mailer/base.rb:527:in `block in deliver_mail'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.1.4/lib/active_support/notifications.rb:159:in `block in instrument'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.1.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.1.4/lib/active_support/notifications.rb:159:in `instrument'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionmailer-4.1.4/lib/action_mailer/base.rb:525:in `deliver_mail'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/message.rb:232:in `deliver'
from (irb):4
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.1.4/lib/rails/commands/console.rb:90:in `start'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.1.4/lib/rails/commands/console.rb:9:in `start'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:69:in `console'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.1.4/lib/rails/commands.rb:17:in `<top (required)>'

当然,我在 development.rb 中添加邮件配置(下)

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { 
  :address => "smtp.gmail.com",
  :domain => "gmail.com",
  :port => 587,
  :authentication => :plain,
  :user_name => "email",
  :password => "password",
  :enable_starttls_auto => true
}

在我调试之后..

# mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb 
# before line: 112  

raise settings.to_s  #added
smtp.start(settings[:domain], settings[:user_name], settings[:password], settings[:authentication]) do |smtp_obj|
...
...

我可以看到设置哈希具有从 environment/development.rb 添加的默认变量(:符号)和自定义变量(:字符串)。

RuntimeError: {:address=>"localhost", :port=>25, :domain=>"localhost.localdomain", :user_name=>nil, :password=>nil, :authentication=>nil, :enable_starttls_auto=>true, :openssl_verify_mode=>nil, :ssl=>nil, :tls=>nil, "address"=>"smtp.gmail.com", "port"=>587, "authentication"=>"plain", "user_name"=>"email", "password"=>"password", "enable_starttls_auto"=>true}
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb:113:in `deliver!'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/message.rb:2129:in `do_delivery'
from /Users/KimJaeseong/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mail-2.5.4/lib/mail/message.rb:232:in `block in deliver'
...
...

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    对不起。 我忘记了我让你知道的一个信息。

    我从 stackoverflow 的答案中看到了下面关于邮件配置的设置。

    # config/initializer/setup_mail.rb
    
    if Rails.env != 'test'
      email_settings = YAML::load(File.open("#{Rails.root}/config/smtp.yml"))
      ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil? 
    end
    
    # I say this [A] code
    

    [A] 代码导致此问题描述上面的错误。
    (将“raise settings.to_s”添加到 mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb 在第 112 行引发符号和字符串之前。)

    我认为 [A] 代码出现此错误的原因是 smtp_settings(hash) 合并!在类 SMTP (mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb) 的初始化方法中。

    class SMTP
      include Mail::CheckDeliveryParams
    
      def initialize(values)
        self.settings = { :address              => "localhost",
                          :port                 => 25, 
                          :domain               => 'localhost.localdomain',
                          :user_name            => nil,
                          :password             => nil,
                          :authentication       => nil,
                          :enable_starttls_auto => true,
                          :openssl_verify_mode  => nil,
                          :ssl                  => nil,
                          :tls                  => nil 
                        }.merge!(values)
      end
      ...
    

    测试 ruby​​ 哈希合并方法

    default_setting = {:address => "localhost", :port => 25}
    custom_setting = {:address => "smtp.gmail.com", :port => 587} # or {"address" => "smtp.gmail.com", "port" => 587}
    default_setting.merge(custom_setting) # result in default_setting = {:address => "localhost", :port => 25, "address" => "smtp.gmail.com", "port" => 587}
    

    所以我决定用 ENV["SMTP_EMAIL"], ENV["SMTP_PASSWORD"] 将 smtp_setting 添加到 application.rb

    祝你有美好的一天!

    【讨论】:

      【解决方案2】:

      我们有时会使用 Google 地址进行申请或测试。您可能需要登录 Google 帐户并确保您已允许外部应用程序。这将受到帐户安全保护。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-30
        • 2020-03-14
        • 2011-07-10
        • 1970-01-01
        • 2014-05-31
        • 2016-01-27
        • 2015-12-12
        • 2015-09-20
        相关资源
        最近更新 更多