Обзор:
Action Mailbox направляет входящие электронные письма в почтовые ящики, похожие на контроллеры, для обработки в Rails. В этом документе мы обсуждаем настройку ActionMailbox с помощью Mailgun. Эта настройка будет работать не только с Mailgun, но и с любыми другими почтовыми сервисами.
Установка разделена на две части,
- Изменения в Rails для обработки электронных писем.
- Конечно, нам нужно настроить службу электронной почты, чтобы сервер 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_twoend
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] enddef 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 endend
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!