将 Devise 链接到 Mailjet

Linking Devise to Mailjet

我们正在尝试link将我们设计的密码重置表单上传到 mailjet gem。我已按照 mailjet repo 自述文件中的所有说明进行操作,但我仍然无法将 API 连接到 Devise 'reset password' 表单,而且似乎缺少某些内容。

a) 首先,我在 google、mailjet 的支持站点和 Whosebug 上到处搜索,但似乎无法在任何地方找到任何帮助 link 启动 MailJet 的说明策划出。我错过了什么吗?

b) 如果没有关于如何执行此操作的预先编写的指南,有人可以帮助我完成我需要采取的特定步骤以确保当我在我们的设备上按 'Send Password Reset Link' 登录时页面,它正确发送电子邮件?现在,我们收到一个错误:需要电子邮件。但是我的电子邮件地址在那里。所以它没有 link 正确启动。我认为我们需要将那个特定的设计页面连接到 mailjet api,但我不确定该怎么做。

c) 接下来,这是否可以在本地主机上测试,或者是测试在 heroku 上运行的唯一方法吗?也许这可能是问题之一...

d) 最后,我是否必须对 Heroku 本身执行任何操作才能 link 到我的 MailJet 帐户?显然,你使用 SendGrid,但我认为因为我已经有了 mailjet API 和 Secret Key,所以我不需要直接通过 Heroku 连接,是吗?

在此先感谢您的帮助。 -梦露

到目前为止,这是我的代码:

密码重置页面

<main class="form forgot-form">
  <section class="form-container">
    <h1>Reset password</h1>
    <p>Enter the email address associated with your account, and we’ll email you a link to reset your password.</p>
    <%= simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }, :defaults => {  wrapper: false }) do |f| %>
      <%= f.error_notification %>
      <%= f.input :email, required: true, autofocus: true, error: 'Email is required', 
      input_html: { class: 'form__field' }, label_html: { class: 'sr-only' }, placeholder: 'Email Address' %>
      <%= f.button :submit, "Send reset link", class: 'form__button mt-4' %>
    <% end%>
    <%= link_to '< Back to Login', new_user_session_path, class: "link go-page" %>
  </section>
</main>

邮寄者本身:

<p>Hello <%= @resource.email %>!</p>

<p>Someone has requested a link to change your password. You can do this through the link below.</p>

<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>

<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

初始化器:

# kindly generated by appropriated Rails generator
Mailjet.configure do |config|
  config.api_key = 'my-api-key--removed for safety'
  config.secret_key = 'my-secret-key--removed for safety'
  config.default_from = 'my-email--removed for safety'
  # Mailjet API v3.1 is at the moment limited to Send API.
  # We’ve not set the version to it directly since there is no other endpoint in that version.
  # We recommend you create a dedicated instance of the wrapper set with it to send your emails.
  # If you're only using the gem to send emails, then you can safely set it to this version.
  # Otherwise, you can remove the dedicated line into config/initializers/mailjet.rb.
  config.api_version = 'v3.1'
end

DEVELOPMENT.RB

  # Specify that we are using the MailJet API for transactional emails
  config.action_mailer.delivery_method = :mailjet

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

  config.action_mailer.perform_caching = false

PRODUCTION.RB

# Use a real queuing backend for Active Job (and separate queues per environment)
  # config.active_job.queue_adapter     = :resque
  # config.active_job.queue_name_prefix = "bdcommunity_#{Rails.env}"
  config.action_mailer.perform_caching = false
  # Ignore bad email addresses and do not raise email delivery errors.
  #Set this to true and configure the email server for immediate delivery to raise delivery errors.
  #NOTE FROM MONROE: We should look into this after we launch and as we develope the site further
  #config.action_mailer.raise_delivery_errors = false
  # Specify that we are using the MailJet API for transactional emails
  config.action_mailer.delivery_method = :mailjet
  # config.action_mailer.perform_deliveries = true

上面的 'perform_deliveries' 我在 2011 年的 post 上找到的,所以它很可能不起作用。我只是把它放在那里(注释掉)以防它可以帮助你弄清楚我们做错了什么。

您唯一需要的是 Gemfile 中的 Mailjet gem:

gem 'mailjet'

以及我写给 config/initializers/mail.rb 的以下配置:

Mailjet.configure do |config|
  config.api_key      = Rails.application.secrets.mailjet_username
  config.secret_key   = Rails.application.secrets.mailjet_password
  config.default_from = 'user@example.com'
end

然后您将配置您的环境以使用 mailjet 在您的 config/environments 文件中发送电子邮件:

config.action_mailer.delivery_method = :mailjet

您可能还需要检查 "sender addresses" 的 Mailjet 帐户以发现任何问题:https://app.mailjet.com/account/sender

对于 https://gorails.com,我在此处添加了 gorails.com 域以批准使用该域的所有电子邮件。

然后对于 Devise,您可以编辑 config/initializers/devise.rb 以更改它使用的电子邮件地址:

config.mailer_sender = 'GoRails <no-reply@gorails.com>'

您还可以自定义 ApplicationMailer 以使用相同的默认值。

class ApplicationMailer < ActionMailer::Base
  default from: 'GoRails <no-reply@gorails.com>'
  layout 'mailer'
end

我们成功了。以下是您可能会发现的一些额外提示:

  • Chris 确认我的 development.rb 和 production.rb 是正确的,所以你可以使用我的作为指导。
  • 我们发现有两个主要问题:1) 我们忘记更新 config.mailer_sender 正如 Chris 指出的那样 2) 我们不得不删除 error:email is required 代码。
  • 一旦我们这样做了,它就奏效了,即使在开发中也是如此。但是,我们收到了一封被退回的电子邮件,说我们没有授权电子邮件地址(我们在 config.mailer_sender 中设置的那个)所以我们按照它在电子邮件中提供给我们的 link 进行操作,这将我们带到了一个不可能在 mailjet 上找到的页面,它允许我们将我们公司域中的所有电子邮件地址列入白名单。这就是克里斯在上面讨论的内容。他在上面提供了该网址,但您可以通过尝试重置密码轻松获得它,如果一切设置正确,您将收到一封电子邮件,说明发件人电子邮件尚未获得授权。
  • 然后我们被要求通过我们的域名托管服务商(即 GoDaddy)安装 SPF 和 DKIM 记录:https://support.smtp2go.com/hc/en-gb/articles/223086887-SPF-and-DKIM-Setup-for-GoDaddy
  • 终于,我们再次测试,成功了。密码重置电子邮件功能正常!

希望对您有所帮助!

更新: 为了测试并使其在本地主机上运行,​​我们还必须更改此设置:

config.action_mailer_default_url_options= { host: 'localhost:3000' }

对此:

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

由于我们在 mailjet 上设置的安全设置,它实际上并没有从本地主机发送电子邮件。但是,如果您在请求重设密码后立即检查 rails 服务器日志,您应该会看到电子邮件已发送,以及电子邮件本身的主题和正文。据推测,这现在也适用于生产。