Rails 6 ActionMailbox с почтовым оружием, возвращающим 404 - PullRequest
1 голос
/ 15 октября 2019

Я разрабатываю приложение для внутренних расходов на Rails 6 с ActionMailbox для замены электронных таблиц Excel. Поскольку многие из наших квитанций теперь находятся в форме электронной почты (например, авиабилетов), идея заключается в том, что пользователи смогут просто переслать квитанцию ​​в приложение, и она будет автоматически связана с вводом расходов.

Я использую ActionMailbox с Mailgun в качестве получателя электронной почты. По предложению учебника Gorails Pro я показал свое приложение, используя localtunnel, общему Интернету. Я использовал средство Mailgun, чтобы отправить тестовое электронное письмо в свое приложение.

Мой почтовый адрес:

https://xxxxxxxx.localtunnel.me/rails/action_mailbox/mailgun/inbound_emails/mime

Однако я столкнулся с проблемой, когда входящая электронная почта из Mailgun обрабатывается неправильно, но возвращается с ошибкой 404. Журнал Rails показывает сообщение, полученное как POST. Последние две записи в журнале:

2019-10-15T07:50:07.646Z 10260 TID-gn609ivg8 INFO: Filter chain halted as :ensure_configured rendered or redirected
2019-10-15T07:50:07.646Z 10260 TID-gn609ivg8 INFO: Completed 404 Not Found in 0ms (ActiveRecord: 0.0ms | Allocations: 144)

Моя конфигурация: config / rout.rb

Rails.application.routes.draw do
  devise_for :users
  resources :categories

  resources :expense_claims do
    get 'export_excel', on: :member
    post 'barclay_csv_import', on: :collection
  end

  resources :expense_entries

  root 'expense_claims#index'

  # Enable the sidekiq console.
  require 'sidekiq/web'
  mount Sidekiq::Web => '/sidekiq'
end

config / application.rb

module Expenses
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.

    # Set the ActionMailbox ingress here for now.
    config.action_mailbox.ingress = :mail_gun
  end
end

config / environment / development.rb

Rails.application.configure do

  [... lot of stuff removed as not relevant]
  # Settings specified here will take precedence over those in config/application.rb.
  config.action_mailer.default_url_options = { host: '0.0.0.0', port: 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { address: '0.0.0.0', port: 1025 }

  # Set the active job queue adapter to Sidekiq/Redis
  # config.active_job.queue_adapter = :sidekiq
  # Alternatively, when debugging, you can set to in-line (or :async)
  config.active_job.queue_adapter = :inline

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

  config.action_mailer.perform_caching = false


  # Set so we can test Devise self registration
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

  # Allow traffic from localtunnel
  config.hosts << 'xxxxxx.localtunnel.me'
end

app / mailboxes / application_mailbox.rb

class ApplicationMailbox < ActionMailbox::Base
  routing :all => :receipt
end

app / mailboxes / receive_mailbox.rb

class ReceiptMailbox < ApplicationMailbox
  # mail => Mail object
  # inbound_email => ActionMailboxEmail record
  def process

  end
end

1 Ответ

0 голосов
/ 16 октября 2019

Ну, оказывается, это была самая глупая из ошибок. В config / application.rb окончательная конфигурация была неверной. Мне нужно было заменить :mail_gun на :mailgun:

    # Set the ActionMailbox ingress here for now.
    config.action_mailbox.ingress = :mailgun

К сожалению, сообщение об ошибке Rails здесь не очень помогло.

Чтобы дать немного больше информации, ActionMailbox имеет номерразных маршрутов, определенных для разных почтовых процессоров. Следовательно, URL-адрес, по которому обработчик электронной почты публикует входящую электронную почту, определяет используемый контроллер. Получив письмо, Rails проверяет, соответствует ли URL-адрес, на который было отправлено письмо, классу ingress, установленному в конфигурации. Если нет, вы получите ошибку, которую я видел.

...