1 What is Action Mailbox?
Action Mailbox enruta los correos electrónicos entrantes a buzones de correo tipo controlador para procesamiento en Rails. Se envía con entradas para Mailgun, Mandrill, Postmark, y SendGrid. También puede manejar correos entrantes directamente a través del Exim integrado, Postfix y Qmail ingresa.
Los correos electrónicos entrantes se convierten en registros "InboundEmail" utilizando Active Record y cuenta con seguimiento del ciclo de vida, almacenamiento del correo electrónico original en el almacenamiento en la nube a través de Active Storage y el manejo responsable de datos con en incineración por defecto.
Estos correos electrónicos entrantes se enrutan de forma asincrónica utilizando Active Job a uno o varios buzones de correo dedicados, que son capaces de interactuar directamente con el resto de su modelo de dominio.
2 Setup
Instale las migraciones necesarias para InboundEmail
y asegúrese de que Active Storage esté configurado:
$ bin/rails action_mailbox:install
$ bin/rails db:migrate
3 Configuration
3.1 Exim
Dile a Action Mailbox que acepte correos electrónicos de una retransmisión SMTP:
# config/environments/production.rb
config.action_mailbox.ingress = :relay
Genere una contraseña segura que Action Mailbox pueda usar para autenticar las solicitudes al ingreso de retransmisión.
Use bin/rails credentials:edit
para agregar la contraseña a las credenciales encriptadas de su aplicación en
action_mailbox.ingress_password
, donde Action Mailbox la encontrará automáticamente:
action_mailbox:
ingress_password: ...
Alternativamente, proporcione la contraseña en el variable de entorno RAILS_INBOUND_EMAIL_PASSWORD
.
Configure Exim para canalizar correos electrónicos entrantes a bin/rails action_mailbox:ingress:exim
,
proporcionando la URL
de la entrada del relé y laINGRESS_PASSWORD
generado previamente. Si su aplicación residía en https://example.com
, el
comando completo se vería así:
bin/rails action_mailbox:ingress:exim URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...
3.2 Mailgun
Dale a Action Mailbox tu Clave de firma de Mailgun (que puede encontrar en Configuración -> Seguridad y usuarios -> Seguridad de API en Mailgun) para que pueda autenticar solicitudes al ingreso de Mailgun.
Use bin / rails credentials: edit
para agregar su clave de firma a la
credenciales cifradas en action_mailbox.mailgun_signing_key
,
donde Action Mailbox lo encontrará automáticamente:
action_mailbox:
mailgun_signing_key: ...
Alternativamente, proporcione su clave de firma en el entorno MAILGUN_INGRESS_SIGNING_KEY
variable.
Dile a Action Mailbox que acepte correos electrónicos de Mailgun:
# config/environments/production.rb
config.action_mailbox.ingress = :mailgun
Configure Mailgun
para reenviar correos electrónicos entrantes a /rails/action_mailbox/mailgun/inbound_emails/mime
.
Si su solicitud vive en https://example.com
, usted especificaría el
URL totalmente calificado https://example.com/rails/action_mailbox/mailgun/inbound_emails/mime
.
3.3 Mandrill
Dé a Action Mailbox su clave API de Mandrill para que pueda autenticar solicitudes a la entrada de Mandrill.
Use bin/rails credentials:edit
para agregar su clave API a la de su aplicación
credenciales cifradas en action_mailbox.mandrill_api_key
,
donde Action Mailbox lo encontrará automáticamente:
action_mailbox:
mandrill_api_key: ...
Alternativamente, proporcione su clave API en el MANDRILL_INGRESS_API_KEY
variable ambiental.
Dile a Action Mailbox que acepte correos electrónicos de Mandrill:
# config/environments/production.rb
config.action_mailbox.ingress = :mandrill
Configure Mandrill
para enrutar correos electrónicos entrantes a /rails/action_mailbox/mandrill/inbound_emails
.
Si su solicitud vive en https://example.com
, usted especificaría el
URL totalmente calificado https://example.com/rails/action_mailbox/mandrill/inbound_emails
.
3.4 Postfix
Dile a Action Mailbox que acepte correos electrónicos de una retransmisión SMTP:
# config/environments/production.rb
config.action_mailbox.ingress = :relay
Genere una contraseña segura que Action Mailbox pueda usar para autenticar las solicitudes al ingreso de retransmisión.
Use bin/rails credentials:edit
para agregar la contraseña a las credenciales encriptadas de su aplicación en
action_mailbox.ingress_password
, donde Action Mailbox la encontrará automáticamente:
action_mailbox:
ingress_password: ...
Alternativamente, proporcione la contraseña en la variable de entorno RAILS_INBOUND_EMAIL_PASSWORD
.
Configure Postfix
para canalizar correos electrónicos entrantes a bin/rails action_mailbox:ingress:postfix
, proporcionando
la URL
de la entrada de Postfix y laINGRESS_PASSWORD
que previamente
genero. Si su aplicación vive en https: // example.com
, el comando completo
se vería así:
$ bin/rails action_mailbox:ingress:postfix URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...
3.5 Postmark
Dile a Action Mailbox que acepte correos electrónicos de matasellos:
# config/environments/production.rb
config.action_mailbox.ingress = :postmark
Genere una contraseña segura que Action Mailbox pueda usar para autenticarse solicitudes al ingreso del matasellos.
Use bin/rails credentials:edit
para agregar la contraseña a la
credenciales cifradas en action_mailbox.ingress_password
,
donde Action Mailbox lo encontrará automáticamente:
action_mailbox:
ingress_password: ...
Alternatively, provide the password in the RAILS_INBOUND_EMAIL_PASSWORD
environment variable.
Configure Postmark inbound webhook
para reenviar correos electrónicos entrantes a /rails/action_mailbox/postmark/inbound_emails
con el nombre de usuario actionmailbox
y la contraseña que generó anteriormente. Si su aplicación se encuentra en https://example.com
,
configure Matasellos con la siguiente URL completa:
https://actionmailbox:PASSWORD@example.com/rails/action_mailbox/postmark/inbound_emails
Cuando configure su webhook entrante de Matasellos, asegúrese de marcar la casilla etiquetada "Incluir contenido de correo electrónico sin procesar en la carga útil JSON". Action Mailbox necesita el contenido de correo electrónico sin procesar para funcionar.
3.6 Qmail
Dile a Action Mailbox que acepte correos electrónicos de una retransmisión SMTP:
# config/environments/production.rb
config.action_mailbox.ingress = :relay
Genere una contraseña segura que Action Mailbox pueda usar para autenticar las solicitudes al ingreso de retransmisión.
Use bin/rails credentials:edit
para agregar la contraseña a las credenciales encriptadas de su aplicación en
action_mailbox.ingress_password
, donde Action Mailbox la encontrará automáticamente:
action_mailbox:
ingress_password: ...
Alternativamente, proporcione la contraseña en la variable de entorno RAILS_INBOUND_EMAIL_PASSWORD
.
Configure Qmail para canalizar correos electrónicos entrantes a bin/rails action_mailbox: ingress: mail
,
proporcionando la URL
de la entrada del relé y la INGRESS_PASSWORD
generado previamente. Si su aplicación residía en https://example.com
, el
comando completo se vería así:
bin/rails action_mailbox:ingress:qmail URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...
3.7 SendGrid
Dile a Action Mailbox que acepte correos electrónicos de SendGrid:
# config/environments/production.rb
config.action_mailbox.ingress = :sendgrid
Genere una contraseña segura que Action Mailbox pueda usar para autenticarse solicitudes a la entrada de SendGrid.
Use bin/rails credentials:edit
para agregar la contraseña a la
credenciales cifradas en action_mailbox.ingress_password
,
donde Action Mailbox lo encontrará automáticamente:
action_mailbox:
ingress_password: ...
Alternativamente, proporcione la contraseña en RAILS_INBOUND_EMAIL_PASSWORD
variable ambiental.
Configure SendGrid Inbound Parse
para reenviar correos electrónicos entrantes a
/rails/action_mailbox/sendgrid/inbound_emails
con el nombre de usuarioactionmailbox
y la contraseña que generó anteriormente. Si su aplicación se encuentra en https://example.com
,
configurarías SendGrid con la siguiente URL:
https://actionmailbox:PASSWORD@example.com/rails/action_mailbox/sendgrid/inbound_emails
Cuando configure su webhook SendGrid Inbound Parse, asegúrese de marcar la casilla con la etiqueta ** "Publicar el mensaje MIME completo y sin procesar". ** Action Mailbox necesita el mensaje MIME sin procesar para funcionar.
4 Examples
Configure el enrutamiento básico:
# app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
routing /^save@/i => :forwards
routing /@replies\./i => :replies
end
Luego configura un buzón:
# Generate new mailbox
$ bin/rails generate mailbox forwards
# app/mailboxes/forwards_mailbox.rb
class ForwardsMailbox < ApplicationMailbox
# Callbacks specify prerequisites to processing
before_processing :require_projects
def process
# Record the forward on the one project, or…
if forwarder.projects.one?
record_forward
else
# …involve a second Action Mailer to ask which project to forward into.
request_forwarding_project
end
end
private
def require_projects
if forwarder.projects.none?
# Use Action Mailers to bounce incoming emails back to sender – this halts processing
bounce_with Forwards::BounceMailer.no_projects(inbound_email, forwarder: forwarder)
end
end
def record_forward
forwarder.forwards.create subject: mail.subject, content: mail.content
end
def request_forwarding_project
Forwards::RoutingMailer.choose_project(inbound_email, forwarder: forwarder).deliver_now
end
def forwarder
@forwarder ||= User.find_by(email_address: mail.from)
end
end
5 Incineration of InboundEmails
De forma predeterminada, un InboundEmail que se haya procesado correctamente será incinerado después de 30 días. Esto asegura que no está reteniendo los datos de las personas. quiera o no después de que hayan cancelado sus cuentas o eliminado sus contenido. La intención es que después de haber procesado un correo electrónico, debería haber extrajo todos los datos que necesitaba y los convirtió en modelos de dominio y contenido en su lado de la aplicación. El InboundEmail simplemente permanece en el sistema por el tiempo extra para proporcionar opciones de depuración y forenses.
La incineración real se realiza a través del IncinerationJob
que está programado
para ejecutarse después del tiempo de config.action_mailbox.incinerate_after
. Este valor es
por defecto establecido en 30.days
, pero puede cambiarlo en su producción.rb
configuración. (Tenga en cuenta que esta programación de incineración en el futuro lejano se basa en
su cola de trabajos puede retener trabajos durante tanto tiempo).
6 Working with Action Mailbox in development
Es útil poder probar los correos electrónicos entrantes en desarrollo sin realmente
enviar y recibir correos electrónicos reales. Para lograr esto, hay un director
controlador montado en /rails/conductor/action_mailbox/inbound_emails
,
que le da un índice de todos los InboundEmails en el sistema, su
estado de procesamiento y un formulario para crear un nuevo InboundEmail también.
7 Testing mailboxes
Ejemplo:
class ForwardsMailboxTest < ActionMailbox::TestCase
test "directly recording a client forward for a forwarder and forwardee corresponding to one project" do
assert_difference -> { people(:david).buckets.first.recordings.count } do
receive_inbound_email_from_mail \
to: 'save@example.com',
from: people(:david).email_address,
subject: "Fwd: Status update?",
body: <<~BODY
--- Begin forwarded message ---
From: Frank Holland <frank@microsoft.com>
What's the status?
BODY
end
recording = people(:david).buckets.first.recordings.last
assert_equal people(:david), recording.creator
assert_equal "Status update?", recording.forward.subject
assert_match "What's the status?", recording.forward.content.to_s
end
end
Comentarios Sobre el Contenido
Las guías de rieles se administran y publican en latinadeveloper/railsguides.es en GitHub.
Si lee esta guía y encuentra algún texto o código incorrecto que le interese, no dude en enviar una solicitud de extracción en el repositorio anterior. Consulte el archivo README en GitHub para saber cómo enviar una solicitud de extracción. Please contribute if you see any typos or factual errors.