49

长期以来,我一直在使用 Rails。现在我在 ActionMailer 中遇到了一个小问题。我想在用户注册时发送一封电子邮件以确认他的注册。我可以在开发模式下发送电子邮件,但不是生产模式下。
异常Errno::ECONNREFUSED: Connection denied - connect(2)每次调用传递方法时都会到来。
我已经编写了以下代码。
我的 SMTP 配置看起来:
config.action_mailer.default_url_options = { :host => "localhost:3000" }

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.smtp_settings = {   
    :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE,      
    :ssl => true,
    :enable_starttls_auto => true,  #this is the important stuff!
    :address        => 'smtp.xxxx.xxx',
    :port           => xxx,
    :domain         => 'xxxxxx',
    :authentication => :plain,
    :user_name      => 'xxxxxxx@xxx.xxx',
    :password       => 'xxxxxxxxx'
  }

在控制器中,我编写了以下内容:

def confirm_registration_in_c       
 @user = User.find_by_email(asdf123@gmail.com)
 if @user
      UserMailer.confirm_registration(@user).deliver            
 end
end

在我的 user_mailer.rb 中:

class UserMailer < ActionMailer::Base
  default from: "from@example.com"

  def confirm_registration(user)
   @user = user
   @user_name = @user.name       
   email = @user.email 
   mail(:to => email, :subject => "Reset your password")
  end
end

我可以在本地主机中以开发模式发送电子邮件,但无法在专用服务器中发送电子邮件。
有人可以帮我吗?

4

7 回答 7

23

在我的情况下,我在尝试通过发送电子邮件的 Rails 应用程序教程时遇到了类似的问题,Heroku 日志一直告诉我

......

Errno::ECONNREFUSED (Connection refused - connect(2) for "localhost" port 25):

......

在将我的代码与作者的代码进行比较后,我发现我没有在config/environments/production.rb文件中设置我的 ActionMailer 配置。

然后我意识到我刚刚将我的config/environments/development.rb配置为发送电子邮件,但我没有为我的config/environments/production.rb 配置它。

因此,当您的应用程序的行为在开发和生产之间有所不同时,您可以检查它。

于 2014-02-24T15:56:46.757 回答
8

确保您已正确配置端口。我从开发中的 gmail(端口 587)切换到从生产中的本地服务器发送并收到此错误,直到我将端口更正为我的服务器使用的端口(端口 25)。

于 2013-09-10T00:06:00.927 回答
5

对于生产你不能写

config.action_mailer.default_url_options = { :host => "localhost:3000" }

为主机添加生产网址,例如,

config.action_mailer.default_url_options = { :host => "http://www.yourdomain.com" }
于 2013-06-17T05:51:12.837 回答
5

我的问题与这个问题不同,但我觉得很多人会通过谷歌找到这个帖子。

如果您使用像 sendgrid 这样的外部 SMTP 服务并相应地设置了 ActionMailer,但它仍然会出现此错误:

Errno::ECONNREFUSED:连接被拒绝 - “localhost”端口 25 的连接(2)

您可能正在使用字符串键传递配置哈希,这些键被忽略。键必须是符号

如果反序列化可能会发生这种情况,我所做的是确保键是符号:

config.action_mailer.smtp_settings = get_smtp_setting.symbolize_keys
于 2018-02-12T02:42:39.953 回答
2

此错误还有另一个原因:

Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 25

应该查看服务器上的 SENDMAIL 服务:

  • 是否安装了 SENDMAIL?
  • SENDMAIL 正在运行吗?

由于停止了 SENDMAIL,我遇到了这个错误。

祝你好运!

于 2018-06-08T10:35:01.160 回答
0

我在尝试使用 Capistrano 部署 wordpress 时发现了一个类似的问题。

cap aborted! Errno::ECONNREFUSED: Connection refused - connect(2) for "{my-ip-address}" port {my-ssh-port}

我也会收到类似的错误:

Tasks: TOP => git:create_release (See full trace by running task with --trace) The deploy has failed with an error: #<Errno::ECONNREFUSED: Connection refused - connect(2) for "my-ip-address" port {my-port}>

事实证明这是并发 SSH 会话的问题,因为我的服务器运行 Fail2Ban。为了解决这个问题,我只是做了以下事情:

  1. 编辑包含 SSH 配置的监狱

    $ sudo nano /etc/fail2ban/jail.local

  2. 寻找 [SSH] 并设置 enabled = false

  3. 然后找到 [ssh-ddos] 并设置 enabled = false

  4. 请记住在更改和打开 ssh 后重新启动 Fail2Ban(如果那是您使用的)

$ sudo service fail2ban reload

$ sudo /etc/init.d/ssh reload

值得注意的是,在部署中的不同步骤(任务)会拒绝连接。例如,在重新启动和快速一切之后,bundle exec cap production deploy:check一切看起来都很好。然后我尝试部署并收到相同的错误,但在执行不同任务期间。我还使用了 UFW,我禁用并重新启用它没有问题。UFW 不是上述问题的原因。

解决这个问题后,我遇到了类似的问题。这是current目录权限的问题。就到这里了。

于 2014-05-18T04:34:19.910 回答
0

在 rails 7 中使用 turbo_stream 时(或在进行rails 7 demo时),您可能会看到类似的错误消息。

如果你这样做,运行这个,一切都应该工作:

redis-server

更多信息在这里

于 2022-02-27T14:24:19.930 回答