Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github

Como fazer Spool de E-mail

Quando você estiver usando o SwiftmailerBundle para enviar um email de uma aplicação Symfony2, ele irá, por padrão, enviar o e-mail imediatamente. Você pode, entretanto, desejar evitar um impacto no desempenho da comunicação entre o Swiftmailer e o transporte do e-mail, o que poderia fazer com que o usuário tenha que aguardar a próxima página carregar, enquanto está enviando o e-mail. Isto pode ser evitado escolhendo pelo “spool” dos e-mails em vez de enviá-los diretamente. Isto significa que o Swiftmailer não tentará enviar o email, mas, ao invés, salvará a mensagem em algum lugar, como um arquivo. Outro processo poderá então ler a partir do spool e cuidar de enviar os e-mails no spool. Atualmente, apenas o spool para arquivo ou memória são suportados pelo Swiftmailer.

Spool usando memória

Quando você usa o spool para armazenar os e-mails em memória, eles são enviados mesmo antes do kernel terminar. Isto significa que o e-mail só é enviado se o pedido foi todo executado sem qualquer exceção não tratada ou quaisquer erros. Para configurar o SwiftMailer com a opção de memória, utilize a seguinte configuração:

  • YAML
    # app/config/config.yml
    swiftmailer:
        # ...
        spool: { type: memory }
    
  • 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>
         <swiftmailer:spool type="memory" />
    </swiftmailer:config>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('swiftmailer', array(
         ...,
        'spool' => array('type' => 'memory')
    ));
    

Spool usando um arquivo

Para utilizar o spool com um arquivo, use a seguinte configuração:

  • YAML
    # app/config/config.yml
    swiftmailer:
        # ...
        spool:
            type: file
            path: /path/to/spool
    
  • 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>
         <swiftmailer:spool
             type="file"
             path="/path/to/spool" />
    </swiftmailer:config>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('swiftmailer', array(
         // ...
        'spool' => array(
            'type' => 'file',
            'path' => '/path/to/spool',
        )
    ));
    

Tip

Se você deseja armazenar o spool em algum lugar no diretório do seu projeto, lembre-se que você pode usar o parâmetro %kernel.root_dir% para referenciar o raiz do seu projeto:

path: %kernel.root_dir%/spool

Agora, quando a sua aplicação enviar um e-mail, ele não será realmente enviado, ao invés, será adicionado ao spool. O envio de mensagens do spool é feito separadamente. Existe um comando do console para enviar as mensagens que encontram-se no spool:

php app/console swiftmailer:spool:send

Ele tem uma opção para limitar o número de mensagens a serem enviadas:

php app/console swiftmailer:spool:send --message-limit=10

Você também pode definir o limite de tempo em segundos:

php app/console swiftmailer:spool:send --time-limit=10

Claro que, na realidade, você não vai querer executar ele manualmente. Em vez disso, o comando do console deve ser disparado por um cron job ou tarefa agendada e executar em um intervalo regular.