如何在ruby上发送带有邮件gem的电子邮件

时间:2016-08-11 14:48:21

标签: ruby-on-rails mail-gem

我正在尝试使用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 - 拒绝连接 - 连接(2)“localhost”端口25:

但是,当我安装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 - 拒绝连接 - 连接(2)“localhost”端口25:

答案

所以我找到了解决方案。是的,您需要使用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等其他服务。只是Google吧。

2 个答案:

答案 0 :(得分:1)

  

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

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

在您的计算机上解决,安装并运行sendmailpostfix

PS。使用ActionMailer

答案 1 :(得分:0)

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

启动服务器
sudo postfix start

然后修改config/environments/development.rb

中的设置
config.action_mailer.delivery_method = :sendmail

希望这有帮助。