Ir para conteúdo

POWERED BY:

Arquivado

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

Rubens Garcia

Envio de emails por lote

Recommended Posts

Olá pessoal estou desenvolvendo uma rotina para envio de emails em lote a cada uma hora o servidor envia 300 emails vindos de um banco de dados eu gostaria de opiniões para melhorar o código !

 

for($cont = 0; $cont==300 ; $cont++){

//loop enquanto a variavel linha for igual ao numero de arrays gerados pela função mysql_fetch_array faça
     while ($linha = mysql_fetch_array($query_select)){

     //aramazena resultados da consulta ao banco nas variaveis

     $nome_cli=$linha['nome'];
            $email_cli=$linha['email'];

     // email de origem 
            $email_origem = "xxxxxxxxxxxxxxxxx";	 

     //montando o email para envio 
            $assunto = $titulo;

     //montando a mensagem 
            $mensagem = "<html><head><title>".$assunto."</title></head>";				
     $mensagem .="<body>";
            $mensagem .="<h1><font face=\"verdana\" size=\"12\">".$assunto."</font></h1>";
            $mensagem .=$msg;
     $mensagem .= sprintf( '<img src="http://localhost/Clube/%s" width="640" height="480" />', $fto ); 
     $mensagem .="</body></html>";

     // Define os cabeçalhos do email…
           $headers = "MIME-Version: 1.0\r\n";
           $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "Content-type: image/jpeg\r\n";
           // headers adicionais
           $headers .= "From: $email_origem <$email_origem>\r\n";	

     mail($email_cli,$assunto,$mensagem,$headers);
     }	

sleep(3600); // pausa o envio por uma hora e volta
$cont = 0; // zero o contador para começa o for de novo e retornar o envio de onde parou



}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por default, o tempo de execução de um script é de 60 segundos. Logo, o sleep de uma hora irá expirar (se assim podemos dizer).

 

O ideal seria utilizar o crontab (agendador de tarefas) do servidor, para executar esse script a cada uma hora. A cada vez que executar esse script, ele envia os 300 emails.

 

Neste caso, você só precisará controlar, via programação, quais destinatários já receberam uma cópia do email, para não repetir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por default, o tempo de execução de um script é de 60 segundos. Logo, o sleep de uma hora irá expirar (se assim podemos dizer).

 

O ideal seria utilizar o crontab (agendador de tarefas) do servidor, para executar esse script a cada uma hora. A cada vez que executar esse script, ele envia os 300 emails.

 

Neste caso, você só precisará controlar, via programação, quais destinatários já receberam uma cópia do email, para não repetir.

 

 

o que é o crontab e como pode vereficar o controle via programação ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crontab

http://pt.wikipedia.org/wiki/Crontab

http://wiki.locaweb.com.br/pt-br/Crontab

 

Em relação ao controle do envio, uma opção é colocar um campo para sinalizar que aquele e-mail já recebeu determinado email. Mas enfim: use a criatividade lógica! ;)

 

 

em relação do controle de envio, já estava pensando em criar a coluna status com valor padrão 0 de não enviado e 1 se for enviado

 

faça uma query para selecionar o status e uma outro para alterar o status

 

antes de você postar sobre o crontab, li rapidamente a respeito que é um gerenciador de tarefas para sistemas Unix, ma so wamp server tem um serviço igual ao crontab ?

 

vamos ver o que faço aqui e depois eu posto agradeço pela ideia !

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom fiz as devidas modificações o problema parece que não está enviando o email agora e nem modifica o conteudo do campo que usei update

 

for($cont = 0; $cont==300 ; $cont++){

//loop que pega o resultado da query, guarda em um array e usa conforme necessario
while ($linha = mysql_fetch_array($query_select)){

	//aramazena resultados da consulta ao banco nas variaveis

	$nome_cli=$linha['nome'];
	$email_cli=$linha['email'];
	$status_cli=$linha['status'];


	//se status do cliente for zero envia o email 
	if($status_cli==0){
		// email de origem 
		$email_origem = "xxxxxxxxxxxxxxxxx";	 

		//montando o email para envio 
		$assunto = $titulo;

		//montando a mensagem 
		$mensagem = "<html><head><title>".$assunto."</title></head>";				
		$mensagem .="<body>";
		$mensagem .="<h1><font face=\"verdana\" size=\"12\">".$assunto."</font></h1>";
		$mensagem .=$msg;
		$mensagem .= sprintf( '<img src="http://localhost/Clube/%s" width="640" height="480" />', $fto ); 
		$mensagem .="</body></html>";

		// Define os cabeçalhos do email…
		$headers = "MIME-Version: 1.0\r\n";
		$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
		$headers .= "Content-type: image/jpeg\r\n";
		// headers adicionais
		$headers .= "From: $email_origem <$email_origem>\r\n";	

		mail($email_cli,$assunto,$mensagem,$headers);

	}
      mysql_query("UPDATE clientes SET status=1");	
}	
	  	$cont = 0;
		echo "email enviado";
}



Compartilhar este post


Link para o post
Compartilhar em outros sites

mysql_query("UPDATE clientes SET status=1"); 

 

O código acima irá definir todos os emails como status 1. Falta o WHERE para atualizar apenas o e-mail enviado.

 

Em relação ao envio, está testando no servidor remoto? Lembrando que localmente, normalmente não é possível enviar (exceto com algumas configurações)

Compartilhar este post


Link para o post
Compartilhar em outros sites

posso usar o WHERE assim ?

 

mysql_query("UPDATE clientes SET status=1 WHERE status=0");

 

 

Estou enviando localmente pelo sendmail um email com a configuração envia tranquilamente. Precisaria configurar o sendmail para enviar emails em massa ?

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.