Cómo enviar correo electrónico

El envío de correo electrónico es una tarea clásica para cualquier aplicación web, y la cual tiene complicaciones especiales y peligros potenciales. En lugar de reinventar la rueda, una solución para enviar mensajes de correo electrónico es usando el SwiftmailerBundle, el cual aprovecha el poder de la biblioteca SwiftMailer.

Nota

No olvides activar el paquete en tu núcleo antes de usarlo:

public function registerBundles()
{
    $bundles = array(
        // ...

        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
    );

    // ...
}

Configurando

Antes de usar SwiftMailer, asegúrate de incluir su configuración. El único parámetro de configuración obligatorio es transport:

  • YAML
    # app/config/config.yml
    swiftmailer:
        transport:  smtp
        encryption: ssl
        auth_mode:  login
        host:       smtp.gmail.com
        username:   your_username
        password:   your_password
    
  • XML
    <!-- app/config/config.xml -->
    
    <!--
        xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
        http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd
    -->
    
    <swiftmailer:config
        transport="smtp"
        encryption="ssl"
        auth-mode="login"
        host="smtp.gmail.com"
        username="your_username"
        password="your_password" />
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('swiftmailer', array(
        'transport'  => "smtp",
        'encryption' => "ssl",
        'auth_mode'  => "login",
        'host'       => "smtp.gmail.com",
        'username'   => "your_username",
        'password'   => "your_password",
    ));
    

La mayoría de los atributos de configuración de SwiftMailer tratan con la forma en que se deben entregar los mensajes.

Los atributos de configuración disponibles son los siguientes:

  • transport (smtp, mail, sendmail o gmail)
  • username
  • password
  • host
  • port
  • encryption (tls, o ssl)
  • auth_mode (plain, login o cram-md5)
  • spool
  • delivery_address (una dirección de correo electrónico de donde enviar todo el correo electrónico)
  • disable_delivery (true para desactivar la entrega por completo)

Enviando correo electrónico

La biblioteca SwiftMailer trabaja creando, configurando y luego enviando objetos Swift_Message. El «mailer» es responsable de la entrega real del mensaje y es accesible a través del servicio mailer. En general, el envío de un correo electrónico es bastante sencillo:

public function indexAction($name)
{
    $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('send@example.com')
        ->setTo('recipient@example.com')
        ->setBody(
            $this->renderView(
                'HelloBundle:Hello:email.txt.twig',
                array('name' => $name)
            )
        )
    ;
    $this->get('mailer')->send($message);

    return $this->render(...);
}

Para mantener las cosas disociadas, el cuerpo del correo electrónico se ha almacenado en una plantilla y reproducido con el método RenderView().

El objeto $message admite muchas más opciones, como incluir archivos adjuntos, agregar contenido HTML, y mucho más. Afortunadamente, SwiftMailer cubre el tema con gran detalle en Creando mensajes de su documentación.

Truco

Hay disponibles varios artículos en el recetario relacionados con el envío de mensajes de correo electrónico en Symfony2:

Bifúrcame en GitHub