Autenticando PHPMailer e Gmail

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×

Para enviar emails através do GMAIL, é necessário realizar a autenticação através do protocolo SMTP.

Para realizar esse processo através do PHP é necessário utilizar a biblioteca PHPMailer.

Ela pode ser baixada pelo próprio repositório do EPEL no CentoOS.

Para ativar o repositório EPEL no CentOS6 é necessário executar o comando abaixo:

1
yum -y install epel-release

Uma vez adicionado o repositório EPEL, pode-se instalar o PHPMailer, para isso execute a instrução abaixo:

1
yum -y install php-PHPMailer

O módulo do php será instalado dentro do diretório /usr/share/php/PHPMailer.

Caso você queria confirmar esse diretório pode-se executar o seguinte comando:

1
rpm -ql php-PHPMailer

E serão listados os arquivos instalados por esse pacote RPM.

Antes de começar a programar a página em PHP é necessário ajudar o time zone do PHP na sua máquina.

Para fazer isso abra o arquivo:

/etc/php.ini

Na linha:

date.timezone

Defina o seguinte valor:

date.timezone = America/Sao_Paulo

Após isso faça um restart no servidor httpd com o comando abaixo:

1
service httpd restart

Segue abaixo o script completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/* Nome do arquivo: enviaemail.php */
include("/usr/share/php/PHPMailer/class.phpmailer.php");
 
$mail = new PHPMailer();
$mail->SMTPDebug = 1;
 
$nome = "Alisson Machado";
$assunto = "Testando o envio autenticado por SMTP";
$msg = "Corpo do Email";
 
$mail-> IsSMTP();
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Username = "SEU_EMAIL@gmail.com";
$mail->Password = "SUA_SENHA";
$mail->SetFrom("SEU_EMAIL",$nome);
$mail->Subject = $assunto;
$mail->Body = $msg;
$mail->AddAddress("EMAIL_DE_DESTINO");
 
if(!$mail->Send()){
	echo "Erro! ".$mail->ErrorInfo;
}else{
    echo "mensagem enviada <br>";
}
?>

Agora explicando o que fazem essas linhas de código.

Na linha:

1
include("/usr/share/php/PHPMailer/class.phpmailer.php");

é feito o include do arquivo do PHPMailer para que possamos fazer a instância do objeto que realizará o envio dos emails.

Uma vez feito o include do PHPMailer, podem ser incluidas as seguintes linhas:

1
2
$mail = new PHPMailer();
$mail->SMTPDebug = 1;

A primeira linha faz a instância do PHPMailer na variável $mail, e a segunda define que o nível do debug será 1, ou seja, se ocorrer algum erro durante o envio de emails ele será exibido na tela.

1
2
3
$nome = "Alisson Machado";
$assunto = "Testando o envio autenticado por SMTP";
$msg = "Corpo do Email";

As linhas acima definem o nome de quem está enviando o email, o assunto e o corpo do email, essas variáveis podem vir via POST de um formulário, podendo ser da seguinte maneira:

1
$nome = $_POST['nome'];

A linha abaixo define que o email será enviado por SMTP:

1
$mail-> IsSMTP();

Nas próximas linhas, são definidos o servidor SMTP que no caso do gmail é smtp.gmail.com.br, a porta de envio que é 587, na porta 587 é feita a autenticação do email e de forma criptografada, garantindo assim a segurança e evitando o envio de spams.

1
2
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;

Uma vez definidos os parâmetros acima é necessário especificar que o envio SMTP será autenticado:

1
$mail->SMTPAuth = true;

E utilizará a criptografia TLS:

1
$mail->SMTPSecure = "tls";

Agora você precisa informar os seus dados para logar no gmail:

1
2
$mail->Username = "SEU_EMAIL@gmail.com";
$mail->Password = "SUA_SENHA";

A linha abaixo define o campo FROM do seu email:

1
$mail->SetFrom("SEU_EMAIL",$nome);

Assunto:

1
$mail->Subject = $assunto;

Corpo do email:

1
$mail->Body = $msg;

A linha abaixo define o campo TO, ou seja, para quem será enviado o email:

1
$mail->AddAddress("EMAIL_DE_DESTINO");

Agora que todos os dados já foram definidos, você pode realizar o envio do email.

O email é enviado com a seguinte instrução:

1
$mail->Send();

Caso você queira saber se o email foi enviado ou não, pode ser feita uma condição para validar o envio conforme o exemplo abaixo:

1
2
3
4
5
if( ! $mail->Send() ){
	echo "Erro! ".$mail->ErrorInfo;
}else{
    echo "mensagem enviada <br>";
}

Então se o email Não for enviado, você pode verificar isso na condição acima que possui um ! ( exclamação ) na frente da instrução que envia o email, então caso ele não seja enviado será informada a mensagem de erro conforme a linha:

1
echo "Erro! ".$mail->ErrorInfo;

Caso seja enviado com sucesso, será mostrando na tela que a mensagem foi enviada.

1
echo "mensagem enviada <br>";

Caso o Gmail aponte algum erro de permissão, você precisará liberar a sua conta no gmail para o uso de aplicativos, para fazer isso é só ativar no seguinte link:

https://www.google.com/settings/u/0/security/lesssecureapps

Configurando o Captcha.

O script abaixo faz a criação da imagem com o captcha.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
   session_start();
   header("Content-type: image/jpeg");
 
    function captcha($largura,$altura,$tamanho_fonte,$quantidade_letras){
        $imagem = imagecreate($largura,$altura);
        $fonte = "./arial.ttf";
        $preto  = imagecolorallocate($imagem,0,0,0);
        $branco = imagecolorallocate($imagem,255,255,255);
        $palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras)); 
        $_SESSION["palavra"] = $palavra; // atribui para a sessao a palavra gerada
        for($i = 1; $i <= $quantidade_letras; $i++){ 
            imagettftext($imagem,$tamanho_fonte,rand(-25,25),($tamanho_fonte*$i),($tamanho_fonte + 10),$branco,$fonte,substr($palavra,($i-1),1));
        }
        imagejpeg($imagem);
        imagedestroy($imagem);
    }
 
    $largura = $_GET["l"];
    $altura = $_GET["a"];
    $tamanho_fonte = $_GET["tf"];
    $quantidade_letras = $_GET["ql"];
    captcha($largura,$altura,$tamanho_fonte,$quantidade_letras);
?>

No script é feita a geração de uma imagem através do PHP, para que isso seja possível é necessário instalar a biblioteca php-gd, para fazer isso no CentOS 6, é necessário executar o seguinte comando:

1
2
yum -y install php-gd
service httpd restart

Feito isso o script já estará funcionando.

Agora explicando o script acima.

1
session_start();

A linha acima, faz com que o PHP inicie uma sessão, ou seja os dados são gravados na memória e compartilhados entre as páginas, utilizamos ela, pois o captcha será gerado em uma página, porém a validação dele será em outra página.

Feito isso, foi necessário definir o header da página como:

1
   header("Content-type: image/jpeg");

Isso faz com que o navegador entenda que o que é retornado do servidor é uma imagem JPEG, que será o catpcha.

Após isso, foi criada uma função que faz a geração da imagem, ela recebe como parâmetro altura, largura, fonte e quantidade de letras.

Essas valores são passados pelo form_email.php que está no mesmo diretório.

1
<img src="captcha.php?l=150&a=50&tf=20&ql=5">

Agora dentro da função captcha, é gerada uma imagem nas seguintes linhas:

1
2
3
4
        $imagem = imagecreate($largura,$altura); // define o tamanho da imagem
        $fonte = "./arial.ttf"; // define a fonte que será usada
        $preto  = imagecolorallocate($imagem,0,0,0); // define a cor do fundo
        $branco = imagecolorallocate($imagem,255,255,255); // define a cor das letras

Os comentários na frente das linhas explicam o que faz cada uma das variáveis e funções.

1
$palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras));

A linha acima, usa a função str_shuffle do php para embaralhar todas as letras do alfabeto, maiúsculas e minusculas e junto com os numeros e armazena o resultado na variável $palavra.

Uma vez gerada a palavra resultante ela é armazenada em uma variável de sessão conforme a linha abaixo:

1
$_SESSION["palavra"] = $palavra;

Agora que a palavra do captcha já foi armazenada em sessão, é necessário gerar a imagem:

1
2
3
for($i = 1; $i <= $quantidade_letras; $i++){ 
            imagettftext($imagem,$tamanho_fonte,rand(-25,25),($tamanho_fonte*$i),($tamanho_fonte + 10),$branco,$fonte,substr($palavra,($i-1),1));
        }

A linha acima gera uma imagem para cada palavra resultante e embaralha ela na imagem com o fundo preto gerada logo no inicio da página.

Após essa rotina, a imagem é gerada com o JPEG e depois destruída para não ocupar a memória da máquina, conforme as instruções abaixo:

1
2
        imagejpeg($imagem);
        imagedestroy($imagem);

No final do script são recebidos os parâmetros do form_email.php e enviados para a função quera o captcha:

1
2
3
4
5
6
$largura = $_GET["l"];
    $altura = $_GET["a"];
    $tamanho_fonte = $_GET["tf"];
    $quantidade_letras = $_GET["ql"];
    captcha($largura,$altura,$tamanho_fonte,$quantidade_letras);
?>

Agora que já temos a parte de geração de captcha pronta, é necessário fazer a validação dele no envia_email.php.

Então para isso, foram adicionadas as linhas abaixo logo no inicio do arquivo:

1
2
3
4
5
session_start();
if ($_POST["palavra"] != $_SESSION["palavra"]){
        echo "<h1>Captcha invalido!</h1>";
	die();
    }

Essa linha pega o conteudo digitado no formulário do form_email.php, que foi digitado pelo usuário e compara com o valor armazenado na sessão, caso eles sejam diferentes, será informada a mensagem Catpcha inválido e como logo abaixo tem a instrução die(), a conexão é morta nesse ponto, impedindo assim que o email seja enviado.

Contatos:
Website: http://responsus.com.br
Email: alisson.machado@responsus.com.br
Cargo: Analista de Sistemas DevOps

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×
1 ano ago

1 Comment

  1. Bom dia amigão,

    Gostaria de obter sua ajuda na solução de um problema com o PHPMailer,
    pois tenho um site com um formulário de contato onde o visitante vai me enviar
    um email com uma mensagem. O único problema é que na hora que testo o envio de
    email no campo email coloco outro email simulando um visitante. Na minha
    caixa de entrada vem aparecendo meu email de login do smtp do google, e, não
    o email que foi digitado no formulário de contatos, assim como o nome também
    não vem o do suposto visitante e sim o meu nome. Como poderia resolver esse
    impasse. Eu teria que utilizar outros comandos da mesma classe ou exite outra
    classe para esse tipo de atividade.

    att

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *