Exclusive
Enviando emails agendados com Crontab

Muita gente procura soluções rápidas e ágeis para o envio de emails de aniversariantes automaticamente por email.
A solução que eu vou apresentar aqui, é uma das mais fáceis, é ESTRUTURADA e funciona (BEM e sem erros) tanto no meu site quanto nos sistemas de clientes.

A primeira coisa, criar uma base de dados qualquer (ou usar a que você já tem) e a tabela. No meu caso vou usar uma base já existente, chamada flaviateste e uma tabela chamada aniversariantes.

A estrutura da tabela aniversariantes:

CREATE TABLE `aniversariantes` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(255) NOT NULL default '',
`email` varchar(255) NOT NULL default '',
`dataniver` date NOT NULL default '0000-00-00',
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=36 DEFAULT CHARSET=latin1

Insira alguns registros nesta tabela, para que possamos trabalhar com os mesmos.

Agora vamos criar um script PHP que fará a tarefa de selecionar o aniversariante pela data de aniversário e enviar o email.

<?

// dados comuns de conexão
$host = "localhost";
$usuario = "meuusuario";
$senha = "senha";
$base = "flaviateste";
$tabela = "aniversariantes";

Pegamos então q data atual do sistema e quebramos o dia e mes separando-os através do explode na variável $date.


$date = date("Y-m-d");
list($anoatual, $mesatual, $diaatual) = explode("-", $date);

// efetuando a conexão
$con = mysql_connect($host, $usuario, $senha);
mysql_select_db($base);

Selecionamos todos os usuários do banco que atendam o critério de busca

$aniversario = mysql_query("SELECT * FROM $tabela WHERE dataniver > $date")
or die("Não conectou: " . mysql_error());

Efetuamos um loop com as seguintes condições: se o mês atual for igual ao mês atual do aniversário do usuário (gravado no campo dataniver da tabela) e se o dia atual for igual ao dia do aniversário do usuário (gravado no mesmo campo) envia o email de aniversário.


while ($row = mysql_fetch_array($aniversario)) {
list($ano, $mes, $dia) = explode("-", $row[3]);
if ($mesatual == $mes) {
if ($diaatual == $dia) {
mail ($row['email'],"Feliz aniversário","Parabéns pelo seu dia!");
}
}
}

?>

Então temos um script básico que faz o que tem que fazer. Mas e rodá-lo todos os dias?

Aí é que entra o famoso CRON ou crontab para os mais íntimos (e familiarizados com ambientes IX). Nele podemos agendar uma tarefa para ser executada de tempos em tempos.

Tendo posse do terminal da máquina (ou utilize o Cpanel da sua hospedagem, seguindo as instruções) digite:

# crontab -e

E adicione as seguintes linhas no arquivo:

* * * * * php /var/www/homedosite/enviaemailaniversarios.php

O que significa a linha acima? Significa que todos os dias, de todos os meses e de todos os anos * * * * o crontab irá rodar o script php presente na pasta mencionada por você. Note que ali deve sempre ser informado o caminho abosluto do arquivo php.

Agora, para que o Cron saiba que o que você está executando é um arquivo PHP e deve ser interpretado como tal, adicione a seguinte linha ao seu arquivo enviaemailaniversarios.php antes de abrir qualquer tag PHP, ou seja, na primeiríssima linha:

#!/usr/local/bin/php -q

Isso vai informar ao Cron, que para rodar este arquivo agendado, deve ser utilizado o binário do PHP, ou seja, "o exe" do PHP, para que a aplicação seja interpretada corretamente.

É isso, como diria meu pai, não precisa prática nem tampouco habilidade, toda criança brinca e se diverte.

Abraços!

Postado em: 16/02/2009
side
Comments
 26 pessoas deixaram os seus comentários. Deixe o seu também!
 
Para proteger os usuários contra spam, os emails desta página foram em parte suprimidos)

PAULO@@@@ri@gamil.com
Oi Flavia, para que eu possa por o remetente no codigo como faço?

Eduardo@@@@hows@gmail.com
Gostaride de agradecer pelo belo exemplo muito explicativo. atravez dele consegui fazer o meu com algumas modificaçoes :)

Jorge@@@@ic.jj@globo.com
Desculpe a curiosidade, mas você poderia explicar como e feito este efeito, como o do seu menu, pois achei muito legal. Um abraço!
  o É feito com a biblioteca Jquery - ajax. Abraço!
Postado por Flavinha em //

Eduardo@@@@lho.edu@gmail.com
Boa tarde Flávia! Primeiramente gostaria de agradecer, pois será de muita ajuda este exemplo. Mas gostaria de saber como mandar mensagem em HTML (com imagem) para o aniversariante. Novamente obrigado!!

Toninho@@@@rego69@bol.com
Por acaso você é filha do Leal professor de Física?
  o Não, não sou. O nome do meu pai era Flávio. Abraço.
Postado por Flavinha em //

Paulo@@@@ri@gmail.com
Boa noite Flavia, vc tem parentes em Jundiaí SP? att,Paulo
  o Olá, infelizmente não sei. Tenho "parentes" em várias cidades. Se o sobrenome for o mesmo, com certeza á parente. Abraço.
Postado por Flavinha em //

Raphaela Lara Tamiette@@@@amiette@hotmail.com
Muito bom mesmo! ;)

Hugo Cesar@@@@tohcf@gmail.com
Estou desenvolvendo um sistema de mala direta, e pra isso estou usando a classe phpmailer...
em tese, terei de pegar todos os contatos da minha tabela, e enviar a newsletter formatada, porém, com um delay gerado no php, para que o servidor não sobrecarregue, e os provedores de email dos destinatários não tratem minha newsletter como span...

mas ainda não tinha pensado em como 'agendar' newsletters... pra que de tempos em tempos, fossem enviadas pros destinatários que forem selecionados...

(lembrando que os destinatários são usuários do portal que estou criando, ou seja, nada haver com span indesejado)....
será que usar o Crontab é a única solução pra fazer o que preciso?

Marcelo Q@@@@lo.queiroz.br@hotmail.com
Oi Flávia Obrigado pela dica e desculpe pelo erro de digitação (Fávia). Seu blog já está add nos meus favoritos! Abraço

Camilo@@@@txm@gmail.com
Nossa, agora sim o site ficou show, em! se quiser ajuda para colocar URL amigável, estou a disposição. Abraços!
  o Obrigada, mas sei criar urls amigáveis se esta fosse a minha intenção. No momento não é. Mas obrigada pela mensagem.
Postado por Flavinha em 05/06/2009

Marcelo Q@@@@lo.queiroz.br@hotmail.com
Fávia Muito bom o script! Sempre que possível, publique mais coisas sobre rotinas automáticas. Aliás, existe alguma alternativa ao cron? Abraço
  o Olá Marcelo, obrigada, continuarei abordando temas interessantes e que contribuam para a comunidade.
Sim, existem alternativas ao CRON, como listeners em java (que podem rodar como um applet em background) ou então uma página aberta com sleep e refresh de tempos em tempos (sessão controlada via browser), e dependendo do banco, poderá criar também scripts para triggers ativadas por tempo (isso é possível no Oracle, por exemplo).

Há algumas boas opções, acho que depende muito do resultado que você precisa obter.
Abraço.
Postado por Flavinha em 27/05/2009

Emerson4br@@@@on4br@gmail.com.br
Ótimo! isso é muito util, nunca tinha pensado em usar o crontab para rodar php, vou me inspirar para rodar newslatter nos picos de baixa do servidor. vou usar os logs e bashscript ou até PHP mesmo para "grepar" os horários. obrigado!

vitor@@@@om.br
parabéns por todos os posts muito phoda!!

Emerson@@@@erson@gmail.com
Por algum motivo desconhecido, alguns provedores não funcionam o cron da forma que você apresentou e o meu é um deles. Encontrei na internet uma outra forma que deu certo e pode ajudar quem mais tiver o mesmo problema.

Ao invés de * * * * * php /var/www/homedosite/enviaemailaniversarios.php
Usar: * * * * * lynx -dump 'http://www.momo.com/enviaemailaniversarios.php' > saida.html
  o Obrigada pela contribuição.
Postado por Flavinha em 23/04/2009

israel@@@@l@visaotur.com.br
me diga uma coisa irá funcionar se eu utilizar a funçao phpmailer dentro do meu arquivo php ? ou seja meu arquivo php terá algo assim Agradeço as dicas acima.

Lyan Sanches@@@@cervejabem.com.br
Realmente interesse a forma como utilizou o Crontab... no SQL Server é infinitamente mais facil trabalhar com rotinas agendadas pois o próprio servidor oferece este suporte com o MySQL sempre foi um problema rodar a página de X em X tempos, ficavamos presos sempre a necessidade de abrir a página pra executar determinada ação. Vai ser de grande ajuda somar isso a toda estrutura orientada a objeto que já desenvolvi. Obrigado.
Lyan Sanches

Endereços de sites digitados pelo usuário bloqueados para evitar propaganda >> http://www.ce--------m.com.br/
Endereços de sites digitados pelo usuário bloqueados para evitar propaganda >>http://www.b------s.com.br/

Gabriel@@@@leletrico@bol.com.br
Olá Flávia, Peguei o código acima colei em bloco de notas editei e passei para o servidor, não apresenta erros mais também não funcionou. Para efetuar alguns testes dei um echo $mesatual e $diaatual e recebi a resposta 03 e 23 respectivamente. Será que teria que colocar algo relacionado a conta de e-mail, senha etc... onde? Tenho pouca experiencia em PHP e ficaria muito alegre se recebesse uma resposta sua.

marcelome@@@@to@artemagnetica.com.br
Flavia, Estava procurando como deixar automatico alguns jobs e tinha me esquecido da crontab , valeu pela dica

Luciano Antony@@@@matica@lucianoantony.com.br
Excelente Tutorial.
Meus parabens.
Abraços

Noel Reis@@@@eis@gigantesdobrasil.com.br
Flávia do ano fico com olho roxo por não lembrar datas importantes como aniversário da minha esposa, aniversário de casamento etc. (rs) como faço para ser lembrado com 3 dias de antecedência. Valei-me Santa Flávia
  o Esquecer o aniversário da mulher? Fala sério hein Noel!!!! Até eu no lugar dela te deixaria um olho roxo, vc merece!..rs
Bom, o ideal neste caso seria utilizar a função DATE_SUB do Mysql, onde: Ao pegar a data atual, que está na variável $date, na query você poderia montar algo como: select DATE_SUB(curdate(), INTERVAL 3 DAY) (este é um exemplo, precisa adaptar da forma que você precisa.)

O resultado da select será 3 dias antes da data, e o resto fica igual, pois uma vez que chegar na data, enviará o email (pra você com um aviso, ou pra pessoa antecipadamente, vc que decide)
Abração
Postado por Flavinha em 03/03/2009

Beto@@@@to@gmail.com
ah, esqueci de dizer: se for possível, poderia publicar mais materiais sobre scripts que usam o cron? brigadão

Beto@@@@to@gmail.com
Flavia, gostei demais desse tutorial. Sempre apanhei do crontab, por não saber nada de linux nem de sistemas dessa plataforma. nem sabia que dava para agendar um evento através do cpanel da hospedagem e hoje vi que dava, gostei demais mesmo. prabéns!

Micael@@@@erra.com.br
vi que o Marcelo respondeu o que eu ia responder agora, ainda bem que nao postei.
prefiro deixar toda responsabilidade no banco, até para evitar estouro de memória no banco.
achei mto boa a parte do crontab também :)

Marcelo Sabadini@@@@losabadini@gmail.com
Eu ja faria de outra forma: SELECT campos, importantes, neste, caso FROM $tabela WHERE MONTH(dataniver) = $mesatual AND DAY(dataniver) = $diaatual Ou seja, ja que estamos executando uma query, pegamos apenas os registros necessários. E removeria o IF de dentro do loop. Mas a parte da Crontab achei muito importante. Abraços!
  o Cada um faz como prefere :)
O intuito aqui é ajudar quem não consegue fazer. Abraços.
Postado por Flavinha em 20/02/2009

Micael@@@@erra.com.br
Flavia, desculpe, mas nao entendi por que voce comparou a data por > e não com =. Não seria melhor comparar com igual e evitar trazer tantos registros desnecessários do banco e depois ter que comparar no php? Eu faria assim: $aniversario = mysql_query("SELECT * FROM $tabela WHERE dataniver = '$date'"); while ($row = mysql_fetch_array($aniversario)) { mail ($row['email'],"Feliz aniversário","Parabéns pelo seu dia!"); }
Abraços

  o Resposta: É simples. o retorno de date é 2009-02-17 (o dia de hoje, por exemplo). Sendo assim, JAMAIS teremos um aniversariante nessa data...rsrs afinal de contas quem nasceu agora em 2009 ainda nçao sabe ler. Por isso as duas comparações.
Abraços!
Postado por Flavinha em 17/02/2009

Airton@@@@operairton@yahoo.com.br
Flavia, se vc soubesse a quanto tempo eu estava atras de algo assim! valeu de verdade!

Se este artigo lhe foi útil, comente você também
Nome:
Email:
Comentario:
 

Seu comentário será moderado. Comentários com ofensas ou palavrões serão sumariamente deletados.

 
 
 

Ultimos Artigos

 16/02/2009
EXCLUSIVO - PHP: Enviando emails agendados com Crontab

 16/07/2008
OutroLado/WebInsider - Carreira: Autônomos e freelancers em TI

 07/07/2008
Revista PHP - PHP: Formatando saída de dados direto na query sql - MySQL

 30/06/2008
Revista PHP - PHP: Funções: Aprenda a criar as suas

 26/06/2008
Revista PHP - PHP: Truques com .htaccess - Parte III

 23/06/2008
Revista PHP - PHP: Conexões TCP/IP com fsockopen

 19/06/2008
Revista PHP - PHP: Truques com .htaccess - Parte II

 11/06/2008
Revista PHP - PHP: Truques com .htaccess - Parte I


Ver todos


Feeds Delicious Google Bookmarks
side
Try
Try one of my demo systems
SistMAD
side
side
  google friends

side
PagSeguro
 
 


www.flaviajobs.com.br - 2009 Version - 6 Years!
CSS Valido    XHTML VALIDO     FIREFOX!   PHP   Mysql   Apache