Sendgrid没有发送电子邮件?

时间:2018-03-01 04:52:45

标签: ruby-on-rails ruby backend sendgrid

我正在尝试将sendgrid实现到我的后端api rails系统中,以便当用户注册时我可以向他们发送欢迎电子邮件。在发布帖子请求并处理用户创建后,我得到了这个验证:

UserMailer#send_sign_up_email: processed outbound mail in 43.5ms
Sent mail to *******@gmail.com (185.8ms)
Date: Wed, 28 Feb 2018 16:54:05 -0800
From: *******@gmail.com
To: *******@gmail.com
Message-ID: <5a974f2d39c92_c5b2abcd76769fc423e0@albert-VirtualBox.mail>
Subject: Welcome to BottlesTonight albert jin!
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: quoted-printable

我的代码与此链接https://sendgrid.com/docs/Integrate/Frameworks/rubyonrails.html完全相同。

这看起来很好,但电子邮件只是没有发送(我在这里放了电子邮件,但我实际上放了我的电子邮件,我用另一封电子邮件作为发送的默认值)。我的发件箱或收件箱中没有电子邮件。

然而,现在我考虑一下,我从来没有“登录”我的电子邮件或输入密码,因此应用程序不应该有权使用我的电子邮件发送电子邮件。我也从未对我在sendgrid帐户上创建的api密钥做任何事情。此外,对于environment.rb文件,我不知道在域中放什么,所以我把gmail.com。这些对我来说似乎都很粗略,我认为教程并不包含所有内容。有谁知道如何配置这个?我已经坚持了一段时间。

编辑: 我尝试在生产中这样做,但它无法正常工作。这是更多信息: 我的production.rb看起来像这样:

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

  config.action_mailer.default_url_options = { :host => ENV['DEFAULT_HOST'] }

  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }

我有一个heroku sendgrid添加。我已经设置了heroku配置变量。在我的注册控制器中,我只添加了一行:

UserMailer.send_sign_up_email(@current_user).deliver

我的邮件程序类看起来像:

def send_sign_up_email(user)
   @user = user
   mail(to: @user.email, subject: "Welcome! #{@user.first_name}")
   end

但是,当我在我的网站上注册时,用户会被添加到数据库中但电子邮件不会发送。有谁知道为什么,或者我如何调试?

1 个答案:

答案 0 :(得分:0)

我建议从您的环境文件(即 / config / environments 下的文件)中删除ActionMailer的所有配置,但以下内容除外

  # Don't care if the mailer can't send.
  config.action_mailer.perform_caching = false

  # Reference: http://stackoverflow.com/a/20770131/936494
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true

然后创建一个初始化程序/config/initializers/mail_config.rb并向其添加以下代码:

TEST_ENVS = %w(test)
FILESYSTEM_ENVS = TEST_ENVS + %w(development)

# ===========  DELIVERY METHOD SETTING
delivery_method = case Rails.env.to_sym
                    when :production, :staging, :experimental
                     :sendmail
                    when :test
                     :test
                    else
                     :smtp
                  end

ActionMailer::Base.delivery_method = delivery_method

# ===========  SMTP SETTINGS
ENVS_TO_USE_GMAIL_CONFIG = %w(development test)

gmail_config = {
  address:              'smtp.gmail.com',
  port:                 587,
  domain:               'gmail.com',
  user_name:            ENV['MAIL_USER_NAME'],
  password:             ENV['MAIL_PASSWORD'],
  authentication:       :plain,
  enable_starttls_auto: true
}

if :smtp == delivery_method
  use_gmail_config = ENVS_TO_USE_GMAIL_CONFIG.include?(Rails.env)

  smtp_settings = ( use_gmail_config ? gmail_config : {} )
  ActionMailer::Base.smtp_settings = smtp_settings
end

# =========== DEFAULT URL OPTIONS

default_url_options_settings = Settings.default_url_options
host = default_url_options_settings.host
port = default_url_options_settings.port
protocol = default_url_options_settings.protocol

default_url_options = {}
default_url_options[:host] = host if host.present?
default_url_options[:port] = port if port.present?
default_url_options[:protocol] = protocol if protocol.present?

ActionMailer::Base.default_url_options = default_url_options

使用Settings对象作为使用config gem的一部分。如果您不想使用该gem来配置特定于env的值,那么您可以在初始化程序中对它们进行硬编码并尝试。

我的 /config/settings.yml 看起来像

default_url_options:
  host: ''
  port: ''
  protocol: ''

我的 /config/settings/development.yml 看起来像

default_url_options:
  host: 'localhost'
  port: '3000'

拥有集中式邮件程序配置有助于快速诊断邮件设置相关问题。

首先尝试使用Gmail帐户,如果有效,您可以确定发送电子邮件是有效的。只需确保您的Gmail帐户Less Secure Apps设置已启用。