Ir para conteúdo

POWERED BY:

Arquivado

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

mcd more core

Contar registros enviados por PHP

Recommended Posts

Pessoal, possuo um formulário e um sistema de newsletter, porém quero saber como posso fazer de uma forma dinâmica que ele me informe quantos e-mails já foram enviados, vejam abaixo +/- o exemplo de como quero fazer esse sistema.

 

 

$sql=mysql_query("select * from newsletter order by email desc") or die ("Problema ao enviar newsletter em->> ".$sql);
while($linha=mysql_fetch_array($sql))
{

// aqui vai a função normal de envia os e-mails

// quero que a cada Loop aqui dento enviado ele me informe de forma dinâmica que o mesmo já foi enviado
// Exemplo.: ( enviados 1,2,3,4,5,6... e assim em diante.

}
echo"E-mails enviados com sucesso!";
exit;

 

# Bom galera é isso ai em cima, +/- o meu newsletter, imaginem que tenho [10 emails], ele irá fazer [10 loops] eu quero que a cada loop que sejá enviado ele me informe { Emails enviados.: 1,2,3,4... em diante. }

 

# DE FORMA DINÂMICA ELE VÁ ME INFORMANDO OS E-MAILS ENVIADOS, NÃO NO FINAL DO ENVIO DE TODOS, QUE ELE ME INFORME REALMENTE QUANTOS JÁ FORAM ENVIADOS -- SE TIVER 200 E-MAILS E ELE ENVIOU 22 ELE VAI ME INFORMANDO DINAMICAMENTE A CADA E-MAIL ENVIADO #

 

Alguém pode me ajudar a fazer isso? bom que ele não me retorne os valores seguidos 1,2,3,4... e sim que ele exiba de alguma forma os valores sempre substituindo o mesmo [1] ai ele substitui por [2], mas a ideia é realmente essa galera que ele conte quantos dentro do Loop total já foram enviados.

 

Obrigado, aguardo! B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode fazer isso controlando o buffer

 

 

http://php.net/manual/en/function.ob-flush.php

http://stackoverflow.com/questions/2963436/php-sleep-excution-sequence-while-echoeing

 

só que depende das configurações do ambiente

 

por isso recomendo que faça de um jeito menos "trabalhoso", por exemplo, você pode gravar os dados num arquivo texto e sempre que consultar, faça a leitura do arquivo.

 

ou ainda, se quiser que na tela fique mudando o número em "tempo real" sem precisar executar nenhuma ação, basta fazer a consulta usando ajax.

 

como exemplo, você pode consultar via ajax o n;umero de emails que foram enviados e os que tiveram alguma falha, tal como exibir os emails e as falhas ocorridas..

Compartilhar este post


Link para o post
Compartilhar em outros sites

questão de lógica.. basta gravar os logs dentro do loop.

se falhar o envio, grave como erro num log de erros.

se enviar sem falhas, grave como "ok".. ou o que for melhor..

 

enquanto envia, inicie uma requisição ajax, a qual chamará alguma página php para fazer leitura dos arquivos de log.

use time interval do javascript para controlar a periodicidade de requisições assíncronas..

é basicamente isso..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom, te perguntei como seria isso porque eu realmente não sei como fazer, tenho pouco conhecimento com AJAX / JS, realmente eu não tenho ideia de como eu poderia fazer isso, por isso queria sua força amigo realmente de um exemplo pelo menos de como eu poderia fazer, eu vi os arquivos e detalhes dos links que você me passou, porém tive pouco entendimento realmente.

 

# Me da essa força ai mano B)

Compartilhar este post


Link para o post
Compartilhar em outros sites
$sql=mysql_query("select * from newsletter order by email desc") or die ("Problema ao enviar newsletter em->> ".$sql);
$c = 0 ; 
while($linha=mysql_fetch_array($sql))
{

// aqui vai a função normal de envia os e-mails

// quero que a cada Loop aqui dento enviado ele me informe de forma dinâmica que o mesmo já foi enviado
// Exemplo.: ( enviados 1,2,3,4,5,6... e assim em diante.
  ++$c ;
}
echo $c . " E-mails enviados com sucesso! ";
exit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade o 'log' deve ser na verificação do envio, nao no loop

o loop vai rodar 100 vezes, mas a classe de envio nao vai poder enviar para um email incorreto email@miau.ops

 

uma pergunta

mesmo que o email esteja gravado corretamente no db, uma classe para envio de email pode tratar algum retorno tipo uma conta inválida, algo como header 404 para uma página, existe isso no envio de email?

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 12/10/2011 at 15:39, criatividade zero disse:

mesmo que o email esteja gravado corretamente no db, uma classe para envio de email pode tratar algum retorno tipo uma conta inválida, algo como header 404 para uma página, existe isso no envio de email?

 

Returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, 
it does NOT mean the mail will actually reach the intended destination.

 

Afinal, acho desnecessário esse log, porque você não tem como saber se o destinatário 'realmente' recebeu o email ..

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 12/10/2011 at 15:56, Andrey Knupp disse:

Afinal, acho desnecessário esse log, porque você não tem como saber se o destinatário 'realmente' recebeu o email ..

verdade

mas sem saber a finalidade do sistema fica dificil ajudar, mas um sistema de news basta um simples update no status do DB, algo como send=true - ja bastaria para saber que foi enviado determinado lote de emails

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente .. isso seria a flag para cada email cadastrado .. no momento em que estamos iterando a lista de emails para envio, fazemos essa verificação, ou melhor .. já selecionamos todos que não foram enviados , e na hora da iteração, alteramos o status do mesmo, aí depois basta um event no banco ou 'botão' que altera todos os emails que foram enviados para 'não' enviados no banco ..

 

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 12/10/2011 at 15:56, Andrey Knupp disse:

Returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, 
it does NOT mean the mail will actually reach the intended destination.

 

Afinal, acho desnecessário esse log, porque você não tem como saber se o destinatário 'realmente' recebeu o email ..

 

Andrey brown, então esse LOG informando os emails enviados seria muito bom para mim pois assim eu teria realmente um controle de quantos faltam para acabar, porque eu tentei por ( PROGRESS BAR ) mas não tive sucesso algum, então a forma mais prática de realmente saber o andamento dos e-mails seria essa, ele me retornando ( 1,2,3,4 exibindo os emails ja enviados ), sobre a questão de ter email válido ou inválido eu já tenho isso no ato do cadastro, antes de tudo isso eu faço uma verificação e retorno somente os e-mails VÁLIDOS.

 

 

Eu pensei que você poderia me ajudar andrey porque como eu ví esse tópico aqui ->> http://forum.imasters.com.br/topic/423375-onde-esta-o-erro/

 

pensei que você poderia me ajudar, pois eu consegui +/- entender a base que ele quis empregar ai, eu queria fazer algo do mesmo tipo, se eu tivesse como retornar os valores da forma que foi feito nesse, seria bacana porque eu poderia também jogar um forma dele em atualizar dinâmico no AJAX, outra coisa também...

 

Você retorna no loop acima que você fez os e-mails enviados porém quando TERMINA, eu preciso ter acesso ao andamento REAL dos emails enviados.

 

# Aguardo uma ajuda ai galeraa :D

 

  Em 12/10/2011 at 16:22, criatividade zero disse:

verdade

mas sem saber a finalidade do sistema fica dificil ajudar, mas um sistema de news basta um simples update no status do DB, algo como send=true - ja bastaria para saber que foi enviado determinado lote de emails

 

 

Olá, Zero.

 

Então brother, a finalidade do sistema é realmente o cliente saber quantos e-mails já foram enviados, por que assim...

 

Quando se tem um lote de 100 e-mails, a função PHP irá realmente demorar enviando todos os e-mails, ( 1 BY 1 ), então eu pensei porque não exibir dinamicamente ( QUANTOS E-MAILS JÁ FORAM ENVIADOS ) para o cliente ter a ideia de quantos faltam para acabar, porque a minha programação faz da seguinte forma...

 

** Ele seleciona O LOTE de E-mails cadastrados ( LOTE 12/10/2011 = 200 e-mails )

** Seleciona a oferta que quer implementar ( Oferta = Celular 5Chips CHINA )

** ( ENVIAR ) = Enquanto é enviado, fica exibindo um GIF animado ( Enviando... ) e fica nessa demorando pelo envio, e o cliente só saberá quando terminou, quando aparecer a MSG ( E-mails enviados com Sucesso. Total de e-mails enviados com exito = 195 )

 

 

// Por esse motivo a questão de exibir dessa forma...

 

# E-mails já enviados [ 5 ]  // aqui sempre irá atualizar para quando enviar ( aquele LOOP ) a cada loop completo ele muda o número
# Total de e-mails [ 200 ]

 

Entendeu brother o porque ?

# Da essa força ai valeu

 

 

PS.: Até tenho outro tópico que tento pregar essa ideia por base de um (PROGRESS BAR) ao qual calcularia o tempo TOTAL que vai levar e ele iria carregando a porcentagem de ( 0% até 100% ) ou de alguma forma que eu soubesse o tempo total que falta para cabar, mas não tive nenhum resultado ou ideias de como implementar o mesmo.

 

 

Aqui o link do outro para vocês darem uma olhada ->>> http://forum.imasters.com.br/topic/446512-formulario-com-progress-bar-0-100/

 

# Alguma dessas ( 2 IDEIAS ) tem que dar certo pessoal, ( PROGRESS BAR ou CONTANDO OS DADOS JÁ ENVIADOS )

 

Aguardo essa força ai. B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

o seu problema se resolve usando uma paginação simples, ja pensou em faze-la?

1. quando ser o 'start', passe o param pela url - ?pg=1 e nela a paginação limita o lote em 100 emails

2. na ?pg=2 você mostra os total de emails que foram enviados que estiverm com a flag no DB

e por ai vai, é basicamente isso, eu tinha isso em ASP e não tinha erro nenhum, todos quando enviados eram marcados

 

usando JS você apenas vai mudar a interface, mas vai ter que fazer paginação senão alguns servidores bloqueiam devido ao limite de envio

 

a base de envio é fazer em lote de X, com paginação automatica ou manual

ate pq você pode rever determinado lote em caso de erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara .. a gambiarra que dá pra você fazer é algo nesse sentido

<html>
<head>
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/sunny/jquery-ui.css" type="text/css" />
	<script type="text/javascript">
		 $( document ) . ready ( function ( ) {
			 var i = 0 ;
			 setInterval( function(  ) {
				 $ . post ( 'mail.php' , { s : i } , function ( data ) { 
					$( '#progress' ) . progressbar( { 
						value : i
					} ) ;
					if( i < 100 && ! isNaN ( data ) ) i ++ ;
				 } ) ;
			 } , 100 ) ;
		 } ) ;
	</script>
</head>
<body>
	<div id="progress"></div>
</body>
</html>

 

Na página mail.php

<?php
if( $_POST[ 's' ] < 5 ) echo $_POST[ 's' ] ; 
else echo '...';

 

No caso, eu movi a progress bar até 5% aí você vai fazendo isso até enviar todos .. lembrando que você também vai ter que seguir a idéia da flag, enviar email por email ..

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 12/10/2011 at 17:14, Andrey Knupp disse:

Cara .. a gambiarra que dá pra você fazer é algo nesse sentido

<html>
<head>
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/sunny/jquery-ui.css" type="text/css" />
	<script type="text/javascript">
		 $( document ) . ready ( function ( ) {
			 var i = 0 ;
			 setInterval( function(  ) {
				 $ . post ( 'mail.php' , { s : i } , function ( data ) { 
					$( '#progress' ) . progressbar( { 
						value : i
					} ) ;
					if( i < 100 && ! isNaN ( data ) ) i ++ ;
				 } ) ;
			 } , 100 ) ;
		 } ) ;
	</script>
</head>
<body>
	<div id="progress"></div>
</body>
</html>

 

Na página mail.php

<?php
if( $_POST[ 's' ] < 5 ) echo $_POST[ 's' ] ; 
else echo '...';

 

No caso, eu movi a progress bar até 5% aí você vai fazendo isso até enviar todos .. lembrando que você também vai ter que seguir a idéia da flag, enviar email por email ..

 

 

Andrey essa ideia é bem bacana mesmo, agora me tira algumas dúvidas...

 

O valor ( 5 ) que encontra-se abaixo,

<?php
       if( $_POST[ 's' ] < 5 ) echo $_POST[ 's' ] ; 
       else echo '...';

ele seria a porcentam de 0 até 100, dentro do código que eu tem logo no topo do PHP a consulta ao BD e o LOOP onde eu colocaria esse código, e esse valore ( 5 ) como eu iria definir ele de forma que me resulte realmente até onde deve ir o progress bar ou até mesmo que quando CHEGAR NO FINAL do progress bar ele me retorne um ( OK = E-mails enviados ) ??

 

# Outra coisa, teria como me apresentar algum conteúdo, texto sobre esse ( FLAG )?

 

* Ainda não sou tão SAFO quanto vocês em ( PHP, JS, AJAX, etc ) mas estou tentando realmente entender, aguardo essa força.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, eu vi esse código aqui em um Tópico, porém somente esse comando não tinha mais detalhes, mas teria como se fazer algo com isso ??

 

veja...

 

$total_emails=count($destinatario); 
$soma_progresso=100/$total_emails; 
$progresso=0; 
foreach ($destinatario as $destino) 
{	

//Enviando o email 

mail($destino,$assunto_update,$mensagem,$headers); 

echo $progresso=round($progresso+$soma_progresso,0); 

echo '<script type="text/javascript">'; 
echo '$("#progressbar").progressbar({value: '.$progresso.'});'; 
echo '</script>'; 
}

 

....???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue uma outra idéia mais clara ..

<html>
<head>
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/sunny/jquery-ui.css" type="text/css" />
	<script type="text/javascript">
		 $( document ) . ready ( function ( ) {
			 var i = 0 ;
			 setInterval( function(  ) {
				 $ . ajax ( {
					 type : 'POST' ,
					 url : 'mail.php' ,
					 data : 's=' + i ,
					 dataType : 'json' ,
					 success: function( data ) {
						$( '#progress' ) . progressbar( { 
							value : i
						} ) ;
						if( i <= 100 && ! isNaN ( data . progress ) ) { 
							i ++ ;
							$( '#current' ) . html ( data . mail ) ;
						} else $( '#current' ) . html ( 'Envio concluido' ) ;
					 }
				 } ) ;
			 } , 100 ) ;
		 } ) ;
	</script>
</head>
<body>
	<div id="progress"></div>
	<div id="current"></div>
</body>
</html>

 

Mail.php:

<?php
	 for( $i = 0 ; $i <= 99 ; ++ $i ) {
	 	$Mails [] = sprintf( 'mail%d@ex.com' , $i ) ; 
	 }

	 $Arr = Array ( 
		'mail' => utf8_encode( $Mails [ $_POST[ 's' ] ] ) ,
		'progress' => ( $x == null ? 0 : $x )   
	 ) ; 
	 echo json_encode( $Arr ) ;

 

Não sei como você chama isso de 'bacana', o que adianta o sistema ser legal por fora, mas uma perda de processamento enorme por dentro ..

cara, o objetivo aqui é simples, alias, .. aqui não, o objetivo disso é simples, enviar os emails, pronto .. não tenta querer ser 'bunitinho' quando não é possível não .. porque não vai dar certo .. se isso aí fosse um java / delphi .. era fácil fazer o progress .. mas em php, essas coisas são difíceis por causa da dependência do lado do cliente .. agora, não me pergunte como implementar isso no teu código, porque eu não tenho a mínima vontade em te ajudar com isso, se eu fosse te ajudar, eu estaria ajudando a ferrar seu sistema, e não a solucionar o problema que no caso é mostrar os enviados

 

 

Demonstração

 

 

Agora, francamente .. eu largava isso de lado, e fazia o simples e funcional .. mais nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

# CARA SUPER LEGAL, entendo a preocupação não com a beleza, mas a funcionalidade do sistema, testei aqui com os códigos exibidos ( e não apareceu o progress bar ), você esta fazendo alguma consulta no BD nesse link ai ONLINE? porque aqui eu não consegui.

 

* Estou tentando LOCALHOST seria esse o problema ou só funciona online ?

 

aguardo

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.