segunda-feira, 6 de janeiro de 2014

Envio de e-mail automático parabenizando seus clientes, fornecedores. Solução totalmente Free



Envio automático de e-mail, agendado via CRON.

Olá o objetivo desta postagem surgiu de uma necessidade que chegou até mim da minha diretoria, onde os mesmos gostariam que fosse criado uma ferramenta para "Parabenizar" os fornecedores, parceiros.

E que não dependesse de nenhum funcionário para tal missão de ficar enviando e-mails de Feliz Aniversário ou algo do tipo.

Procurando na Internet achei alguns exemplo, mas nada fosse tão objetivo ou de fácil entendimento. Então resolvi postar uma solução com ferramentas totalmente Free que acabei por desenvolver com a ajuda de alguns amigos (Agradecimentos, Carlos Cesário, Antonio Luis e Gustavo Vieira).

Indicado para o use de,

Envio de e-mail automático parabenizando os seus fornecedores, parceiros, clientes, amigos.
Também pode ser utilizado como uma forma de cobrança ou algo do tipo.

Cenário.: Servidor Debian 6.0 - Squeeze (Serve qualquer outra distribuição)
E-mail.: Utilizado uma conta do Gmail para exemplo, porém no caso em produção utilizamos o domínio da empresa.

Neste LINK tem um tutorial de como criar uma maquina virtual que no caso é mesma que utilizo para fazer a hospedagem do serviço.

Estou utilizando o seguinte repositório "source.list" para baixar os pacotes,

root@SrvWeb-TST:/# cat /etc/apt/sources.list
#Repositorio colocado em 30/12/2013 as 08:30 por Fernando Verga

deb http://ftp.debian.org/debian squeeze main

Será necessário estar instalado no Debian os seguintes pacotes,

php5-mysql
ssmtp

Após instalado e configura o MySQL temos que criar uma Base de Dados e uma Tabela.

Primeiramente vamos logar no MySQL.

root@SrvWeb-TST:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.1.49-3 (Debian)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

No comando abaixo iremos criar a Database.

mysql> create database aniversariantes;


Exibindo o banco de dados que acabamos de criar.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aniversariantes         |
| mysql                      |
+--------------------+
3 rows in set (0.00 sec)

Usando Database Aniversariante

mysql> use aniversariantes;
Database changed


Script para a criação da Tabela

    CREATE TABLE aniversarios(
    id int(11) AUTO_INCREMENT,
    nome varchar(255) NOT NULL,
    email varchar(255) NOT NULL,
    dataniver date,
    PRIMARY KEY (id)
);

Exibindo tabela criada.

mysql> show tables;
+---------------------------+
| Tables_in_aniversariantes |
+---------------------------+
| aniversarios              |
+---------------------------+
1 row in set (0.00 sec)

Neste ponto, nossa base de dados já está criada e a tabela também está criada. Agora precisamos inserir dados para que possamos começar a utilizar e enviar os e-mails.

Abaixo um pequeno exemplo de insert, porém pode-se montar um script no layout aceito pelo MySQL e inserir de uma unica vez ou mesmo customizar uma pagina Web para realizar um cadastro direto na base, ai vai da imaginação de cada.

insert aniversarios(id,nome,email,dataniver) values("1","Fernando Verga","fernandoverga@gmail.com","1987-04-22");

insert aniversarios(id,nome,email,dataniver) values("2","Antonio Carlos Santos Coelho","toni.coelho@outlook.com","1972-11-04");

insert aniversarios(id,nome,email,dataniver) values("3","Fernando Ribeiro de Sousa","nando.deskter@gmail.com","1983-12-30");

Agora para visualizar os dados inseridos vamos fazer uma SELECT.

mysql> select * from aniversarios;
+----+------------------------------+------------------------------+------------+
| id | nome                         | email                        | dataniver  |
+----+------------------------------+------------------------------+------------+
|  1 | Fernando Verga               | fernandoverga@gmail.com      | 1987-04-22 |
|  2 | Antonio Carlos Santos Coelho | toni.coelho@outlook.com      | 1972-11-04 |
|  3 | Fernando Ribeiro de Sousa    | fernandoverga@unialco.com.br | 1987-01-06 |
|  4 | Fernando Henrique Verga      | fernandoverga@gmail.com      | 1987-01-06 |
|  5 | Fulano de Tal da Silva Ta       | fernandoverga@unialco.com.br | 1987-01-06 |
+----+------------------------------+------------------------------+------------+
5 rows in set (0.00 sec)

Pronto, temos uma pequena Base e já podemos iniciar a construção do Script que enviará as mensagens.

Observem que temos a informação do Nome, E-mail e Data do Aniversário. Bem simples... porém poderia ser data de cobrança ou mesmo data de rematricula ou algo assim, da para se adaptar de várias maneiras.

No meu caso utilizei o diretório /var/www para armazenar o script e dei o nome de enviaemailaniversarios.php

para criar, basta dar o comando vim enviaemailaniversarios.php

Abaixo irei colocar o script padrão com as devidas explicações e no final colocarei o script que utilizo em Produção customizado e funcional para a minha situação

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

#!/usr/local/bin/php -q
<?
// dados comuns de conexão
$host = "localhost";
$usuario = "root";
$senha = "senha";
$base = "aniversariantes";
$tabela = "aniversarios";

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($aniversarios)) {
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 Linux). 

Nele podemos agendar uma tarefa para ser executada de tempos em tempos.

digite:

# crontab -e

E adicione as seguintes linhas no arquivo:

* * * * * php5 /var/www/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 absoluto do arquivo php.

Observação,

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.

Segue o Script utilizado por mim em produção.

#!/usr/bin/php -q
<?

// dados comuns de conexao

$host = "localhost";
$usuario = "root";
$senha = "*********";
$base = "aniversariantes";
$tabela = "aniversarios";

//Pegamos entao a data atual do sistema e quebramos o dia e mes separando-os atraves explode na variál $date.

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

// efetuando a conexao

$con = mysql_connect($host, $usuario, $senha);
mysql_select_db($base);

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

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

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

while ($row = mysql_fetch_array($aniversario)) {
list($ano, $mes, $dia) = explode('-', $row[3]);
if ($mesatual == $mes) {
if ($diaatual == $dia) {
$NomeTitulo = "Parabéns ".$row['nome'];
$Assunto = "Parabéns ".$row['nome'].", viemos através deste singelo e-mail lhe desejar um Feliz Aniversario. \n \n Estes são os votos da Diretoria do Grupo Empresa. \n \n Atenciosamente Diretoria Empresa.";
mail ($row['email'],$NomeTitulo,$Assunto);
}
}
}
?>

Para salvar basta pressionar "Esc" :x

Já está funcionando? Não...

Agora, vamos configurar o SSMTP para passar as conexões de Envio de e-mail.

Neste caso utilizei um e-mail do GMAIL para configurar porém pode ser qualquer domínio de e-mail.

Para isso basta editar o arquivo ssmtp.conf que fica em /etc/ssmtp/ssmtp.conf

root=itbioenergia@gmail.com
mailhub=smtp.gmail.com:587
RewriteDomain=gmail.com
hostname=gmail.com
AuthUser=itbioenergia
AuthPass=senha
UseSTARTTLS=YES

Para salvar basta pressionar "Esc" :x

Agora para agendarmos e fazermos um teste vamos editar a crontab com o comando "crontab -e"

No exemplo abaixo ele mandará o e-mail de 1 em 1 minuto, porém é apenas para teste e depois é só parametrizar o tempo que enviará o e-mail.

empresa@SrvWeb-TST:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
* * * * * php5 /var/www/enviaemailaniversarios.php

Para salvar os dados da Cron, basta pressionar "Ctrl + X" depois Y e Enter;

Após a CRON estar ativa e claro que para teste simulei que a pessoa abaixo faz aniversário na data de hoje no caso a data do teste, por isso ela recebeu o e-mail.


Lembrando que é uma solução totalmente FREE e pode ser implementado em sua empresa sem nenhuma burocracia, e pode ser utilizado para diversas finalidades não só para mandar um Feliz Aniversário para seus Fornecedores ou Funcionários e sim para diversas ocasiões.

Espere que tenha sido útil e claro esta postagem e qualquer duvida entrar em contato através dos comentários.


8 comentários:

  1. Opa...
    Dica bastante útil, vou utiliza-la em meus servidores.

    Obrigado!

    ResponderExcluir
  2. Meu diretor sulicitou isto ha alguns dias e me lembrei de sua publicação. Muito obrigado.

    ResponderExcluir
    Respostas
    1. Olá Eduardo, conseguiu implementar? Obrigado pelo feedback.

      Excluir
  3. Muito bom parabéns!!!
    tem como enviar imagem no lugar de texto?

    ResponderExcluir
  4. Silvio, acredito que seja possível sim.. pois só preciso saber como quer upar a imagem digo, utilizará imagem da própria maquina ou da nuvem?

    Att Fernando Verga

    ResponderExcluir
  5. Olá,
    Para implementar este sistema é necessário que a maquina (computador) esteja sempre ligada para que seja possível correr o script certo?
    Por exemplo se caso o meu cliente faça anos num domingo e o PC esteja desligado porque a empresa fecha, ele enviará o e-mail na mesma?

    Grande abraço,
    Obrigado

    ResponderExcluir
  6. Nelson, desculpe a demora.... Sim o PC ou Servidor, necessita estar ligado. Tem opções em Cloud da Amazon por exemplo, que é gratuito, se quiser maiores detalhes me mande um e-mail fhverga@gmail.com

    ResponderExcluir