Связь Devise с Mailjet - PullRequest
       14

Связь Devise с Mailjet

0 голосов
/ 17 ноября 2018

Мы пытаемся связать нашу форму для сброса пароля с гемом mailjet. Я следовал всем инструкциям на mailjet repo read-me, но мне все еще не удается подключить API до формы «Сброс пароля» Devise, и кажется, что что-то не хватает.

a) Во-первых, я всюду искал на google, сайте поддержки mailjet, и здесь, на Stackoverflow, но, похоже, нигде не могу найти никаких инструкций, помогающих связать MailJet с Devise. Я что-то пропустил?

b) Если нет заранее написанных руководств о том, как это сделать, может кто-нибудь любезно помочь с конкретными шагами, которые мне нужно предпринять, чтобы убедиться, что при нажатии «Отправить ссылку для сброса пароля» на нашей странице входа в систему для разработки он правильно отправляет электронное письмо? Прямо сейчас мы получаем ошибку: требуется электронная почта. Но мой адрес электронной почты там. Так что это не правильно соединяется. Я думаю, что нам нужно подключить эту конкретную страницу устройства к api mailjet, но я не уверен, как это сделать.

в) Далее, это тестируемый на локальном хосте или единственный способ протестировать, чтобы запустить на герою? Возможно, это может быть одной из проблем ...

d) Наконец, нужно ли что-то делать на самом Heroku, чтобы подключиться к моей учетной записи MailJet? Видимо, вы делаете с SendGrid, но я думаю, потому что у меня уже есть mailjet API и Secret Key, мне не нужно подключаться напрямую через Heroku, да?

Заранее спасибо за любую помощь. -Monroe

Вот мой код:

СТРАНИЦА СБРОСА ПАРОЛЯ

<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

Выше я обнаружил сообщение "execute_deliveries", опубликованное в 2011 году, поэтому оно может не сработать. Я просто поместил это (закомментировано) на случай, если это поможет вам понять, что мы делаем неправильно.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

У нас это работает. Вот несколько дополнительных советов, которые вам могут пригодиться:

  • Крис подтвердил, что мои development.rb и production.rb были правильными, поэтому вы можете использовать мои в качестве руководства.
  • Мы обнаружили, что существует две основные проблемы: 1) мы забыли обновить config.mailer_sender, как указал Крис, И 2) нам пришлось удалить код error:email is required.
  • Как только мы это сделали, это сработало, даже в разработке. Тем не менее, мы получили электронное письмо, в котором говорилось, что мы не авторизовали адрес электронной почты (тот, который мы установили в config.mailer_sender), поэтому мы перешли по ссылке, которую он предоставил нам в электронном письме, что привело нас к странице, которую невозможно найти иначе. на mailjet, который позволил нам внести в белый список все адреса электронной почты с домена нашей компании. Это то, что Крис обсуждал выше. Он предоставляет указанный выше веб-адрес, но вы можете легко получить его, попытавшись сбросить пароль, и, если все настроено правильно, вы получите электронное письмо с сообщением о том, что электронная почта отправителя еще не авторизована.
  • Затем нас попросили установить записи SPF и DKIM через хост нашего домена (который является GoDaddy): https://support.smtp2go.com/hc/en-gb/articles/223086887-SPF-and-DKIM-Setup-for-GoDaddy
  • Наконец, мы снова проверили, и это сработало. Электронная почта сброса пароля функционировала правильно!

Надеюсь, это поможет!

UPDATE: Чтобы протестировать и заставить его работать на локальном хосте, нам также пришлось изменить это:

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

на это:

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

Он фактически не отправляет электронное письмо с локального хоста из-за настроек безопасности, которые мы установили на mailjet. Но если вы проверите журнал сервера rails, как только запросите сброс пароля, вы должны увидеть, что электронное письмо было отправлено, а также тему и текст самого электронного письма. И, по-видимому, теперь это будет работать и на производстве.

0 голосов
/ 17 ноября 2018

Единственное, что вам нужно, это драгоценный камень Mailjet в вашем Gemfile:

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

Вам также может понадобиться проверить в своей учетной записи 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
...