【问题标题】:Connection refused - connect(2) for "localhost" port 25 rails连接被拒绝 - connect(2) 用于“localhost”端口 25 rails
【发布时间】:2015-09-09 15:27:25
【问题描述】:

在培训期间,我正在开发一个网站,我们使用 Ruby on Rails。我们需要向用户发送邮件,所以我创建了一个邮件程序。

我尝试将 smtp 放入 development.rbenvironment.rb

config.action_mailer.default_url_options = {host: '0.0.0.0:3000'}
config.action_mailer.default charset: 'utf-8'
config.action_mailer.delivery_method = 'smtp'
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
  adress: $SMTP_SERVER,
  port: $PORT,
  from: $MAIL,

  enable_starttls_auto: true
  #authentication: 'login'
}

它告诉我错误来自这个方法第 6 行

def create
  @user = User.new(user_params)

  respond_to do |format|
    if @user.save
      # Tell the UserMailer to send a welcome Email after save
      UserMailer.welcome_email(@user).deliver_now

      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.json { render :json => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" }
      format.json { render :json => @user.errors, :status => :unprocessable_entity }
    end
  end
end

我已将端口设置为587,但我不断收到错误消息:

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

看起来好像另一个文件正在覆盖我的设置。我还看到这可能与我的 ssh 密钥未得到服务器授权有关。

知道有什么问题吗?

提前致谢

【问题讨论】:

  • 我猜您应该使用 SendGrid 或 Amazon SES 之类的电子邮件服务,因为它们在本地工作。我不确定您应该如何让内置的 Rails 邮件程序正常工作。我当然不会在本地甚至无法运行的服务器上部署一些东西。

标签: ruby-on-rails ruby email


【解决方案1】:

首先,在本地主机上开发时,通常实际发送邮件,而是将其视为部署细节并坚持Rails默认行为,即吐出邮件标头和内容到控制台 STDOUT(您可以在其中验证文本是否正确)。是否有特定原因需要在开发环境中测试发送消息?

其次,您提到您在 development.rb 和 environment.rb 中都设置了 SMTP 设置。您不需要设置这些设置两次;一般来说,我会将development.rb 用于特定于开发环境的设置,而environment.rb 仅用于始终适用于所有环境(开发、测试和实时部署的服务器)的设置。因此,如果您在 development.rb 和 environment.rb 中设置相同的设置,我会先删除其中一个;裁员只会让你的工作变得更难。

最后,为了解决这个问题,我会先询问 Rails 的设置,而不是等待邮件传递失败。请尝试以下操作:

  • 启动rails console
  • 输入Rails.configuration.action_mailer.smtp_settings 并将生成的哈希值与您的预期进行比较。这个哈希应该包含发送所有邮件时使用的端口和域设置(在当前环境中),所以如果 ActionMailer 尝试了错误的端口,那么我预计这里的端口也是错误的。

您在哪里设置$SMTP_SERVER$PORT$MAIL?您是否有任何理由不使用 Rails 的环境变量约定,ENV['SMTP_SERVER'] 等?

希望其中的一些帮助。祝你好运!

【讨论】:

  • 感谢您的回答。我想测试发送消息以了解它是如何工作的(我是 Ruby on Rails 的新手)并且我想确保它正常工作,因为我并不孤单地参与这个项目,我不想破坏一切。我发现问题出在大学的 wifi 上,它不允许我访问 SMTP。
  • 好的,听起来很公平。但为了清楚起见,我的印象是 Rails 假设您不关心在开发模式下发送消息;它可以很容易地验证消息的内容,但缺少 SMTP 连接,这通常被视为部署和服务器配置详细信息(不是 Rails 应用程序代码本身的一部分)。
  • 我的问题已经解决了,负责人修复了wifi,然后我又出现了一个错误,因为我写的是"smtp"而不是:smtp
  • 赞成打开控制台并检查那里的设置。
【解决方案2】:

替换

config.action_mailer.delivery_method = 'smtp'

config.action_mailer.delivery_method = :smtp

确保您的 Rails.configuration.action_mailer.smtp_settings 是符号化键

【讨论】:

  • 或将其完全删除,因为:smtp 现在是默认设置
【解决方案3】:

我在开发自己的应用程序时遇到了同样的错误消息。我发现,由于我实际上并没有在开发环境中发送任何电子邮件,因此我需要更改配置文件中的其中一行:/your_apps_name/config/environments/development.rb

来自

config.action_mailer.raise_delivery_errors = true

config.action_mailer.raise_delivery_errors = false

这导致我的应用程序在电子邮件未成功传递时引发错误,而我实际上并没有发送电子邮件,所以它们当然没有成功传递。

【讨论】:

  • 在开发环境中很有用
【解决方案4】:

该应用程序可能正在使用 mailcatcher gem 来处理您尚未安装或未运行的所有开发中的出站电子邮件。至少那是我的问题。查看https://mailcatcher.me 并按照给出的说明进行操作。

【讨论】:

    【解决方案5】:

    您需要删除config.action_mailer.perform_deliveries = true 行。

    【讨论】:

      【解决方案6】:

      我在 RSpec 测试中运行 Sidekiq::Worker.drain_all 时遇到了这个问题,这让我发疯了,因为我的 config/environments/test.rb 中有 config.action_mailer.delivery_method = :test

      解决方案是在我的config/environments/development.rb 中设置config.action_mailer.delivery_method = :test,这令人困惑,因为这意味着我的config/environments/development.rb 在我的RSpec 测试中覆盖了我的config/environments/test.rb

      无论如何,这可能会为其他人解决问题。

      【讨论】:

        【解决方案7】:

        对于像我这样笨拙的人,当我在我的应用程序中完美设置所有内容时,我收到了这条消息,但我只是忘记运行在我的生产环境中添加邮件插件的命令。就我而言,那条线是heroku addons:create mailgun:starter

        【讨论】:

          猜你喜欢
          • 2016-07-16
          • 1970-01-01
          • 2018-04-11
          • 1970-01-01
          • 1970-01-01
          • 2021-06-14
          • 2016-03-24
          • 2016-12-05
          • 2015-12-03
          相关资源
          最近更新 更多