Edultra 13 Denunciar post Postado Outubro 22, 2010 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
masi 22 Denunciar post Postado Dezembro 19, 2013 Tem como você postar a versão usando o PHPmailer? Compartilhar este post Link para o post Compartilhar em outros sites
extremevip 0 Denunciar post Postado Março 1, 2016 Como faço para baixar esse script? Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Março 1, 2016 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