Autenticando PHPMailer e Gmail

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
<!--?php /* Nome do arquivo: enviaemail.php */ include("/usr/share/php/PHPMailer/class.phpmailer.php"); $mail = new PHPMailer(); $mail-&gt;SMTPDebug = 1;
 
$nome = "Alisson Machado";
$assunto = "Testando o envio autenticado por SMTP";
$msg = "Corpo do Email";
 
$mail-&gt; IsSMTP();
$mail-&gt;Host = "smtp.gmail.com";
$mail-&gt;Port = 587;
$mail-&gt;SMTPAuth = true;
$mail-&gt;SMTPSecure = "tls";
$mail-&gt;Username = "SEU_EMAIL@gmail.com";
$mail-&gt;Password = "SUA_SENHA";
$mail-&gt;SetFrom("SEU_EMAIL",$nome);
$mail-&gt;Subject = $assunto;
$mail-&gt;Body = $msg;
$mail-&gt;AddAddress("EMAIL_DE_DESTINO");
 
if(!$mail-&gt;Send()){
	echo "Erro! ".$mail-&gt;ErrorInfo;
}else{
    echo "mensagem enviada &lt;br&gt;";
}
?-->

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-&gt;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-&gt; 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-&gt;Host = "smtp.gmail.com";
$mail-&gt;Port = 587;

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

1
$mail-&gt;SMTPAuth = true;

E utilizará a criptografia TLS:

1
$mail-&gt;SMTPSecure = "tls";

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

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

A linha abaixo define o campo FROM do seu email:

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

Assunto:

1
$mail-&gt;Subject = $assunto;

Corpo do email:

1
$mail-&gt;Body = $msg;

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

1
$mail-&gt;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-&gt;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
6
if( ! $mail-&gt;Send() ){
	echo "Erro! ".$mail-&gt;ErrorInfo;
}else{
    echo "mensagem enviada 
";
}

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-&gt;ErrorInfo;

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

1
2
echo "mensagem enviada 
";

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
<!--?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 &lt;= $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&amp;a=50&amp;tf=20&amp;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 &lt;= $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);
?&gt;

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
session_start();
if ($_POST["palavra"] != $_SESSION["palavra"]){
        echo "

Captcha invalido!

“; 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

3
Deixe um comentário

avatar
2 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Alisson MachadoJunior SouzaAdilson Calixto dos Santos Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Adilson Calixto dos Santos
Visitante
Adilson Calixto dos Santos

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.… Read more »

Junior Souza
Visitante
Junior Souza

Olá, tudo bem? com PHPMailer é possível receber e-mails do gmail também?