En el post anterior escribí sobre cómo crear una landing page rápido con Symfony 4, y se me quedó pendiente el enviar por email los mensajes del formulario. Es decir, ya tenemos en un rato una rudimentaria ‘landing page’ donde un maquetador o el equipo de marketing disfrutará poniendo cualquier cosa. Será como maquetar con HTML, CSS y Javascript sin tener ningún engorroso CMS por debajo limitándonos lo que podemos hacer. Además tendremos la base de un buen Symfony para después añadir lo que queramos.
Ya tenemos la captación de contactos (o capture leads para los entendidos), que se guardan en una base de datos embebida en la propia web. Sin complicadas instalaciones ni configuraciones SQL, directamente con una base de datos SQLite embebida.
Sólo queda entonces hacer 3 cosas:
- Instalar el módulo de Swiftmailer.
- Configurarlo.
- Y poner la acción de enviar el email.
Vamos al grano..
1. Instalando Swiftmailer
Para esto basta con poner en el terminal lo siguiente:
composer require symfony/swiftmailer-bundle
..esperamos, y si todo ha ido bien tenemos que ver en el terminal algo como lo siguente:
Using version ^3.2 for symfony/swiftmailer-bundle ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Installing egulias/email-validator (2.1.4): Loading from cache - Installing swiftmailer/swiftmailer (v6.0.2): Loading from cache - Installing symfony/swiftmailer-bundle (v3.2.2): Loading from cache Writing lock file Generating autoload files ocramius/package-versions: Generating version class... ocramius/package-versions: ...done generating version class Symfony operations: 1 recipe (8c3c4103f30ebcc7579093a6f39dc028) - Configuring symfony/swiftmailer-bundle (>=2.5): From github.com/symfony/recipes:master Executing script cache:clear [OK] Executing script assets:install --symlink --relative public [OK] Some files may have been created or updated to configure your new packages. Please review, edit and commit them: these files are yours.
2. Configurar swiftmailer
Ahora las principales variables de configuración son variables de entorno. Esto es mucho más seguro ya que se pueden incluso no guardar en ningún fichero, pero la forma más sencilla es usar el fichero .env que debemos tener en el directorio raiz del proyecto. Si lo abrimos veremos que tenemos añadida la configuración de Swiftmailer:
###> symfony/swiftmailer-bundle ### # For Gmail as a transport, use: "gmail://username:password@localhost" # For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" # Delivery is disabled by default via "null://localhost" MAILER_URL=null://localhost ###< symfony/swiftmailer-bundle ###
Como bien explica en los comentarios, así hacemos. Pero para evitarte problemas te recomiendo usar siempre SMTP con un buen servidor de correo electrónico. Por Internet hay muchos ejemplos, uno puede ser este:
MAILER_URL=smtp://tudominio.com:587?encryption=tls&auth_mode=login&username=tuusuario&password=tucontraseña
Estas configuraciones usando SMTP son compatibles con la mayoría de los servidores de correo electrónico, sino todos. Tales como Mandrill, Amazon SES, Gmail, etcétera.. podrás configurarlos así, sólo tienes que encontrar las configuraciones que le pondrías a tu Outlook o Thunderbird y ponerlas en el proyecto de Symfony.
3. Enviar el email
Remitiéndome al post anterior, sólo nos queda en el controlador donde recibimos el contenido del formulario el enviarnos un email informándonos de que alguien nos ha dejado un mensaje. Para esto ponemos algo como esto en el controlador, marco en negrita lo nuevo:
<?php namespace App\Controller; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use App\Form\ContactType; use App\Entity\Contact; class MainController extends Controller { /** * @Route("/", name="main") */ public function index(Request $request, \Swift_Mailer $mailer) { $contact = new Contact(); $theForm = $this->createForm(ContactType::class, $contact); $theForm->handleRequest($request); if ($theForm->isSubmitted() && $theForm->isValid()) { // save in database $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($contact); $entityManager->flush(); // send email $message = (new \Swift_Message('JnjSite.com:: mensaje desde la web')) ->setFrom(['info@jnjsite.com' => 'Web JnjSite.com']) ->setTo([ 'info@jnjsite.com', ]) ->setBody( $this->renderView( 'main/email.html.twig', array('data' => $theForm->getData()) ), 'text/html' ); if ($mailer->send($message)) { // Email enviado correctamente, vamos a limpiar el formulario. $theForm = $this->createForm(ContactType::class); } else { // Aquí podemos hacer algo más porque no se han enviado bien el email. } } return $this->render('main/index.html.twig', [ 'theForm' => $theForm->createView(), ]); } }
Verás que no hay que complicarse mucho. Y por último necesitamos también la plantilla del correo electrónico, que la he puesto en templates/main/email.html.twig:
¡Hola!<br> Hemos recibido un mensaje en el formulario.<br> <br> Nombre: <strong>{{ data.name }}</strong><br> Email: <strong>{{ data.email }}</strong><br> Asunto: <strong>{{ data.subject }}</strong><br> Mensaje:<br> <strong>{{ data.message }}</strong><br>
Terminando
Si todo ha ido bien, ahora podemos probar el formulario arrancando el proyecto en local, si ponemos esto en el terminal:
php bin/console server:start
Y visitamos http://localhost:8000/ nos enviamos un formulario y debemos de ver algo como esto:
..sino me he explicado bien, o quieres decir algo, no dudes en dejar un comentario aquí abajo 😉