This course is still being released! Check back later for more chapters.
Un correo electrónico mejor
Creo que tú, yo, cualquiera que haya recibido alguna vez un correo electrónico, podemos estar de acuerdo en que nuestro primer correo electrónico apesta. No aporta ningún valor. ¡Mejorémoslo!
En primer lugar, podemos añadir un nombre al correo electrónico. Esto aparecerá en la mayoría de los clientes de correo electrónico en lugar de sólo la dirección de correo electrónico: tiene un aspecto más fluido. Envuelve el from
connew Address()
, el de Symfony\Component\Mime
. El primer argumento es el correo electrónico, y el segundo es el nombre: ¿qué tal Universal Travel
:
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new Email()) | |
->from(new Address('info@universal-travel.com', 'Universal Travel')) | |
// ... lines 52 - 54 | |
; | |
// ... lines 56 - 59 | |
} | |
// ... lines 61 - 65 | |
} | |
} |
También podemos envolver el to
con new Address()
. y pasar $customer->getName()
para el nombre:
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new Email()) | |
// ... line 51 | |
->to(new Address($customer->getEmail())) | |
// ... lines 53 - 54 | |
; | |
// ... lines 56 - 59 | |
} | |
// ... lines 61 - 65 | |
} | |
} |
Para el subject
, añade el nombre del viaje: 'Booking Confirmation for ' . $trip->getName()
:
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new Email()) | |
// ... lines 51 - 52 | |
->subject('Booking Confirmation for '.$trip->getName()) | |
// ... line 54 | |
; | |
// ... lines 56 - 59 | |
} | |
// ... lines 61 - 65 | |
} | |
} |
Para el cuerpo text
. Podríamos alinear todo el texto aquí. Eso se pondría feo, así que ¡utilicemos Twig! Necesitamos una plantilla.
En templates/
, añade un nuevo directorio email/
y, dentro, crea un nuevo archivo:booking_confirmation.txt.twig
. Twig puede utilizarse para cualquier formato de texto, no sólo para html
. Una buena práctica es incluir el formato - .html
o .txt
- en el nombre del archivo. Pero a Twig no le importa eso: es sólo para satisfacer nuestro cerebro humano. Volveremos a este archivo en un segundo.
De vuelta en TripController::show()
, en lugar de new Email()
, utiliza new TemplatedEmail()
(el de Symfony\Bridge\Twig
):
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new TemplatedEmail()) | |
// ... lines 51 - 64 | |
} | |
// ... lines 66 - 70 | |
} | |
} |
Sustituye ->text()
por ->textTemplate('email/booking_confirmation.txt.twig')
:
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new TemplatedEmail()) | |
// ... lines 51 - 53 | |
->textTemplate('email/booking_confirmation.txt.twig') | |
// ... lines 55 - 59 | |
; | |
// ... lines 61 - 64 | |
} | |
// ... lines 66 - 70 | |
} | |
} |
Para pasar variables a la plantilla, utiliza ->context()
con'customer' => $customer, 'trip' => $trip, 'booking' => $booking
:
// ... lines 1 - 19 | |
final class TripController extends AbstractController | |
{ | |
// ... lines 22 - 30 | |
public function show( | |
// ... lines 32 - 36 | |
): Response { | |
// ... lines 38 - 39 | |
if ($form->isSubmitted() && $form->isValid()) { | |
// ... lines 41 - 49 | |
$email = (new TemplatedEmail()) | |
// ... lines 51 - 54 | |
->context([ | |
'customer' => $customer, | |
'trip' => $trip, | |
'booking' => $booking, | |
]) | |
; | |
// ... lines 61 - 64 | |
} | |
// ... lines 66 - 70 | |
} | |
} |
Ten en cuenta que aquí técnicamente no estamos renderizando la plantilla Twig: Mailer lo hará por nosotros antes de enviar el correo electrónico.
Esto es código Twig normal y aburrido. Vamos a mostrar el nombre del usuario utilizando un truco barato, el nombre del viaje, la fecha de salida y un enlace para gestionar la reserva. Necesitamos utilizar URLs absolutas en los correos electrónicos -como https://univeral-travel.com/booking-, así que aprovecharemos la función Twig url()
en lugar de path()
: {{ url('booking_show', {'uid': booking.uid}) }}
. Terminaremos educadamente con, Regards, the Universal Travel team
:
Hey {{ customer.name|split(' ')|first }}, | |
Get ready for your trip to {{ trip.name }}! | |
Departure: {{ booking.date|date('Y-m-d') }} | |
Manage your booking: {{ url('booking_show', {uid: booking.uid}) }} | |
Regards, | |
The Universal Travel Team |
¡Cuerpo del correo electrónico listo! Pruébalo. De vuelta en tu navegador, elige un viaje, nombre: Steve
, correo electrónico:steve@minecraft.com
, cualquier fecha en el futuro, y reserva el viaje. Abre el perfil de la última petición y haz clic en la pestaña Emails
para ver el correo electrónico.
¡Mucho mejor! Observa que las direcciones From
y To
ahora tienen nombre. ¡Y nuestro contenido de texto es definitivamente más valioso! Copia la URL de la reserva y pégala en tu navegador para asegurarte de que va al lugar correcto. Parece que sí, ¡bien!
A continuación, utilizaremos la herramienta de pruebas de Mailtrap para obtener una vista previa más robusta del correo electrónico.