Jump to content


Photo

E-mail Em Massa Sem Sobrecarregar Servidor


  • Faça o login para participar
21 replies to this topic

#1 Marcos Aurélio

Marcos Aurélio

    Das terras geladas da Sibéria

  • Usuários
  • 208 posts
  • Sexo:Masculino

Posted 06/03/2008, 19:02

Boa noite,

Estava pensando em fazer um sistema de envio de e-mails para meus usuários, porém, sei que os servidores tem um limite de envio, e mesmo assim, quando você envia muitos, você pode até mesmo derrubar o servidor.

Pensando em 10, 20, 30 mil usuários, qual seria a melhor alternativa para envio de e-mail em massa? SMTP?

#2 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 06/03/2008, 20:17

Acredito que não seja tanto a escolha de se por SMTP ou pelo sendmail (é esse né).

Acredito que você deva verificar com seu servidor o limite de e-mail's por minuto permitido e ocm isso configurar uma terefa de disparo de envio com um valor baixo por "tacada" e dar um intervalo de 60 segundos entre um disparo e outro.

Como funciona tipo uma paginação, você dispara uns 10 por vez e, ou com sleep() para 60 segundos ou com cronjobs você repete a cada minuto.

É uma idéia

#3 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

Posted 07/03/2008, 01:29

Ou contratar um serviço que faça isso, já que mesmo tendo um dedicado ficaria difícil dele dá essa "tacada de 30 mil" sozinho.
Um exemplo seria o CARTEIRO XPRESS, somente 75,00 reais o envio de 30 mil. ^^
http://www.carteirox..._faq.jsp#quanto
Posted Image
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."

Muito Obrigado à todos do fórum, e à toda equipe do fórum! =)

#4 Maykel Esser

Maykel Esser

    Super Veterano

  • Usuários
  • 1536 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR

Posted 07/03/2008, 17:04

sleep(x);

onde x = segundos

Se este post lhe ajudou, ajude o fórum também. Use a reputação de mensagens! add.png


#5 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 07/03/2008, 20:27

Tive este problema tempos atrás e teve vários tópicos do fórum sobre esse seu problema.

O que eu recomendo.
1) Utilização da classe phpmailer.
2) Utilizar o envio em modo smtp. nao do modo mail() (que usa o mail interno do servidor)
3) Dividir em lotes, de 50 em 50, com intervalo de tempo de 5 segundos ou até mais.

Tive que enviar e-mail para 1000 usuarios, fazendo isso eu nao sobrecarreguei o servidor de email do cliente e o servidor nao caiu na blacklist de servidores spamzeiros ;)

[]'s

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#6 Felipe Canuso

Felipe Canuso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 23/06/2008, 15:11

Savior, não entendi bem a sua ultima recomendação
3) Dividir em lotes, de 50 em 50, com intervalo de tempo de 5 segundos ou até mais.
Pois quando faço isso por exemplo para 100 emails cadastrados... enviando 10 emails a cada 10segundos e ele envia todos denovo pois a funcao Send() do phpmailer ela não envia um de cada vez.. ela envia todos juntos.
Fiz com a função sleep. mas não consegui.
Você tem alguma dica?
Abraço

#7 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

Posted 23/06/2008, 15:24

Felipe, seja bem-vindo ao fórum! =)

E não usei a função, mas eu faria se fosse usar somente o MAIL() assim:

Colocar os emails em um array..
$array=array("fulano@email.com","ciclano@email.com","beltrano@email.com");

Contaria quantos emails há no array..
$count=count($array);

Faria um loop para ele usar a função mail para cada um dos emails..
for($i=0;$i<$count;$i++){
 $y++;
 mail($array["$i"],"etc,"etc");
 if($y==10){
  sleep(10);
  $y=0;
 }
}

Posted Image
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."

Muito Obrigado à todos do fórum, e à toda equipe do fórum! =)

#8 Felipe Canuso

Felipe Canuso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 23/06/2008, 15:41

Obrigado pelas boas vindas :lol:
Então, eu gostaria de implementar o sleep junto com o phpmailer->smtp.. você saberia alguma maneira?
Pois o phpmailer se eu fizer isso de enviar de 10 em 10 ( eu tinha implementado um código semelhante ao seu ) ele envia 10 email para cada =///
Valeu
Abraços

#9 Dudu

Dudu

    Viva la vida

  • Usuários
  • 1437 posts
  • Sexo:Masculino
  • Localidade:Uberlândia - MG
  • Interesses:PHP

Posted 23/06/2008, 18:39

Baseado no que lwirkk postou, fiz um exemplo usando PHPMailer, que funciona perfeitamente:

<?
include("./classes/class.phpmailer.php");


$mail = new PHPMailer();
$mail->SetLanguage("br");
$mail->IsHTML(true); // envio como HTML se 'true'
$mail->WordWrap = 50; // Definição de quebra de linha
$mail->IsSMTP(); // send via SMTP
$mail->SMTPAuth = true; // 'true' para autenticação
$mail->Mailer = "smtp"; //Usando protocolo SMTP
$mail->Host = "smtps.bol.com.br"; //seu servidor SMTP
$mail->Username = "***"; //Username da BOL
$mail->Password = "***"; // senha de SMTP
$mail->From = "***";
$mail->FromName = "Equipe Portal 1533";
$mail->Body = "Email de teste...";
$mail->Subject = "Assunto de teste";

$array = array("dudu1533_php@hotmail.com" => "Dudu1533_PHP",
			   "eduardo.costa@netsite.com.br" => "Eduardo Netsite",
			   "ecosta19@yahoo.com.br" => "Dudu Yahoo",
			   "dudu1533@portal1533.com.br" => "Dudu1533 Portal1533",
			   );


foreach($array as $email => $nome) {
	$y++;
	$mail->AddAddress($email, $nome);
	if($y == 10) {
		sleep(10);
		$y = 0;
	}
}

$mail->Send();
?>

Assim pode fazer um array mais complexo, adicionando mais informações.

Veja mais informações sobre o uso da classe em: http://phpmailer.cod...m/examples.html

Até mais ^_^

Edição feita por: _Dudu_1533, 23/06/2008, 19:23.

Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Moderador


Twitter: HostCheap


#10 Felipe Canuso

Felipe Canuso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 23/06/2008, 21:57

_Dudu_1533, desse jeito nao sobrecarrega o servidor ?
preciso enviar em média 600 e-mails.

Valeu pela ajuda.

#11 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

Posted 23/06/2008, 23:24

Sobrecarregar o servidor, provavelmente não, e o array poderá ser montado também a apartir de dados de emails de algum banco de dados.
Mesmo fazendo isso, muitos hosts compartilhados bloqueam o número de envio de email por hora para um número baixo.
Com exemplo de enviar 10 emails a cada 10 segundos, em 16 minutos +-, enviará 1000, muitos hosts o limite é muito menor que esse valor... =)

E também poderia no exemplo acima, adicionar um flush() para que o script não fique sendo esperado por vários minutos até terminar o envio, dependendo da lista de email, e a cada 10 segundos, além de ter enviado o email, o script dar um "sinal" na tela de que aqueles 10 foram enviados, podendo até mesmo se usar banco de dados, a cada um enviado com sucesso poderia dar um UPDATE na tabela do banco de dados onde tiver esse email (WHERE) dizendo que ele foi enviado, dando maior controle dos envios de emails, quem tem uma lista no banco de dado pode fazer uma consulta e colocar os emails em um formulário do tipo CAIXA DE MULTI SELEÇÃO para selecionar os que deseja enviar, urfff vou parar de falar, por que aí já estaria chegando na criação de ums script de envio de emails.... '-'

Edição feita por: lwirkk, 23/06/2008, 23:26.

Posted Image
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."

Muito Obrigado à todos do fórum, e à toda equipe do fórum! =)

#12 Felipe Canuso

Felipe Canuso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 28/06/2008, 14:59

lwirkk, consegui monta um sistema legal com a dica do flush() com sleep para ir informando ao cliente. Valeu pela ajuda de vocês
Abraços.

#13 lwirkk

lwirkk

    Veterano

  • Usuários
  • 1314 posts
  • Sexo:Não informado

Posted 28/06/2008, 15:18

lwirkk, consegui monta um sistema legal com a dica do flush() com sleep para ir informando ao cliente. Valeu pela ajuda de vocês
Abraços.

Sem problemas! =)
Muito útil nesses casos e em muitos outros a função flush() =)
Posted Image
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."

Muito Obrigado à todos do fórum, e à toda equipe do fórum! =)

#14 workperfect

workperfect

    Novato no fórum

  • Usuários
  • 2 posts
  • Sexo:Não informado

Posted 12/08/2008, 08:32

Cara posta o script pra gente aiii...to precisando de uma parada dessas

#15 Maykel Esser

Maykel Esser

    Super Veterano

  • Usuários
  • 1536 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR

Posted 12/08/2008, 08:55

/\ Eeeeee pidão hein :D

faça seu próprio script cara, é mais em conta e você aprende muito mais!

Se este post lhe ajudou, ajude o fórum também. Use a reputação de mensagens! add.png





0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq