Silex, el manual oficial

A.11. SwiftmailerServiceProvider

El proveedor SwiftmailerServiceProvider permite enviar emails utilizando la librería Swift Mailer.

Los emails se pueden enviar fácilmente mediante el servicio mailer, que a su vez utiliza el protocolo SMTP para enviar los correos electrónicos.

A.11.1. Parámetros de configuración

El proveedor define los siguientes parámetros configurables:

  • swiftmailer.use_spool: opción booleana que indica si se usa un spool para los mensajes utilizando la memoria del servidor (por defecto es true).
  • swiftmailer.options: array con las opciones que se utilizan para conectar al servidor SMTP a través del cual se envían los emails. Este array contiene las siguientes opciones:
    • host: el hostname del servidor SMTP. Por defecto: localhost.
    • port: el puerto SMTP. Por defecto se utiliza 25.
    • username: el nombre de usuario para conectar al servidor. Por defecto su valor es una cadena de texto vacía, por lo que no se utiliza ningún nombre.
    • password: la contraseña para conectar al servidor. Por defecto su valor es una cadena de texto vacía, por lo que no se utiliza ninguna contraseña.
    • encryption: el tipo de encriptación utilizada en la conexión. Por defecto su valor es null.
    • auth_mode: el tipo de autenticación realizada durante la conexión. Por defecto vale null.

El siguiente código muestra un ejemplo de cómo establecer el valor de todas estas opciones de configuración:

$app['swiftmailer.options'] = array(
    'host' => 'host',
    'port' => '25',
    'username' => 'username',
    'password' => 'password',
    'encryption' => null,
    'auth_mode' => null
);

A.11.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • mailer: la instancia de la clase utilizada para enviar los emails. Ejemplo de uso:
$message = \Swift_Message::newInstance();

// ...

$app['mailer']->send($message);
  • swiftmailer.transport: el tipo de envío utilizado para los emails. Por defecto se emplea Swift_Transport_EsmtpTransport.
  • swiftmailer.transport.buffer: la clase que se encarga del buffering durante el envío de los mensajes.
  • swiftmailer.transport.authhandler: tipo de autenticación utilizada por el servicio de envío de emails. Los tipos soportados son CRAM-MD5, login y plaintext.
  • swiftmailer.transport.eventdispatcher: es el event dispatcher que utiliza internamente la librería Swiftmailer.

A.11.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\SwiftmailerServiceProvider());

Nota La librería SwiftMailer que utiliza este proveedor se incluye cuando descargas Silex en forma de archivo comprimido. Si instalas Silex mediante Composer, debes añadir esta dependencia ejecutando el siguiente comando:

$ composer require swiftmailer/swiftmailer

A.11.4. Ejemplos de uso

El servicio más utilizado de este proveedor es mailer, a través del que se pueden enviar emails utilizando el siguiente código:

$app->post('/feedback', function () use ($app) {
    $request = $app['request'];

    $message = \Swift_Message::newInstance()
        ->setSubject('[YourSite] Feedback')
        ->setFrom(array('[email protected]'))
        ->setTo(array('[email protected]'))
        ->setBody($request->get('message'));

    $app['mailer']->send($message);

    return new Response('Thank you for your feedback!', 201);
});

A.11.5. Uso en comandos de consola

Por defecto el proveedor de Swiftmailer envía los emails utilizando el evento KernelEvents::TERMINATE, que se lanza después de enviar la respuesta al usuario. Sin embargo, este evento no se lanza en los comandos de consola, por lo que los emails no se envían.

Por tanto, si envías emails en un comando de consola, es aconsejable que desactives el spool de mensajes antes de acceder al servicio $app['mailer']:

$app['swiftmailer.use_spool'] = false;

Otra forma de solucionar este problema es vaciar el spool de mensajes a mano antes de finalizar la ejecución del comando. Para ello, utiliza el siguiente código:

$app['swiftmailer.spooltransport']
    ->getSpool()
    ->flushQueue($app['swiftmailer.transport'])
;

A.11.6. Traits

El trait Silex\Application\SwiftmailerTrait definido por este proveedor añade los siguientes atajos:

  • mail: envía un email y se utiliza de la siguiente manera:
$app->mail(\Swift_Message::newInstance()
    ->setSubject('[YourSite] Feedback')
    ->setFrom(array('[email protected]'))
    ->setTo(array('[email protected]'))
    ->setBody($request->get('message')));