1 What is Action Mailer?
Action Mailer le permite enviar correos electrónicos desde su aplicación utilizando clases de correo y vistas.
1.1 Mailers are similar to controllers
Heredan de ActionMailer::Base
y viven en app/mailers
. Los mailers también funcionan
de manera muy similar a los controladores. A continuación se enumeran algunos ejemplos de similitudes.
Los correos tienen:
- Acciones, y también, vistas asociadas que aparecen en
app/views
. - Variables de instancia a las que se puede acceder en vistas.
- La capacidad de utilizar diseños y parciales.
- La capacidad de acceder a un hash de parámetros.
2 Sending Emails
Esta sección proporcionará una guía paso a paso para crear un envío de correo y su puntos de vista.
2.1 Walkthrough to Generating a Mailer
2.1.1 Create the Mailer
$ bin/rails generate mailer UserMailer
create app/mailers/user_mailer.rb
create app/mailers/application_mailer.rb
invoke erb
create app/views/user_mailer
create app/views/layouts/mailer.text.erb
create app/views/layouts/mailer.html.erb
invoke test_unit
create test/mailers/user_mailer_test.rb
create test/mailers/previews/user_mailer_preview.rb
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "from@example.com"
layout 'mailer'
end
# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
end
Como puede ver, puede generar anuncios publicitarios del mismo modo que usa otros generadores con Rieles.
Si no desea utilizar un generador, puede crear su propio archivo dentro de
app/mailers
, solo asegúrate de que herede de ActionMailer::Base
:
class MyMailer < ActionMailer::Base
end
2.1.2 Edit the Mailer
Los remitentes de correo tienen métodos llamados "acciones" y utilizan vistas para estructurar su contenido. Donde un controlador genera contenido como HTML para enviar de vuelta al cliente, un Mailer crea un mensaje que se enviará por correo electrónico.
app/mailers/user_mailer.rb
contiene un mailer vacío:
class UserMailer < ApplicationMailer
end
Agreguemos un método llamado welcome_email
, que enviará un correo electrónico al usuario
Dirección de correo electrónico registrado:
class UserMailer < ApplicationMailer
default from: 'notifications@example.com'
def welcome_email
@user = params[:user]
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end
A continuación se ofrece una explicación rápida de los elementos presentados en el método anterior. En una lista completa de todas las opciones disponibles, eche un vistazo más abajo en la lista completa de la sección de atributos configurables por el usuario de Action Mailer.
-
default Hast
: este es un hash de valores predeterminados para cualquier correo electrónico que envíe desde este anuncio publicitario. En este caso, estamos configurando el encabezado:from
a un valor para todos mensajes en esta clase. Esto se puede anular por correo electrónico. -
mail
- El mensaje de correo electrónico real, estamos pasando el:to
y:subject
encabezados en.
2.1.3 Create a Mailer View
Crea un archivo llamado welcome_email.html.erb
en app/views/user_mailer/
. Este
será la plantilla utilizada para el correo electrónico, formateada en HTML:
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Welcome to example.com, <%= @user.name %></h1>
<p>
You have successfully signed up to example.com,
your username is: <%= @user.login %>.<br>
</p>
<p>
To login to the site, just follow this link: <%= @url %>.
</p>
<p>Thanks for joining and have a great day!</p>
</body>
</html>
También hagamos una parte de texto para este correo electrónico. No todos los clientes prefieren los correos electrónicos HTML,
por lo que enviar ambos es una buena práctica. Para hacer esto, cree un archivo llamado
welcome_email.text.erb
en app/views/user_mailer/
:
Welcome to example.com, <%= @user.name %>
===============================================
You have successfully signed up to example.com,
your username is: <%= @user.login %>.
To login to the site, just follow this link: <%= @url %>.
Thanks for joining and have a great day!
Cuando llame al método mail
ahora, Action Mailer detectará las dos plantillas
(texto y HTML) y generara automáticamente un correo electrónico multipart/alternative
.
2.1.4 Calling the Mailer
Los anuncios de correo son realmente otra forma de representar una vista. En lugar de representar una vista y enviarlo a través del protocolo HTTP, simplemente lo están enviando a través de los protocolos de correo electrónico. Debido a esto, tiene sentido que su controlador le diga al Mailer que envíe un correo electrónico cuando se cree un usuario con éxito.
Configurar esto es simple.
Primero, creemos un andamio simple de User
:
$ bin/rails generate scaffold user name email login
$ bin/rails db:migrate
Ahora que tenemos un modelo de usuario para jugar, simplemente editaremos el
app/controllers/users_controller.rb
hace que indique al UserMailer
que entregue
un correo electrónico al usuario recién creado editando la acción de creación e insertando un
llamar a UserMailer.with(user:@user).welcome_email
justo después de que el usuario se haya guardado correctamente.
Action Mailer está muy bien integrado con Active Job para que se pueda enviar correos electrónicos al exterior del ciclo de solicitud-respuesta, por lo que el usuario no tiene que esperarlo:
class UsersController < ApplicationController
# POST /users
# POST /users.json
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
# Tell the UserMailer to send a welcome email after save
UserMailer.with(user: @user).welcome_email.deliver_later
format.html { redirect_to(@user, notice: 'User was successfully created.') }
format.json { render json: @user, status: :created, location: @user }
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
end
El comportamiento predeterminado de Active Job es ejecutar trabajos a través del adaptador :async
. Entonces, puedes usar
deliver_later
ahora para enviar correos electrónicos de forma asincrónica.
El adaptador predeterminado de Active Job ejecuta trabajos con un grupo de subprocesos en proceso.
Es adecuado para los entornos de desarrollo/prueba, ya que no requiere
cualquier infraestructura externa, pero no se ajusta bien a la producción, ya que cae
trabajos pendientes al reiniciar.
Si necesita un backend persistente, deberá usar un adaptador de Active Job
que tiene un backend persistente (Sidekiq, Resque, etc.).
Al llamar a deliver_later
, el trabajo se colocará en la cola de mailers
. Asegúrese de que el adaptador de trabajo activo lo admita, de lo contrario, el trabajo puede ignorarse silenciosamente y evitar la entrega de correo electrónico. Puede cambiar eso especificando la opción config.action_mailer.deliver_later_queue_name
.
Si desea enviar correos electrónicos de inmediato (desde un cronjob, por ejemplo) simplemente llame
deliver_now
:
class SendWeeklySummary
def run
User.find_each do |user|
UserMailer.with(user: user).weekly_summary.deliver_now
end
end
end
Cualquier par de clave-valor que se pase a with
se convierte en el params
del envío de correo
acción. Entonces, with(user:@user,account:@user.account)
hace params[:user]
y
params[:account]
disponible en la acción de correo. Al igual que los controladores
params.
El método welcome_email
devuelve un objeto ActionMailer::MessageDelivery
que
entonces simplemente se le puede decir a deliver_now
o deliver_later
que se envíe a sí mismo.
El objeto ActionMailer::MessageDelivery
es solo un envoltorio alrededor de un Mail::Message
. Si
desea inspeccionar, alterar o hacer cualquier otra cosa con el objeto Mail::Message
que puede
acceda a él con el método message
en el objeto ActionMailer::MessageDelivery
.
2.2 Auto encoding header values
Action Mailer maneja la codificación automática de caracteres multibyte dentro de encabezados y cuerpos.
Para ejemplos más complejos, como definir conjuntos de caracteres alternativos o texto de autocodificación primero, consulte la biblioteca Mail.
2.3 Complete List of Action Mailer Methods
Solo hay tres métodos que necesita para enviar prácticamente cualquier correo electrónico mensaje:
-
headers
: especifica cualquier encabezado del correo electrónico que desee. Puedes pasar un hash de nombres de campo de encabezado y pares de valores, o puede llamarheaders[:field_name] = 'value'
. -
attachments
: le permite agregar archivos adjuntos a su correo electrónico. Por ejemplo,attachments['file-name.jpg'] = File.read('file-name.jpg')
. -
mail
: envía el correo electrónico real. Puede pasar encabezados como hash a el método de correo como parámetro, el correo creará un correo electrónico, ya sea sin formato texto, o multiparte, según las plantillas de correo electrónico que haya definido.
2.3.1 Adding Attachments
Action Mailer hace que sea muy fácil agregar archivos adjuntos.
-
Pase el nombre y el contenido del archivo y Action Mailer y la Mail gem adivinará automáticamente el mime_type, establezca la codificación y cree el archivo adjunto.
attachments['filename.jpg'] = File.read('/path/to/filename.jpg')
Cuando se active el método
mail
, enviará un correo electrónico de varias partes con un archivo adjunto, correctamente anidado con el nivel superior siendomultipart/mixed
y la primera parte es unamultipart/alternative
que contiene el texto plano y Mensajes de correo electrónico HTML.
Mail codificará automáticamente un archivo adjunto en Base64. Si quieres algo
diferente, codifique su contenido y pase el contenido codificado y la codificación en un
Hash
al método attachments
.
-
Pase el nombre del archivo y especifique los encabezados y el contenido y Action Mailer y Mail utilizará la configuración que ingrese.
encoded_content = SpecialEncode(File.read('/path/to/filename.jpg')) attachments['filename.jpg'] = { mime_type: 'application/gzip', encoding: 'SpecialEncoding', content: encoded_content }
Si especifica una codificación, Mail asumirá que su contenido ya está codificado y no intentara codificarlo en Base64.
2.3.2 Making Inline Attachments
Action Mailer 3.0 crea archivos adjuntos en línea, que implicaron una gran cantidad de piratería en las versiones anteriores a 3.0, mucho más simples y triviales como deberían ser.
-
Primero, para decirle a Mail que convierta un adjunto en un adjunto en línea, simplemente llame a
#inline
en el método de adjuntos dentro de su Mailer:def welcome attachments.inline['image.jpg'] = File.read('/path/to/image.jpg') end
- Luego, en su opinión, puede hacer referencia a
attachments
como un hash y especificar qué archivo adjunto desea mostrar, llamando aurl
y luego pasando el resultado en el métodoimage_tag
:
<p>Hello there, this is our image</p> <%= image_tag attachments['image.jpg'].url %>
- Como esta es una llamada estándar a
image_tag
, puedes pasar un hash de opciones después de la URL del archivo adjunto como podría hacerlo con cualquier otra imagen:
<p>Hello there, this is our image</p> <%= image_tag attachments['image.jpg'].url, alt: 'My Photo', class: 'photos' %>
- Luego, en su opinión, puede hacer referencia a
2.3.3 Sending Email To Multiple Recipients
Es posible enviar un correo electrónico a uno o a más destinatarios en un correo electrónico (por ejemplo,
informando a todos los administradores de un nuevo registro) configurando la lista de correos electrónicos en el :to
llave. La lista de correos electrónicos puede ser una serie de direcciones de correo electrónico o una sola cadena
con las direcciones separadas por comas.
class AdminMailer < ApplicationMailer
default to: -> { Admin.pluck(:email) },
from: 'notification@example.com'
def new_registration(user)
@user = user
mail(subject: "New User Signup: #{@user.email}")
end
end
Se puede utilizar el mismo formato para configurar copia carbón (Cc :) y copia carbón oculta
(Cco :), utilizando las teclas :cc
y :bcc
respectivamente.
2.3.4 Sending Email With Name
A veces desea mostrar el nombre de la persona en lugar de solo su correo electrónico
dirección cuando reciben el correo electrónico. Puede utilizar email_address_with_name
para
ese:
def welcome_email
@user = params[:user]
mail(
to: email_address_with_name(@user.email, @user.name),
subject: 'Welcome to My Awesome Site'
)
end
2.4 Mailer Views
Las vistas de correo se encuentran en el directorio app/views/name_of_mailer_class
.
Las vista de correo específica es conocida por la clase porque su nombre es el mismo que el
método de correo. En nuestro ejemplo anterior, nuestra vista de correo para el
El método welcome_email
estará en app/views/user_mailer/welcome_email.html.erb
para la versión HTML y welcome_email.text.erb
para la versión de texto sin formato.
Para cambiar la vista de correo predeterminada para su acción, haga algo como:
class UserMailer < ApplicationMailer
default from: 'notifications@example.com'
def welcome_email
@user = params[:user]
@url = 'http://example.com/login'
mail(to: @user.email,
subject: 'Welcome to My Awesome Site',
template_path: 'notifications',
template_name: 'another')
end
end
En este caso, buscará plantillas en app/views/Notifications
con nombre
another
. También se puede especificar una matriz de rutas para template_path
, y
se buscará en orden.
Si desea más flexibilidad, también puede pasar un bloque y renderizar específicos plantillas o incluso renderizar en línea o texto sin usar un archivo de plantilla:
class UserMailer < ApplicationMailer
default from: 'notifications@example.com'
def welcome_email
@user = params[:user]
@url = 'http://example.com/login'
mail(to: @user.email,
subject: 'Welcome to My Awesome Site') do |format|
format.html { render 'another_template' }
format.text { render plain: 'Render text' }
end
end
end
Esto representará la plantilla 'another_template.html.erb' para la parte HTML y
utilice el texto renderizado para la parte de texto. El comando de renderizado es el mismo que se usa
dentro de Action Controller, por lo que puede usar las mismas opciones, como
:text
,:inline
etc.
Si deseas renderizar una plantilla ubicada fuera del directorio predeterminado app/views/mailer_name/
, puedes aplicar el prepend_view_path
, así:
class UserMailer < ApplicationMailer
prepend_view_path "custom/path/to/mailer/view"
# This will try to load "custom/path/to/mailer/view/welcome_email" template
def welcome_email
# ...
end
end
También puede considerar usar el método append_view_path.
2.4.1 Caching mailer view
Puede realizar el almacenamiento en caché de fragmentos en vistas de correo como en vistas de aplicaciones utilizando el método cache
.
<% cache do %>
<%= @company.name %>
<% end %>
Y para utilizar esta función, debe configurar su aplicación con esto:
config.action_mailer.perform_caching = true
El almacenamiento en caché de fragmentos también se admite en correos electrónicos de varias partes. Obtenga más información sobre el almacenamiento en caché en Rails caching guide.
2.5 Action Mailer Layouts
Al igual que las vistas de controlador, también puede tener diseños de correo. El nombre del diseño
debe ser el mismo que su correo, como user_mailer.html.erb
y
user_mailer.text.erb
para que su gestor de correo lo reconozca automáticamente como
diseño.
Para usar un archivo diferente, llame a layout
en su mailer:
class UserMailer < ApplicationMailer
layout 'awesome' # use awesome.(html|text).erb as the layout
end
Al igual que con las vistas del controlador, use yield
para representar la vista dentro del
diseño.
También puede pasar una opción layout: 'layout_name'
a la llamada de renderización dentro
el bloque de formato para especificar diferentes diseños para diferentes formatos:
class UserMailer < ApplicationMailer
def welcome_email
mail(to: params[:user].email) do |format|
format.html { render layout: 'my_layout' }
format.text
end
end
end
Representará la parte HTML usando el archivo my_layout.html.erb
y la parte de texto
con el archivo user_mailer.text.erb
habitual si existe.
2.6 Previewing Emails
Las vistas previas de Action Mailer proporcionan una manera de ver cómo se ven los correos electrónicos visitando un
URL especial que los muestra. En el ejemplo anterior, la clase de vista previa para
UserMailer
debe llamarse UserMailerPreview
y estar ubicado en
test/mailers/previews/user_mailer_preview.rb
. Para ver la vista previa de
welcome_email
, implemente un método que tenga el mismo nombre y llame
UserMailer.welcome_email
:
class UserMailerPreview < ActionMailer::Preview
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
Entonces la vista previa estará disponible en http://localhost:3000/rails/mailers/user_mailer/welcome_email.
Si cambia algo en app/views/user_mailer/welcome_email.html.erb
o el propio mailer, se recargará y renderizará automáticamente para que puedas
vea visualmente el nuevo estilo al instante. También hay disponible una lista de vistas previas
en http://localhost:3000/rails/mailers.
De forma predeterminada, estas clases de vista previa se encuentran en test/mailers/previews
.
Esto se puede configurar usando la opción preview_path
. Por ejemplo, si tu
desea cambiarlo a lib/mailer_previews
, puede configurarlo en
config/application.rb
:
config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"
2.7 Generating URLs in Action Mailer Views
A diferencia de los controladores, la instancia de correo no tiene ningún contexto sobre
la solicitud entrante, por lo que deberá proporcionar el parámetro :host
usted mismo.
Como el :host
suele ser coherente en toda la aplicación, puede configurarlo
globalmente en config/application.rb
:
config.action_mailer.default_url_options = { host: 'example.com' }
Debido a este comportamiento, no puede utilizar ninguno de los ayudantes * _path
dentro de
un correo electrónico. En su lugar, necesitará usar el ayudante asociado * _url
. Por ejemplo
En lugar de usar
<%= link_to 'welcome', welcome_path %>
Necesitarás usar:
<%= link_to 'welcome', welcome_url %>
Al usar la URL completa, sus enlaces ahora funcionarán en sus correos electrónicos.
2.7.1 Generating URLs with url_for
url_for
genera una URL completa por defecto en las plantillas.
Si no configuró la opción :host
globalmente, asegúrese de pasarla a
url_for
.
<%= url_for(host: 'example.com',
controller: 'welcome',
action: 'greeting') %>
2.7.2 Generating URLs with Named Routes
Los clientes de correo electrónico no tienen contexto web, por lo que las rutas no tienen una base URL para completar la direcciones web. Por lo tanto, siempre debe usar la variante "_url" de la ruta nombrada ayudantes.
Si no configuró la opción :host
globalmente, asegúrese de pasarla al
asistente de URL.
<%= user_url(@user, host: 'example.com') %>
los enlaces que no sean GET
requieren rails-ujs o
jQuery UJS y no funcionará en plantillas de correo.
Ellas darán lugar a solicitudes normales GET
.
2.8 Adding images in Action Mailer Views
A diferencia de los controladores, la instancia de correo no tiene ningún contexto sobre el
solicitud entrante, por lo que deberá proporcionar el parámetro :asset_host
usted mismo.
Como el :asset_host
suele ser coherente en toda la aplicación, puede
configúrelo globalmente en config/application.rb
:
config.action_mailer.asset_host = 'http://example.com'
Ahora puede mostrar una imagen dentro de su correo electrónico.
<%= image_tag 'image.jpg' %>
2.9 Sending Multipart Emails
Action Mailer enviará automáticamente correos electrónicos de varias partes si tiene diferentes
plantillas para la misma acción. Entonces, para nuestro ejemplo de UserMailer, si tiene
welcome_email.text.erb
y welcome_email.html.erb
en
app/views/user_mailer
, Action Mailer enviará automáticamente un correo electrónico de varias partes
con las versiones HTML y de texto configuradas como partes diferentes.
El orden de las piezas que se insertan está determinado por el :parts_order
dentro del método ActionMailer::Base.default
.
2.10 Sending Emails with Dynamic Delivery Options
Si desea anular las opciones de entrega predeterminadas (por ejemplo, credenciales SMTP)
mientras envía correos electrónicos, puede hacerlo usando delivery_method_options
en el
acción de correo.
class UserMailer < ApplicationMailer
def welcome_email
@user = params[:user]
@url = user_url(@user)
delivery_options = { user_name: params[:company].smtp_user,
password: params[:company].smtp_password,
address: params[:company].smtp_host }
mail(to: @user.email,
subject: "Please see the Terms and Conditions attached",
delivery_method_options: delivery_options)
end
end
2.11 Sending Emails without Template Rendering
Si desea anular las opciones de entrega predeterminadas (por ejemplo, credenciales SMTP)
mientras envía correos electrónicos, puede hacerlo usando delivery_method_options
en la
acción de correo.
class UserMailer < ApplicationMailer
def welcome_email
@user = params[:user]
@url = user_url(@user)
delivery_options = { user_name: params[:company].smtp_user,
password: params[:company].smtp_password,
address: params[:company].smtp_host }
mail(to: @user.email,
subject: "Please see the Terms and Conditions attached",
delivery_method_options: delivery_options)
end
end
2.12 Sending Emails without Template Rendering
Puede haber casos en los que desee omitir el paso de representación de la plantilla y
proporcione el cuerpo del correo electrónico como una cadena. Puedes lograr esto usando el :body
opción. En tales casos, no olvide agregar la opción :content_type
. Rieles
de lo contrario, estará predeterminado en text/plain
.
class UserMailer < ApplicationMailer
def welcome_email
mail(to: params[:user].email,
body: params[:email_body],
content_type: "text/html",
subject: "Already rendered!")
end
end
3 Action Mailer Callbacks
Action Mailer le permite especificar un before_action
, after_action
y
around_action
.
Los filtros se pueden especificar con un bloque o un símbolo a un método en la clase del correo similar a los controladores.
Puede usar un
before_action
para completar el objeto de correo con valores predeterminados, delivery_method_options o inserte encabezados y adjuntos predeterminados.
class InvitationsMailer < ApplicationMailer
before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
before_action { @account = params[:inviter].account }
default to: -> { @invitee.email_address },
from: -> { common_address(@inviter) },
reply_to: -> { @inviter.email_address_with_name }
def account_invitation
mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
end
def project_invitation
@project = params[:project]
@summarizer = ProjectInvitationSummarizer.new(@project.bucket)
mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
end
end
- Podrías usar un
after_action
para hacer una configuración similar a unbefore_action
pero se usan variables de instancia establecidas en su acción de correo.
class UserMailer < ApplicationMailer
before_action { @business, @user = params[:business], params[:user] }
after_action :set_delivery_options,
:prevent_delivery_to_guests,
:set_business_headers
def feedback_message
end
def campaign_message
end
private
def set_delivery_options
# You have access to the mail instance,
# @business and @user instance variables here
if @business && @business.has_smtp_settings?
mail.delivery_method.settings.merge!(@business.smtp_settings)
end
end
def prevent_delivery_to_guests
if @user && @user.guest?
mail.perform_deliveries = false
end
end
def set_business_headers
if @business
headers["X-SMTPAPI-CATEGORY"] = @business.code
end
end
end
- Los filtros de correo anulan el procesamiento posterior si el cuerpo se establece en un valor distinto de nulo.
4 Using Action Mailer Helpers
Action Mailer hereda de AbstractController
, por lo que tiene acceso a la mayoría
de los mismos ayudantes que hay en Action Controller.
También hay algunos métodos de ayuda específicos de Action Mailer disponibles en
ActionMailer::MailHelper
. Por ejemplo, estos permiten acceder al correo
instancia desde su vista con mailer
, y accediendo al mensaje como message
:
<%= stylesheet_link_tag mailer.name.underscore %>
<h1><%= message.subject %></h1>
5 Action Mailer Configuration
Las siguientes opciones de configuración se realizan mejor en uno de los entornos archivos (environment.rb, production.rb, etc ...)
configuración | Descripción |
---|---|
logger |
Genera información sobre el envío de correos, si está disponible. Se puede establecer en nil para no registrar. Compatible con los registradores Logger y Log4r de Ruby. |
smtp_settings |
Permite una configuración detallada para método de entrega: :smtp :
|
sendmail_settings |
Le permite anular opciones para el método de entrega::sendmail .
|
raise_delivery_errors |
Si se deben generar errores o no si el correo electrónico no se entrega. Esto solo funciona si el servidor de correo electrónico externo está configurado para entrega inmediata. |
delivery_method |
Define un método de entrega. Los valores posibles son:
|
perform_deliveries |
Determina si las entregas se llevan a cabo realmente cuando se invoca el método deliver en el mensaje de correo. De forma predeterminada, lo son, pero esto se puede desactivar para ayudar a las pruebas funcionales. Si este valor es false , la matriz de deliveries no se completará incluso si delivery_method es :test . |
deliveries |
Mantiene una matriz de todos los correos electrónicos enviados a través de Action Mailer con delivery_method: test. Más útil para pruebas funcionales y unitarias. |
default_options |
Le permite establecer valores predeterminados para las opciones del método mail (:from , :reply_to , etc.). |
Para obtener una descripción completa de las posibles configuraciones, consulte el Configuring Action Mailer en nuestra guía Configuración de aplicaciones de rieles.
5.1 Example Action Mailer Configuration
Un ejemplo sería agregar lo siguiente a su expediente
config/environments/$RAILS_ENV.rb
:
config.action_mailer.delivery_method = :sendmail
# Defaults to:
# config.action_mailer.sendmail_settings = {
# location: '/usr/sbin/sendmail',
# arguments: '-i'
# }
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_options = {from: 'no-reply@example.com'}
5.2 Action Mailer Configuration for Gmail
Como Action Mailer ahora usa la Mail gem, esto
se vuelve tan simple como agregar a su archivo config/environment/$RAILS_ENV.rb
:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
port: 587,
domain: 'example.com',
user_name: '<username>',
password: '<password>',
authentication: 'plain',
enable_starttls_auto: true }
A partir del 15 de julio de 2014, Google aumentó its security measures y ahora bloquea los intentos de las aplicaciones que considera menos seguras. Puedes cambiar tu configuración de Gmail here para permitir los intentos. Si su cuenta de Gmail tiene habilitada la autenticación de 2 factores, entonces deberás establecer un app password y utilícelo en lugar de su contraseña habitual. Alternativamente, puede utilice otro ESP para enviar un correo electrónico reemplazando "smtp.gmail.com" arriba con la dirección de su proveedor.
6 Mailer Testing
Puede encontrar instrucciones detalladas sobre cómo probar sus anuncios en el testing guide.
7 Intercepting and Observing Emails
Action Mailer proporciona enlaces a los métodos de observador e interceptor de correo. Estos le permiten registrar clases que se llaman durante el ciclo de vida de la entrega de correo de cada correo electrónico enviado.
7.1 Intercepting Emails
Los interceptores le permiten realizar modificaciones en los correos electrónicos antes de que se entreguen a los agentes de entrega. Una clase de interceptor debe implementar el método :deliver_email(message)
que será llamado antes de que se envíe el correo electrónico.
class SandboxEmailInterceptor
def self.delivering_email(message)
message.to = ['sandbox@example.com']
end
end
Antes de que el interceptor pueda hacer su trabajo, debe registrarlo con Action
Marco de correo. Puede hacer esto en un archivo inicializador
config/initializers/sandbox_email_interceptor.rb
if Rails.env.staging?
ActionMailer::Base.register_interceptor(SandboxEmailInterceptor)
end
El ejemplo anterior utiliza un entorno personalizado llamado "ensayo" para un producción como servidor pero con fines de prueba. Puedes leer Creating Rails environments para obtener más información sobre los entornos personalizados de Rails.
7.2 Observing Emails
Los observadores le dan acceso al mensaje de correo electrónico después de que se haya enviado. Una clase de observador debe implementar el método :deliver_email(message)
, que se llamará después de que se envíe el correo electrónico.
class EmailDeliveryObserver
def self.delivered_email(message)
EmailDelivery.log(message)
end
end
Al igual que los interceptores, debe registrar observadores con el marco de Action Mailer. Puede hacer esto en un archivo inicializador
config/initializers/email_delivery_observer.rb
ActionMailer::Base.register_observer(EmailDeliveryObserver)
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.