Alisson Machado
16 June 2016

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:
yum -y install epel-release
Uma vez adicionado o repositório EPEL, pode-se instalar o PHPMailer, para isso execute a instrução abaixo:
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:
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:
service httpd restart
Segue abaixo o script completo:

Agora explicando o que fazem essas linhas de código. Na linha:
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:
$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.
$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:
$nome = $_POST['nome'];
A linha abaixo define que o email será enviado por SMTP:
$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.
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
Uma vez definidos os parâmetros acima é necessário especificar que o envio SMTP será autenticado:
$mail->SMTPAuth = true;
E utilizará a criptografia TLS:
$mail->SMTPSecure = "tls";
Agora você precisa informar os seus dados para logar no gmail:
$mail->Username = "SEU_EMAIL@gmail.com";
$mail->Password = "SUA_SENHA";
A linha abaixo define o campo FROM do seu email:
$mail->SetFrom("SEU_EMAIL",$nome);
Assunto:
$mail->Subject = $assunto;
Corpo do email:
$mail->Body = $msg;
A linha abaixo define o campo TO, ou seja, para quem será enviado o email:
$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:
$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:
if( ! $mail->Send() ){
	echo "Erro! ".$mail->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:
echo "Erro! ".$mail->ErrorInfo;
Caso seja enviado com sucesso, será mostrando na tela que a mensagem foi enviada.
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.

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:
yum -y install php-gd
service httpd restart
Feito isso o script já estará funcionando. Agora explicando o script acima.
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:
   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.

Agora dentro da função captcha, é gerada uma imagem nas seguintes linhas:
        $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.
$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:
$_SESSION["palavra"] = $palavra;
Agora que a palavra do captcha já foi armazenada em sessão, é necessário gerar a imagem:
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:
        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:
$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:
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