class ActionMailbox::Ingresses::Mailgun::InboundEmailsController
https://example.com/rails/action_mailbox/mailgun/inbound_emails/mime
.
If your application lived at https://example.com
, you would specify the fully-qualified URL
to forward inbound emails to /rails/action_mailbox/mailgun/inbound_emails/mime
.
3. {Configure Mailgun}[https://documentation.mailgun.com/en/latest/user_manual.html#receiving-forwarding-and-storing-messages]
config.action_mailbox.ingress = :mailgun
# config/environments/production.rb
2. Tell Action Mailbox to accept emails from Mailgun:
Alternatively, provide your Signing key in the MAILGUN_INGRESS_SIGNING_KEY
environment variable.
mailgun_signing_key: …
action_mailbox:action_mailbox.mailgun_signing_key
, where Action Mailbox will automatically find it:
Use bin/rails credentials:edit
to add your Signing key to your application’s encrypted credentials under
so it can authenticate requests to the Mailgun ingress.
1. Give Action Mailbox your Mailgun Signing key (which you can find under Settings -> Security & Users -> API security in Mailgun)
== Usage
the Active Storage service, or the Active Job backend is misconfigured or unavailable
- 500 Server Error
if the Mailgun Signing key is missing, or one of the Active Record database,
- 422 Unprocessable Entity
if the request is missing required parameters
- 404 Not Found
if Action Mailbox is not configured to accept inbound emails from Mailgun
- 401 Unauthorized
if the request’s signature could not be validated, or if its timestamp is more than 2 minutes old
- 204 No Content
if an inbound email is successfully recorded and enqueued for routing to the appropriate mailbox
Returns:
Authenticates requests by validating their signatures.
- signature
: A hexadecimal HMAC-SHA256 of the timestamp concatenated with the token, generated using the Mailgun Signing key
- token
: A randomly-generated, 50-character string
- timestamp
: The current time according to Mailgun as the number of seconds passed since the UNIX epoch
- body-mime
: The full RFC 822 message
Ingests inbound emails from Mailgun. Requires the following parameters:
def authenticate
def authenticate head :unauthorized unless authenticated? end
def authenticated?
def authenticated? if key.present? Authenticator.new( key: key, timestamp: params.require(:timestamp), token: params.require(:token), signature: params.require(:signature) ).authenticated? else raise ArgumentError, <<~MESSAGE.squish Missing required Mailgun Signing key. Set action_mailbox.mailgun_signing_key in your application's encrypted credentials or provide the MAILGUN_INGRESS_SIGNING_KEY environment variable. MESSAGE end end
def create
def create ActionMailbox::InboundEmail.create_and_extract_message_id! mail end
def key
def key if Rails.application.credentials.dig(:action_mailbox, :mailgun_api_key) ActiveSupport::Deprecation.warn(<<-MSG.squish) Rails.application.credentials.action_mailbox.api_key is deprecated and will be ignored in Rails 6.2. Use Rails.application.credentials.action_mailbox.signing_key instead. MSG Rails.application.credentials.dig(:action_mailbox, :mailgun_api_key) elsif ENV["MAILGUN_INGRESS_API_KEY"] ActiveSupport::Deprecation.warn(<<-MSG.squish) The MAILGUN_INGRESS_API_KEY environment variable is deprecated and will be ignored in Rails 6.2. Use MAILGUN_INGRESS_SIGNING_KEY instead. MSG ENV["MAILGUN_INGRESS_API_KEY"] else Rails.application.credentials.dig(:action_mailbox, :mailgun_signing_key) || ENV["MAILGUN_INGRESS_SIGNING_KEY"] end end
def mail
def mail params.require("body-mime").tap do |raw_email| raw_email.prepend("X-Original-To: ", params.require(:recipient), "\n") if params.key?(:recipient) end end