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”:http://swiftmailer.org . Atualmente esse processo funciona comigo para uma listagem de aprox. 10.000 emails.

Primeiramente, é preciso ter o Swift instalado. Eu utilizei o plugin “sfSwiftPlugin”:http://trac.symfony-project.com/wiki/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”:http://www.oreillynet.com/linux/cmd/cmd.csp?path=b/batch ou “at”:http://www.oreillynet.com/linux/cmd/cmd.csp?path=a/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*.