Enviando uma newsletter com Swift e Symfony

Olá! Nesse post vou mostrar uma maneira que utilizei para disparar uma newsletter com o Symfony utilizando o Swift . Atualmente esse processo funciona comigo para uma listagem de aprox. 10.000 emails.

Primeiramente, é preciso ter o Swift instalado. Eu utilizei o plugin sfSwiftPlugin

symfony plugin-install http://plugins.symfony-project.com/sfSwiftPlugin

Acesse a página do plugin para fazer os ajustes necessários

Com base num schema.yml:


propel:
  newsletter:
    _attributes:  { phpName: Newsletter }
    id:
    nome:         varchar(200)
    email:        varchar(200)
    ativo:        boolean
    created_at:
 

Geramos os modelos:

$ symfony propel-build-all

Vamos criar um batch que irá enviar nossa newsletter. Esse comando gera o arquivo `batch/newsletter.php`

$ symfony init-batch default newsletter frontend

Vamos editar o `batch/newsletter.php`


<?php

define(‘SF_ROOT_DIR’,    realpath(dirname(file).‘/..’));
define(‘SF_APP’,         ‘frontend’);
define(‘SF_ENVIRONMENT’, ‘prod’); // eu uso em prod.. por default vem dev
define(‘SF_DEBUG’,       1);

require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.‘apps’.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.‘config’.DIRECTORY_SEPARATOR.‘config.php’);

// initialize database manager
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();

// batch process here

$body = "Conteúdo do email…";

$smtp = new Swift_Connection_SMTP("mail.servidor.com", 25);
$smtp->setUsername("email@servidor.com");
$smtp->setpassword("senha");
$smtp->setTimeout(60);
$swift = new Swift($smtp);

$message = new Swift_Message("Título da Newsletter", $body , "text/html" , "utf-8");        
$message->setReturnPath("bounces@servidor.com"); // o return-path é bom para pegar os bounces

// criamos a lista de emails que receberão a newsletter
$recipients = new Swift_RecipientList();

// selecionando todos os assinantes ativos
$c = new Criteria();
$c->add(NewsletterPeer::ATIVO , true);
$assinantes = NewsletterPeer::doSelect($c);

// preenchendo a lista de recipientes
foreach($assinantes as $assinante) {
    $recipients->addTo($assinante->getEmail());
}

// esse plugin do Swift é muito util
$swift->attachPlugin(new Swift_Plugin_AntiFlood(200), "anti-flood");

$batch = new Swift_BatchMailer($swift);
$batch->setMaxTries(2); // nmro max de tentativas
$batch->setMaxSuccessiveFailures(2); // nmro max de falhas

$batch->send($message, $recipients, new Swift_Address("email_from@servidor.com" , "Título Newsletter"));  

$swift->disconnect();

Para fazer o envio execute o arquivo dentro da pasta `batch/`

$ php newsletter.php

Se você for fazer um disparo que leve muito tempo, é aconselhável colocar o script para ser executado em background com batch ou at

$ at -f php newsletter.php now

Em um post futuro eu mostro como fazer tudo isso sem utilizar linha de comando, ou seja executar uma action via web para executar o script e/ou colocar em background at.