Envío de Correos en Symfony con Mailer y Transport
Clase 14 de 17 • Curso de Symfony Framework
Los emails del sistema
Algo muy común en las aplicaciones web es el envío de alertas a través de correo electrónico, a veces para notificar sobre algo que pasó mientras el usuario no estaba conectado, otras para solicitarle que realice alguna acción.
En nuestro caso, en la clase 1 habíamos visto que nuestro sistema deberá enviar correos cuando:
- Un candidato se postula a una oferta.
- Una empresa da de baja una oferta.
El componente mailer
PHP dispone de un mecanismo propio para realizar estos envíos: la función mail, sin embargo, se trata de una funcionalidad bastante tosca, por lo cual, no es raro que los frameworks hayan creado métodos más potentes.
En el caso de Symfony, disponemos de un componente llamado Mailer.
El Mailer está disponible para nosotros como un servicio más, sólo que para poder utilizarlo, debemos realizar algunos pasos de configuración previa.
El más importante es definir cómo se realizará el envío de esos correos.
Esto se consigue utilizando un componente llamado Transport.
El Mailer se encarga de la confección del correo, el Transport de su envío. De modo que un mismo Mailer puede utilizar diferentes tipos de Transport.
El más común (y el más fácil de configurar) es el SMTP.
Si dispones de una cuenta en algún servidor SMTP puedes agregar esto a tu archivo .env:
MAILER_DSN=smtp://user:pass@smtp.example.com
Reemplazando por los datos reales por supuesto.
Una vez completa la configuración puedes empezar a enviar correos.
El correo a la empresa
Comencemos por el aviso a la empresa de que se ha registrado un nuevo postulante.
Este evento sucede cuando un candidato se postula, es decir, se dispara en el método OfferController::apply.
Como siempre, para utilizar el servicio Mailer necesitamos inyectarlo, es decir, cambiar la firma del método por:
public function apply(Offer $offer, EntityManagerInterface $entityManager, MailerInterface $mailer)
Luego podremos utilizarlo de este modo:
$email = (new Email())
->from('jobboard@platzi.com') ->to($offer->getOwner()->getEmail()) ->subject('Se recibió un nuevo postulante para '.$offer->getTitle().'!') ->html('<p>'.$applicant->getName().' está interesado/a. Su correo es '.$applicant->getEmail().'</p>') ; $mailer->send($email);
Con eso alcanzará para que el responsable de la empresa reciba un correo con la alerta correspondiente.
El correo al postulante
Pues… no hay mucho misterio aquí… quedan algunas tareas por completar, es tu momento de brillar ;)
Si el correo debe salir en el momento en que una empresa elimine una oferta… ¡la empresa debe poder eliminar ofertas!
Para ello deberás:
- Generar un método en
CompanyControllerllamadodeleteOffer. - Proveer a la empresa con un link para ejecutar dicho método.
- Antes de eliminar la oferta deberás recorrer el conjunto de todos los postulantes y a cada uno enviarle un aviso de que dicha oferta ya no está disponible.
Diversión asegurada, ¿cierto? :)
Tómate un tiempito para completarlo y regresa para la próxima clase: el despliegue de tu aplicación (¿O acaso te creías que todo iba a terminar en tu computadora para siempre?)