Обзор:

Action Mailbox направляет входящие электронные письма в почтовые ящики, похожие на контроллеры, для обработки в Rails. В этом документе мы обсуждаем настройку ActionMailbox с помощью Mailgun. Эта настройка будет работать не только с Mailgun, но и с любыми другими почтовыми сервисами.

Установка разделена на две части,

  1. Изменения в Rails для обработки электронных писем.
  2. Конечно, нам нужно настроить службу электронной почты, чтобы сервер rails мог читать электронную почту.

Изменение кода Rails:

Нам нужно добавить эту строку в application.rb, чтобы почтовый ящик действий работал.

# app/config/application.rb
require "action_mailbox/engine"

Затем выполните приведенную ниже команду, чтобы создать необходимые таблицы и конфигурацию. (Раздел настройки)

bin/rails action_mailbox:install
bin/rails db:migrate

Как и routes.rb, чтобы направить веб-запрос на определенный контроллер, нам нужны маршруты электронной почты, чтобы сделать то же самое. Для маршрутов электронной почты мы указываем их в ApplicationMailbox. Взять тот же пример отсюда.

# app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
  routing /^save@/i     => :forwards
end

В приведенном выше примере любое регулярное выражение, соответствующее /^save@/i, перенаправит их в почтовый ящик forwards.

Итак, нам нужно создать почтовый ящик forwarding. Его можно создать командой ниже. Это наши контроллеры для электронной почты.

$ bin/rails generate mailbox forwards

Код почтового ящика выглядит так. Почтовый ящик должен иметь метод process для обработки электронной почты.

# app/mailboxes/forwards_mailbox.rb
class ForwardsMailbox < ApplicationMailbox
  # Callbacks specify prerequisites to processing
  before_processing :pre_process
  def process
    # Code to process the email
  end
  private
def pre_process
    # Before processing callback
  end
end

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

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

# app/values/constants/emails.rb
module Constants
  module Emails
    PROCESS_ATTACHMENT_EMAIL_ADDRESS = /process\+(.+)@#{ENV["RECEIVING_EMAIL_DOMAIN"]}/i.freeze
  end
end
# app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
  # routing /something/i => :somewhere
  routing Constants::Emails::PROCESS_ATTACHMENT_EMAIL_ADDRESS => :process_attachments
end
# app/mailboxes/process_attachments_mailbox.rb
class ProcessAttachmentsMailbox < ApplicationMailbox
  def process
    case processor
when "one"
      process_one
when "two"
      process_two
end
  private
# This will return the processor.
  # Return value with any of the below 'to' addresses
  # process+one@staging_domain.com  => one
  # process+two@staging_domain.com  => two
  def processor
    matcher = Constants::Emails::PROCESS_ATTACHMENT_EMAIL_ADDRESS
recipient = mail.recipients.find { |r| matcher.match?(r) }
recipient[matcher, 1]
  end
def process_one
    # Process one
    # Attachments 
    mail.attachments.each do |attachment|
      next unless attachment.content_type.start_with?("text/csv")
# Save the file to /tmp. You can process the file instead.
      filename = "#{time_stamp}_#{attachment.filename}"
      filename = File.join("tmp", filename)
File.open(filename, "w+b", 0o644) do |f|
        f.write attachment.decoded.gsub(/\r+\n+/, "\r\n")
      end
    end
  end
def process_two
    # Process two
  end
end

Надеюсь, я не перепутал с приведенным выше примером. Я просто подумал поделиться доступными почтовыми переменными.

mail.to
mail.from
mail.subject
mail.attachments
mail.content

Как я могу протестировать в среде разработки?

Чтобы тестировать входящие электронные письма в процессе разработки без фактической отправки или получения реальных электронных писем, по адресу http://localhost:3000/rails/conductor/action_mailbox/inbound_emails установлен контроллер проводника, который дает вам индекс всех входящих электронных писем в системе. , состояние их обработки, а также форму для создания нового InboundEmail.

Если ваше приложение является приложением только для API, отредактируйте application.rb, задав config.api_only = false для отображения Просмотры.

Настройка мейлгана

Ссылка: Получение электронных писем — документация Mailgun и Подтверждение домена — документация Mailgun

Шаг 1:

В качестве первого шага нам нужен новый домен для этой настройки электронной почты. Скажем, если адрес электронной почты компании — @company.com, нам нужно создать поддомен в Mailgun, например staging.company.com/production.company.com. Мы не хотим нарушать существующий домен. Вы можете выполнить шаг 1 в этом документе Mailgun или в документе, предоставленном вашей почтовой службой. После добавления на странице настроек домена отобразятся записи DNS, которые необходимо добавить на веб-сайт поставщика домена. Нам нужно, чтобы записи MX и записи TXT были настроены на странице поставщика домена.

Шаг 2:

После выполнения вышеуказанного шага нам нужно настроить записи MX для домена, который мы использовали для электронной почты. Используйте субдомен, так как домен уже используется для вашей основной системы электронной почты.

т. е. для промежуточной установки настройте записи MX для домена staging.company.com, а для рабочей версии настройте записи MX для домена production.company.com.

Есть две записи, предоставленные mailgun. (mxa.mailgun.org и mxb.mailgun.org). Вам нужно настроить оба.

Шаг 3:

Чтобы проверить настройку домена, сделанную в mailgun, нам также нужно добавить записи TXT. Вы можете получить эти записи на странице настроек домена mailgun.

Если все шаги выполнены, через несколько минут/часов администратор получит электронное письмо о статусе установки.

Маршруты в Mailgun:

Теперь нам нужно направить электронные письма, полученные mailgun. Предположим, в приведенном выше промежуточном примере кто-то отправляет электронное письмо на адрес [email protected]. Mailgun должен перенаправить его на сервер rails, не так ли? Поэтому нам нужно настроить их в Mailgun.

Вы можете создавать маршруты в разделе Получение в mailgun. (Ссылка: https://documentation.mailgun.com/en/latest/api-routes.html#routes)

В моем примере маршруты будут выглядеть так

match_recipient("process+.*[email protected]") Priority: 0
forward("https://staging.company.com/rails/action_mailbox/mailgun/inbound_emails/mime")
stop()

Http-путь /rails/action_mailbox/mailgun/inbound_emails/mime — это место, где сервер rails прослушивает входящие электронные письма.

Тестирование маршрутов:

Если вам нужно протестировать эти маршруты, перейдите по этому адресу — http://bin.mailgun.net/. Он сгенерирует уникальный URL-адрес для тестирования. Настройте то же самое в своих маршрутах, чтобы при отправке электронного письма для настройки адреса вы могли проверить их в уникальном URL-адресе, предоставленном http://bin.mailgun.net/. Пример скриншота ниже.

После настройки маршрутов отправьте электронное письмо на адрес [email protected], чтобы проверить получение электронных писем. Как видите, мы перехватываем все электронные письма для домена @staging.company.com.

Последний шаг:

После того, как все протестировано по отдельности, настройте Mailgun для пересылки входящих писем на /rails/action_mailbox/mailgun/inbound_emails/mime. Если ваше приложение находится по адресу https://company.com, вы должны указать полный URL-адрес https://company.com/rails/action_mailbox/mailgun/inbound_emails/mime.

Пример ниже.

match_recipient("process+.*[email protected]") Priority: 0
forward("https://www.company.com/rails/action_mailbox/mailgun/inbound_emails/mime")
stop()

Вот так, народ! Удачи в экспериментах с ActionMailbox и Mailgun!