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.