Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Edultra

[Resolvido] Envio de Email Marketing com PHP

Recommended Posts

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:

 

email.zip

 

Duvidas/Revisões iMasters Code:

http://code.imasters.com.br/index.php?/topic/186-envio-de-email-marketing-com-php/#entry334

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tópico é de 2010. Provavelmente o arquivo não existe mais. Porém, aí está o código e explicação.

 

Aproveitando, seja bem vindo ao fórum e aproveite para ler as orientações de participação e programação para este fórum.

 

ATENÇÃO: Orientações e Regras do Fórum de PHP

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.