【问题标题】:How to send an email with mail gem in ruby on rails如何在 ruby​​ on rails 中发送带有邮件宝石的电子邮件
【发布时间】:2016-12-18 09:16:17
【问题描述】:

我正在尝试使用 mail gem 发送电子邮件。但不幸的是,它不起作用。 这是我的控制器。

    def create
      fn = params["firstname"]
      ln = params["lastname"]
      email = params["email"]
      file = params["file"]
      summery = params["summery"]
      email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
      mail = Mail.new do
        from 'someone@gmail.com'
        to email
        subject "Saying Hi"
        body email_body
      end
      mail.add_file(filename: file.original_filename, content: File.read(file.tempfile.path)) unless file.nil?
      mail.deliver!
      render json: {message: "A bug has been created", success: true}, status: 201
    end

这段代码产生了这个错误

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

但是,当我安装 mailcatcher 并配置我的控制器以将邮件发送到 mailcatcher 时,我可以在我的 mailcatcher UI 中看到该电子邮件。

Mail.defaults do
 delivery_method :smtp, address: "localhost", port: 1025
end

我也将这两行添加到我的 config/environment/development.rb

config.action_mailer.raise_delivery_errors = true 
config.action_mailer.perform_deliveries = true

从我的搜索中,我看到有些人提到不要在开发模式下发送电子邮件,但是在这种情况下,我真的想测试全部功能。

更新

正如@Uzbekjon 和@SimoneCarletti 建议的那样,我将代码更改为使用ActionMailer。我在 app/mailer/ 中创建了一个文件,并从我的控制器中调用它。

  def create
    fn = params["firstname"]
    ln = params["lastname"]
    email = params["email"]
    file = params["file"]
    summery = params["summery"]
     email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
    WelcomeMailer.welcome(fn, ln, email, file, email_body).deliver_now
    render json: {message: "An Email has been send", success: true}, status: 201
  end

这是我的邮件

class WelcomeMailer < ActionMailer::Base
  default from: "someone@yahoo.com"

  def welcome(first_name, last_name, email, file, email_body)
    attachments["#{file.original_filename}"] = File.read("#{file.tempfile.path}")
 mail(
   to: email, 
   subject: 'Welcome to My Awesome Site', 
   body: email_body
 )
  end
end

但是我仍然遇到同样的错误。

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

回答

所以我找到了解决方案。是的,您需要使用 ActionMailer。之后你需要去 config/environments/development.rb ,修改并添加这些行:

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  # SMTP settings for gmail
  config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :user_name            => "YOUR EMAIL",
    :password             => "YOUR Password",
    :authentication       => "plain",
    :enable_starttls_auto => true
  }

如果 Gmail 对此提出投诉:

Net::SMTPAuthenticationError - 534-5.7.9 需要应用程序特定密码

转到此link 并让不太安全的应用程序访问 Gmail。

其他配置可用于 Yahoo 等其他服务。只需谷歌即可。

【问题讨论】:

  • 你为什么直接使用 Mail gem,而不是 Rails 中的 ActiveRecord 邮件库?
  • @SimoneCarletti 如果没有人能解决这个问题,那是我的下一步,您是否建议使用 Active Record Mailer 而不是 gem?
  • 是的,你绝对应该使用ActionMailer(而不是ActiveRecord,这是ORM)。仅供参考 ActionMailer 包装 mail 宝石。
  • @SimoneCarletti 我已经使用 ActionMailer 添加了代码,但是我遇到了同样的错误。
  • 我需要运行一个 SMTP 服务器还是什么的。抱歉,我不太熟悉这个过程。

标签: ruby-on-rails mail-gem


【解决方案1】:

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

看起来mail gem 正在尝试连接到端口 25 上的本地 smtp 服务器。很可能您没有在端口 25 上运行和接收连接的服务。

要解决问题,请在您的机器上安装并运行 sendmailpostfix

PS。使用ActionMailer

【讨论】:

  • 我已经用 ActionMailer 更新了代码,但我得到了同样的错误。
  • 正如我在回答中所写的,问题是您的本地计算机上没有运行“邮件服务器”。要解决它,您需要安装一个。例如sendmailpostfix
【解决方案2】:

您没有在端口 25 上运行邮件服务器。您可以安装 postfix 并使用启动服务器

sudo postfix start

然后修改config/environments/development.rb中的设置

config.action_mailer.delivery_method = :sendmail

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2015-06-15
    相关资源
    最近更新 更多