[Resolvido] Envio de Email Marketing com PHP
Postei no iMasters Code e agora estou postando aqui.
Bem pessoal estou postando o código e colocando em anexo o projeto para quem quiser melhorar, existem algumas coisinhas que ja imaginei que podem ser melhoradas mas para o que utilizo funciona corretamente.
no arquivo em anexo temos:
email.php - utiliza a função mail que necessita que esteja instalado no servidor o sendmail ou postfix, atualmente estou utilizando com postfix.
emailSMTP.php - utiliza conexão com smtp para envio dos emails, utiliza a função phpmailer a qual ja esta incluida no anexo na pasta inc.
template.html - arquivo html a ser enviado por email, pode ser feito por um designer diretamente no dreamweaver ou Photoshop, no anexo trago um exemplo.
sit.txt - um arquivo que guarda uma "tag" enable ou disable, informando para o email.php se é para ser executado ou não.
cont.txt - um arquivo de contadores que armazena o contador inicial, final e de quantos em quantos é para incrementar o contador final após a execução, a idéia é a seguinte: quero enviar no primeiro envio do 0 ao 700 e depois de 500 em 500, sendo 0 o inicial, 700 o final do primeiro envio e depois na proxima execução ele enviara do 701 ao 1200, depois do 1201 ao 1701 até que envie todos os emails, isso é claro se você agendar na crontab a qual falo mais abaixo.
crontab - para quem envia varios emails como eu e, deseja enviar em vários horarios automaticamente sem precisar ficar abrindo no browser e executando, segue um exemplo de configuração da execução, porém para tanto é necessário utilizar um servidor linux com o curl que pode ser instalado via apt-get ele serve para executarmos arquivos .php no linux via linha de comando, verifique tambem na linha da cron o caminho para o mesmo e caminho para o arquivo email.php para visualizar a sua cron execute o comando crontable -e e acrescente/edite o conteudo do arquivo crontab.txt.
pasta log - pasta que armazena um log com a situação do envio, caso de erro armazenara o erro.
Bem segue abaixo o codigo do email.php para darem uma lida antes de baixar:
<?php
/*
* Autor Eduardo de Souza - Edultra
* Código para envio de emails.
*/
$fs = fopen("sit.txt", "r");
$c = 0;
while (!feof($fs)) {
$buffer = fgets($fs, 4096);
if ($c == 0) {
$situacao = explode("$", $buffer);
$situacao = $situacao[1];
}
$c++;
}
fclose($fs);
if ($situacao == 'enable') {
//abre o arquivo de contador
$fp = fopen("cont.txt", "r");
$i = 0;
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
if ($i == 0) {
$ini = explode("$", $buffer);
$ini = $ini[1];
} else if ($i == 1) {
$fin = explode("$", $buffer);
$fin = $fin[1];
} else if ($i == 2) {
$cont = explode("$", $buffer);
$cont = $cont[1];
}
$i++;
}
fclose($fp);
//pegando e armazenando a template a ser enviada por email:
$ft = fopen("template.html", "r");
$assunto = 'Titulo da mensagem';// titulo da mensagem
$remetente = 'Nome do remetente';// nome do remetente como: Nome da empresa ou setor
$emailremet = 'meu@email.com.br';// email do remetente como email da minha empresa.
$emailStatus = 'emailstatus@email.com.br';// email que receberá uma mensagem de status de envio
$template = "";//inicializa a template vazia.
//efetuara a leitura da template e armazenamento da mesma para ser enviada.
while (!feof($ft)) {
$template .=fgets($ft, 4096);
}
fclose($ft);
// Fazendo a conexão com o servidor MySQL onde estão os emails
$conexao = mysql_pconnect("servidor", "usuario", "senha") or die($msg[0]);
mysql_select_db("nomebanco", $conexao) or die($msg[1]);//selecionando o banco de dados
//Efetuando o select dos emails cadastrados:
$sql = "SELECT id, email, nome FROM tabelaemail where id>=$ini and id<=$fin order by id asc";
$resultado = mysql_query($sql, $conexao);
while ($linha = mysql_fetch_array($resultado)) {
$destinatario = $linha['email'];
$corpo = $template;
echo $destinatario . '<br />';
//para o envio em formato HTML
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
$headers .= "X-Priority: 1\n";
//endereço do remetente
$headers .= "From: $remetente <$emailremet>";
//endereço de resposta, se queremos que seja diferente a do remitente
//$headers .= "Reply-To: meu@email.com.br";
//endereços que receberão uma copia
//$headers .= "Cc: emailcopia@email.com.br";
//endereços que receberão uma copia oculta
//$headers .= "Bcc: emailcopiaoculta@email.com,email2copiaoculta@email.com.br";
try {
mail($destinatario, $assunto, $corpo, $headers);//envia o email utilizando a função sendmail
$emails[] = $destinatario;//guarda em um array o email que foi enviado
} catch (Exception $e) {
$emails[] = $destinatario . $e->getMessage();//garda em um array o email + erro
}
}
$data = date(dmY);//ve a data de envio.
//Acrescentando ao arquivo de log
$flog = fopen("logs/log-$assunto-$data.txt", "a");//cria um arquivo de log se ja existir acrescenta ao final
$tam = count($emails);// ve o tamanho do array (qtd de emails)
for ($i = 0; $i < $tam; $i++) {
fwrite($flog, $emails[$i] . "\n");//grava linha por linha os emails que foram enviados
}
fclose($flog);//fecha o arquivo de log.
//vê a quantidade total de emails existentes no bd.
$sqlTotal = 'SELECT count(id) as total FROM tabelaemail';
$rstTotal = mysql_query($sqlTotal, $conexao);//executa a consulta
while ($linha = mysql_fetch_array($rstTotal)) {
$total = $linha['total'];//guarda o total (isso aqui tem que ser melhorado! hauhauauahau
}
mail($emailStatus, "Status de Envio de $assunto", "foram enviados emails do id $ini ao $fin do total de $total emails");
/* encrementando contadores */
$ini = $fin + 1; //o inicio recebe o valor do final +1
$fin = $fin + $cont; // o fim recebe o valor a ser incrementado.
$fp = fopen("cont.txt", "w"); //substitui o arquivo por um atualizado.
//grava as linhas no arquivo cont.txt
fwrite($fp, "$" . $ini . "\n");
fwrite($fp, "$" . $fin . "\n");
fwrite($fp, "$" . $cont . "\n");
fclose($fp);// fecha o arquivo cont.txt
//se chegar no final da quantidade de emails muda para disable o arquivo sit encerrando
// o envio de emails
if ($ini >= $total) {
$fs = fopen("sit.txt", "w");
fwrite($fs, '$disable');
fclose($fs);
//envia um email para o email de status informando o fim de envio.
mail($emailStatus, "Status de Envio de $assunto", "fim de envio de emails");
}
} else {
echo "disable";//se o arquivo sit for disable ele mostra disable na tela.
}
?>
Vejam que o código esta todo comentado, lembre-se que a maquina deve ter acesso a web e utilizar um dominio válido se não os provedores retornarão mensagens de falha de entrega.
Caso não saiba como configurar corretamente o send mail ou postfix, utilize o emailSMTP.php porém ele não tem as mesmas implementações do email.php como arquivo de log, mas deixo com vcs a implementação disso, basta copiar do email.php o código.
Atualmente com o uso deste código envio 10 mil emails por dia +- sendo que envio de 700 em 700 a cada 30 minutos, evitando assim o bloqueio do servidor por spammer pelos servidores de ranking de spam.
obs.: o unico trabalho ao iniciar o envio dos emails será mudar o conteudo arquivo sit.txt de $disable para $enable, mudar o conteúdo de cont.txt colocando os valores inicial e final do primeiro envio e o contador para os proximos envios (isso pode ser melhorado).
o codigo zipado pode ser baixado no seguinte link:
Duvidas/Revisões iMasters Code:
http://code.imasters.com.br/index.php?/topic/186-envio-de-email-marketing-com-php/#entry334
Discussão (3)
Carregando comentários...