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
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:
Vamos criar um batch que irá enviar nossa newsletter. Esse comando gera o arquivo `batch/newsletter.php`
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/`
Se você for fazer um disparo que leve muito tempo, é aconselhável colocar o script para ser executado em background com batch ou at
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.

Post a Comment