Ya estoy por aquí de nuevo, escribiendo otro tutorial, code-kata o howto.. mientras que nos ponemos al día repasando sobre Symfony, y revisando hoy cómo se envían los correos electrónicos. Symfony nos recomienda que usemos el popular componente SwiftMailer, que podemos incoporar a nuestros proyectos con un simple comando de Composer. Desde una web tenemos varias formas de enviar correos, pero pienso que la forma más profesional es con el protocolo SMTP, así te independizas del servidor donde corre tu web, desacoplas aplicación web del servidor de correo.. pudiendo enviar el correo electrónico mediante casi cualquier servidor estándar de correo electrónico.
Recapitulando, de nuevo en Symfony tenemos otro componente para PHP con el que se convierte en algo trivial el envío de correos electrónicos. No tanto el envío de muchos emails. Pero si combinamos este post, con otros anteriores sobre Doctrine, no debería de serte muy complicado el implementar una cola de emails. Así puedes ir enviando los emails poco a poco si es que estás trabajando en una aplicación web que tiene que enviar muuuuuuuuchos emails. Ahí lo dejo para otro post 😉 vamos con el tutorial para comenzar con los emails..
Vamos al grano, creando el proyecto de pruebas
Voy a la línea de comando, y ejecuto lo siguiente:
symfony new symfony-tutorial-12 cd symfony-tutorial-12 composer require --dev maker composer require symfony/swiftmailer-bundle annotations twig
A continuación arranco el servidor de pruebas:
symfony server:start
Lo siguiente va a ser crear un controlador para ver los resultados en el navegador:
php bin/console make:controller
..y le llamamos DefaultController, con lo que me creará el fichero templates/default/index.html.twig y src/Controller/DefaultController.php con una función que podremos ejecutar desde el navegador en la URL: http://localhost:8000/default
Código de envío de un email
Lo siguiente es ya formatear un email y enviarlo. Para esto, necesitamos primero poner la configuración en el fichero de configuración: .env
Tendremos que poner algo como lo siguiente:
MAILER_URL=smtp://tuservidor.com:587?encryption=tls&auth_mode=login&username=usuario@tuservidor.com&password=tucontraseña
Una configuración importante para probar mientras que desarrollas, es el ponerte a ti mismo como receptor de todos los emails. Para esto no tienes más que abrir el fichero config/packages/dev/swiftmailer.yaml y activar la configuración delivery_addresses. Con esto harás que todos los emails te lleguen a ti mismo. Fíjate que a veces hay buzones de correo que no permiten enviarte a ti mismo correos electrónicos desde la mismo dirección.
#See https://symfony.com/doc/current/email/dev_environment.html
swiftmailer:
# send all emails to a specific address
delivery_addresses: ['tumismo@tuservidor.com']
Esta configuración es trabajo de sistemas, no debes de tener muchos problemas para crearte un buzón de correo. Cualquier correo que se puede consultar en Outlook, Thunderbird, Gmail o similar te sirve, ya que SwiftMailer usa protocolos totalmente estándares.
El siguiente paso es editar el controlador que está en el fichero src/Controller/DefaultController.php para enviar un email cada vez que se visite la URL http://localhost:8000/default Esto lo hacemos con el código siguiente:
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class DefaultController extends AbstractController { /** * @Route("/default", name="default") */ public function index(\Swift_Mailer $mailer) { $message = (new \Swift_Message()) ->setSubject('Asunto') ->setFrom(['tu.usuario@tudominio.com' => 'Tu Usuario']) ->setTo(['info@jnjsite.com' => 'Jaime Niñoles']) ->setBody( 'Esto es texto en HTML.', 'text/html' ) ->addPart( 'Esto es texto pelado.', 'text/plain' ); $mailer->send($message); return $this->render('default/index.html.twig', [ 'controller_name' => 'DefaultController', ]); } }
SPAM y esas cosas que no hay que hacer
Para terminar con el tutorial, sólo me queda remitirme a la documentación oficial, y mencionar el tema del SPAM. Es muy importante que no te dediques a enviar SPAM, o serás bloqueado, marcarán tu servidor en lista negra y tus correos electrónicos no llegarán a la bandeja de entrada de los destinatarios.
Para hacer las cosas bien, si tienes que enviar muchos emails, te recomiendo que uses un servidor de alta disponibilidad como AWS SES, MailChimp, o similar. Con estos servidores tendrás una interfaz en donde verás reporte de si llegan a destino, los abren, o dan error en el buzón de destino. Lo peor que puede pasar es que los destinos te den un error marcando tu IP como SPAMMER. Si te interesa el tema puedes investigar más sobre configuración de servidores de correo, DKIM, SPF.. bounces y complaints de los emails, POP3, IMAP, etc.. Más te vale hacer las cosas bien, y controlar las respuestas de los destinatarios, o te tocará andar cambiando de IP del servidor si metes la pata 😉
Documentación oficial:
https://symfony.com/doc/current/mailer.html
..siguiente tutorial sobre cómo engancharnos a los eventos Symfony para personalizar su comportamiento:
https://jnjsite.com/symfony-tutorial-13-enganchandonos-a-los-eventos/
..y enlace a los códigos fuentes subidos a GitHub:
https://github.com/jaimenj/symfony-starter-tutorials