• 0
Sign in to follow this  
dammy

Envio De E-mails Com Intervalo

Question

Estou montando uma newsletter para um cliente que tem 10000 emails cadastrados, costumo usar um código que tenho aqui, adaptado da internet.

Mas por ser uma empresa renomada não pode haver falha no envio dos e-mails, por isso gostaria de saber qual a opinião de vocês e se podem me ajudar a resolver isso da melhor forma.

Andei pesquisando sobre o assunto e os problemas apresentados que encontrei nos foruns são os seguintes:

pode ser considerado SPAM pelo servidor, pode haver sobrecarga do servidor, pode haver falha na conexão SMTP, pode falhar no envio deixando de enviar para alguém da lista...

Alguns dizem que é melhor gerar uma tabela temporária e ir apagando os arquivos já enviados para não fazer o SELECT em todos os 10000 campos a cada intervalo, outros dizem que isso não é bom.

Encontrei um código na internet que parece ser bom, mas é em access e não consegui entender muito bem.

Se alguém souber de um código ou forma confiável de se fazer isso, agradeço muito. (não pode ser através de programa porque a pessoa responsável pelo envio quer ter liberdade de fazê-lo a partir de qualquer máquina).

Obrigada.

Share this post


Link to post
Share on other sites

13 answers to this question

Recommended Posts

  • 0

A primeira coisa que você tem que fazer é verificar se o seu provedor tem algum limite para envio de e-mails.

Eu precisei enviar 24.000 e-mails, e no caso o meu provedor tinha limite de 200 por hora.

A solução que encontrei foi recarregar a página a cada 1 hora, com HTML mesmo:

<meta HTTP-EQUIV = "Refresh" CONTENT = "3900; URL = pagina.php">

Quanto ao controle de envio eu criei dois campos:

Exemplo:

status_lido: começa como 2, a partir do momento que o programa passou por esse e-mail, eu passo para 1.

status_cortesia: começa como 0, se enviar passa para 1. No meu caso se ele aceitasse a promoção que enviei por e-mail passava para 2.

Dessa forma sei quantos enviaram e quantos aceitaram a promoção enviada.

Seu select vai ficar parecido com:

select email from tabela where status_lido='2' limit 0,100

Share this post


Link to post
Share on other sites
  • 0

Oi, Vinicius ! Obrigada pela atenção.

Já entrei em contato com o servidor e estou aguardando a resposta.

De repente vou ter que fazer o refresh como você. Nesse caso, é preciso deixar a página aberta até a finalização do envio, né?

E como você faz essa verificação se a pessoa aceitou sua promoção? é manualmente ou tem algum esqueminha?

Estou postando abaixo o código que estou usando, já com algumas modificações que eu fiz. Podem, por favor, avaliar pra mim e dizer se acham que desta forma é eficiente e seguro?

Agradeço demais.

<?

include "list-config.php"; // dados da conexão com o bd

include "sess.php"; // verifica session

?>

<html><body>

<?php

if (isset($_POST['sendemail'])) { // uso um form em outra página para inserir o assunto e a mensagem

$subject = $_POST['subject'];

$message = $_POST['message'];

$message1 = stripslashes($message);

$sqla = mysql_query("insert into AWnews SET subject = '$subject', message = '$message1'");

}

$quant = 2; //número de mensagens enviadas de cada vez (2, apenas para teste)

$sec = 12; //tempo entre o envio de um pacote e outro (em segundos)

$ok = 0;

$inicio = 0;

$fim = $inicio + $quant;

$sql = "SELECT a.id, a.status, a.name, a.email, b.subject, b.message FROM AWmailList a, AWnews b where a.status = 0 limit $inicio,$fim";

$query = mysql_query($sql);

$registros = mysql_num_rows($query);

if($registros==0){

$zera1 = mysql_query("update AWmailList set status = 0");

$zera2 = mysql_query("truncate table AWnews");

printf("todas as mensagens foram enviadas!");

$ok = 1;

}

while($r = mysql_fetch_array($query)){

$id = $r[0];

$status = $r[1];

$name = $r[2];

$email = $r[3];

$subject = $r[4];

$message = $r[5];

mail("$name <$email>", "$subject", "Saudações, $name.\n\n $message", "From: $fromname <$youremail>");

mysql_query("update AWmailList set status = 1 where id = $id");

printf("$id ) mensagem para <b>$name</b> <font color=’#ff0000’><b>enviada com sucesso!</b>");

}

mysql_free_result($query);

mysql_close($conexao);

if(!$ok){

echo("<meta http-equiv=\"refresh\" content=\"" . $sec . "\">");

}

?>

</body></html>

Share this post


Link to post
Share on other sites
  • 0
De repente vou ter que fazer o refresh como você. Nesse caso, é preciso deixar a página aberta até a finalização do envio, né?

Sim.

E como você faz essa verificação se a pessoa aceitou sua promoção? é manualmente ou tem algum esqueminha?

Na página que o usuário aceita a promoção, eu efeto um "update" no valor do campo.

Share this post


Link to post
Share on other sites
  • 0
Na página que o usuário aceita a promoção, eu efeto um "update" no valor do campo.

poxa, que idéia legal. mas onde você executa o update? você envia um link por email ou algo assim?

você pode avaliar o meu código?

Obrigada !

Share this post


Link to post
Share on other sites
  • 0

Olá ,

Minha opinião o que teria que fazer seria colocar um campo na tabela como NRNEWS, descobrir quantos e-mailś pode ser enviado pelo servidor por hora, ai alterar seu codigo para quando enviar a mensagem atualizar este campo para saber que este e-mail foi enviado para a proxima vez não enviar novamente na mesma news.

Ai seria só colocar o seu script no cron job do servidor e agendar o envio a cada 1:05 Hs e no script enviar um pouco a menos que o limite, lembre que este limite não é só a news que esta passando, os seus e-maiĺs normais contam também no limite, se ultrapassar voce não vai conseguir enviar e-mailś normais e os que enviarem para voce vai dar erro de rota, por isto é preciso cuidado.

Outro modo seria voce contratar uma empresa que envia news letter, assim não compromete o IP da maquina.

Sobre o codigo, pegar codigo pronto não é bom, o melhor seria ou voce fazer um ou contratar alguém capacitado para efetuar esta tarefa.

Jair

Share this post


Link to post
Share on other sites
  • 0

Oi, Jair. Muito obrigada pelas dicas.

Vou tentar implementar mais algumas idéias neste código.

Eu peguei o código pronto porque meu conhecimento não é tão amplo assim, mas é desta maneira (usando código pronto como base e alterando depois, inlcusive com a ajuda de vocês) que estou conseguindo aprender um pouquinho mais.

Se alguém mais tiver opiniões a dar, são muito bem vindas.

Abraços pro cês.

Valeu Jair.

Share this post


Link to post
Share on other sites
  • 0

poxa, que idéia legal. mas onde você executa o update? você envia um link por email ou algo assim?

você pode avaliar o meu código?

Obrigada !

Sim, tinha um link para uma página no meu servidor.

Quanto a avaliar o seu código, quanto tiver com um pouco mais de tempo prometo que dou uma olhada.

Olá ,

Minha opinião o que teria que fazer seria colocar um campo na tabela como NRNEWS, descobrir quantos e-mailś pode ser enviado pelo servidor por hora, ai alterar seu codigo para quando enviar a mensagem atualizar este campo para saber que este e-mail foi enviado para a proxima vez não enviar novamente na mesma news.

Ai seria só colocar o seu script no cron job do servidor e agendar o envio a cada 1:05 Hs e no script enviar um pouco a menos que o limite, lembre que este limite não é só a news que esta passando, os seus e-maiĺs normais contam também no limite, se ultrapassar voce não vai conseguir enviar e-mailś normais e os que enviarem para voce vai dar erro de rota, por isto é preciso cuidado.

Jair

Sim.

No meu caso, o limite era 200.

Em horário comercial, eu enviada 100 para não compremeter os outros usuários.

Depois do horário eu enviava no limite total.

Tome cuidado com este detalhe Dammy.

Principalmente se estiver fazendo de uma empresa.

Mudando de assunto.

Jissa, já fui cliente do seu host e me lembro de sua capacidade como programador.

Estou precisando de uma ajuda em relação a sessões que ninguém desvendou ainda no tópico que abri.

http://scriptbrasil.com.br/forum/index.php?showtopic=85195

Share this post


Link to post
Share on other sites
  • 0

Obrigada, Vinicius.

Vou atentar para todos esses detalhes.

Agora, me surgiu uma dúvida com relação ao cron job... é que essa newsletter será utilizada para envio de comunicados aos associados da empresa e têm que ser enviados o quanto antes.

Não há um dia pré-determinado (1 vez por semana, por ex.) para o envio e não serei eu que vou trabalhar com isso, sendo assim, acho que o mais recomendável é usar o refresh mesmo, não é?

Podem me esclarecer quanto a isso também?

Obrigada de novo.

Share this post


Link to post
Share on other sites
  • 0

refresh voce tem que ficar com a pagina aberta e se der algum problema na internet só reiniciando..

voce pode colocar uma tabela simples uma indicação que é para ser enviado, e no script do cron apenas verifique se tem a indicação se tiver dispara, quando for o ultimo e-mail voce muda a indicação..

ai é com voce escolher..

Share this post


Link to post
Share on other sites
  • 0

Nossa, Jair, muito jóia sua idéia. Não imaginei que fazer isso fosse possível.

Eu andei olhando lá no servidor sobre o cron, mas não sei como posso programá-lo desta forma (pra ajudar, é tudo em inglês... coloco no tradutor, mas algumas coisas não ficam claras).

Você pode me orientar? Como posso fazer esta tabela? Tenho que fazer alguma coisa diferente no cron?

Desde já agradeço demais pela atenção.

Vocês estão sendo muito legais. Vou usar muito este sistema e estou achando muito bom poder aprender da forma correta.

Abraços pro cês !

dammy

Share this post


Link to post
Share on other sites
  • 0

Oi..

no cron voce vai colocar apenas o script que vai enviar o e-mail e o tempo que sera executado..

exemplo se colocar algo como:

/usr/bin/curl http://www.seudominio.xxx/enviaemail.php

ou só o endereço direto http://www.seudominio.xxx/enviaemail.php

para isto peça o suporte do seu host para informar a forma correta de funcionamento com eles.

todos os outros controles voce vai fazer neste enviae-mail.php o cron vai servir apenas para disparar o script na hora programada.

na tabela voce pode colocar algo como

enviado char (1) ou int(1)

si após o mail() voce atualiza ele com um valor pode colocar 0 e 1 0 para não enviado 1 para enviado

Share this post


Link to post
Share on other sites
  • 0

Oi, Jair !

Perdoe-me pela ignorância... mas acho que ainda não entendi direito... :blink:

É que o envio dos e-mails será feito sempre que houver algum comunicado a ser feito aos associados da empresa... então... não estou sabendo como vincular o "enviaemail.php" com o cron.

O disparo do envio tem que ser feito manualmente pelo responsável de forma que o cron dê continuidade ao envio automaticamente...

não sei como programar o cron.

de novo agradeço MUITO !!!!

Share this post


Link to post
Share on other sites
  • 0

Olá,

só coloque o script no cron para ser executado a cada 1 hora..

no enviaemail.php voce tem que chegar se existe algo a ser enviado, um

//pesquisar base de dados

//localizar se tem algum para ser enviado

//se tiver envia os e-mails

//não tendo nada ele não faz nada..

tipo

if($existeenvio)

{

//envia os e-mailś

}

ai a cada hora o enviaemail.php vai pesquisar e enviar caso tenha ocorrencias a serem processadas

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this