PHP: Envio de e-mail autenticado utilizando o PHPMailer

Nesta documentação você aprenderá a utilizar a biblioteca PHPMailer, com ela, você pode realizar envios de emails autenticados com o protocolo SMTP.

É muito comum que uma aplicação web necessite enviar e-mails. Podemos observar essa necessidade na criação de uma página de cadastro, na qual precisamos solicitar a confirmação e permitir a recuperação da senha, tarefas concluídas através de correio eletrônico, na maioria dos casos. Embora trivial essa implementação pode exigir do programador conhecimentos sobre o protocolo e servidor utilizados.

Email autenticado com o PHPMailer

Apesar do PHP possuir uma função nativa para o envio de e-mails, novas soluções têm sido adotadas pelos programadores por oferecerem um nível mais alto de abstração e serem independentes de plataformas. Neste documento falaremos sobre uma dessas soluções, a biblioteca PHPMailer.

Tópicos

Introdução
Enviando e-mails
Depurando o envio
Exemplo prático

Introdução ao PHPMailer

PHPMailer é uma biblioteca de código aberto para o envio de e-mails com suporte a HTML, diferentes protocolos e níveis de autenticação. Por possuir uma implementação do protocolo SMTP integrada essa biblioteca pode ser utilizada em plataformas que não possuem um servidor para envio de e-mails nativo, como o Windows.

Antes de usarmos as classes da PHPMailer, devemos obter seu código fonte. Isso pode ser feito a partir do repositório oficial no GitHub ou via composer.

Usando o composer precisamos configurar uma dependência no arquivo composer.json, conforme demonstrado abaixo:

"phpmailer/phpmailer": "~5.2"

Ou a partir do comando a seguir:

composer require phpmailer/phpmailer

Alternativamente, podemos através do git clonar o repositório oficial com o seguinte comando:

git clone https://github.com/PHPMailer/PHPMailer.git

Ou ainda baixar todo código fonte em um arquivo que poderá ser descompactado dentro do diretório do projeto:

https://github.com/PHPMailer/PHPMailer/archive/master.zip

Enviando e-mails com o PHPMailer

Veremos a partir daqui como enviar e-mails com o PHPMailer passo a passo.

Para utilizar o PHPMailer precisamos incluir o arquivo PHPMailerAutoload.php, que contém uma implementação da função autoload do PHP, responsável por localizar e carregar as classes utilizadas no código. Fazemos isso com as funções require ou include:

require 'mailer/PHPMailerAutoload.php';

A partir daqui podemos criar uma instância da classe PHPMailer e configurar os dados do envio. Nesta documentação optamos por utilizar o Gmail, conforme podemos ver a seguir, assim informamos para cada parâmetro os valores requeridos por este provedor.

$mail = new PHPMailer(); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->Username = 'exemplo@gmail.com'; $mail->Password = 'senha'; $mail->Port = 587;

Linha 1: Instanciamos a classe PHPMailer;

Linha 3: Informamos que o protocolo utilizado é o SMTP, conforme recomendado pelo Gmail;

Linha 4: Este é o endereço para o servidor de e-mails do Gmail;

Linha 5: Habilitamos a autenticação SMTP;

Linha 6: Definimos a criptografia a ser usada, conforme recomendado pelo Gmail;

Linhas 7 e 8: É preciso informar os dados de uma conta de e-mail ativa para concluir o envio;

Linha 9: Para autenticar via SSL precisamos informar a porta 587, conforme recomendado pelo Gmail.

Também é preciso informar a lista de destinatários e remetentes envolvidos no envio:

$mail->setFrom('remetente@email.com.br'); $mail->addReplyTo('no-reply@email.com.br'); $mail->addAddress('email@email.com.br', ‘Nome’); $mail->addAddress('email@email.com.br', 'Contato'’); $mail->addCC('email@email.com.br', 'Cópia'); $mail->addBCC('email@email.com.br', 'Cópia Oculta')

Linha 1: Definimos o e-mail do remetente;

Linha 2: Informamos um e-mail para o qual serão enviadas as respostas;

Linha 3 e 4: Adicionamos um destinatário. A qualquer momento podemos utilizar um nome opcional após o endereço de e-mail;

Linhas 5 e 6: Informamos os e-mails em cópia e cópia oculta.

Diferentemente da função mail do PHP (php mail), o PHPMailer dá suporte ao HTML, que usaremos para configurar a mensagem que será enviada no corpo do e-mail:

$mail->isHTML(true); $mail->Subject = 'Assunto do email'; $mail->Body = 'Este é o conteúdo da mensagem em <b>HTML!</b>'; $mail->AltBody = 'Para visualizar essa mensagem acesse http://site.com.br/mail'; $mail->addAttachment('/tmp/image.jpg', 'nome.jpg');

Linha 1: Indicamos o uso do HTML;

Linha 2: Damos um título para a mensagem;

Linhas 3: Definimos o conteúdo do e-mail;

Linhas 4: Criamos um texto opcional para clientes que não suportem HTML, ou que tenham esse recurso desativado;

Linha 5: Adicionamos arquivos para serem enviados em anexo.

Neste ponto estamos prontos para disparar o e-mail:

if(!$mail->send()) { echo 'Não foi possível enviar a mensagem.<br>'; echo 'Erro: ' . $mail->ErrorInfo; } else { echo 'Mensagem enviada.'; }

Linhas 1 a 3: Adicionamos uma condição que verifica o retorno da função send, responsável por disparar o e-mail. Informamos o erro que foi retornado pela propriedade $mail->ErrorInfo, se o envio falhar.

Linha 5: Caso a função retorne verdadeiro, é impressa uma mensagem de sucesso.

Depurando o envio

Além dos recursos para verificação de falhas, o PHPMailer disponibiliza um módulo de depuração que pode ser ativado durante a fase de testes do sistema. Para isso, podemos configurar alguns parâmetros a fim de detalharmos as falhas.

A primeira propriedade é a PHPMailer::SMTPDebug, que pode receber quatro valores, conforme a Tabela 1.

Código

Descrição

0

Desativa a depuração, sendo a opção padrão.

1

Exibe mensagens retornadas pelo cliente

2

Exibe mensagens do cliente e servidor

3

Exibe mensagens do cliente, servidor e status da conexão

4

Exibe todas as mensagens, incluindo detalhes da comunicação

Tabela 1. Valores para a propriedade PHPMailer::SMTPDebug

O código a seguir mostra como podemos habilitar a depuração e obter as mensagens em português do Brasil, visto que o PHPMailer oferece suporte a diferentes idiomas.

$mail->SMTPDebug = 3; $mail->Debugoutput = 'html'; $mail->setLanguage('pt');

Linha 1: Informamos o nível de depuração.

Linha 2: Escolhemos como as mensagens serão exibidas.

Linha 3: Definição do idioma.

Nota: É recomendado inserir esse três logo após instanciar a classe PHPMailer.

Exemplo prático

O formulário abaixo é responsável por enviar uma mensagem que será processada pelo script email.php:

<form action="email.php" method="post"> <input type="text" name="assunto" placeholder="Assunto"> <input type="text" name="mensagem" placeholder="Mensagem"> <input type="submit" name="Enviar"> </form>

Esses dados serão utilizados para enviar uma mensagem por e-mail, como mostra o trecho de código a seguir:

require 'mailer/PHPMailerAutoload.php'; if (isset($_POST['assunto']) && !empty($_POST['assunto'])) { $assunto = $_POST['assunto']; } if (isset($_POST['mensagem']) && !empty($_POST['mensagem'])) { $mensagem = $_POST['mensagem']; } $mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->Username = 'exemplo@gmail.com'; $mail->Password = 'senha'; $mail->Port = 587; $mail->setFrom('email@gmail.com', 'Contato'); $mail->addAddress('email@mail.com.br'); $mail->isHTML(true); $mail->Subject = $assunto; $mail->Body = nl2br($mensagem); $mail->AltBody = nl2br(strip_tags($mensagem)); if(!$mail->send()) { echo 'Não foi possível enviar a mensagem.
'; echo 'Erro: ' . $mail->ErrorInfo; } else { header('Location: index.php?enviado'); }

Linha 1: Include do autoload do PHPMailer;

Linhas 3 a 8: Capturamos o valor dos dados enviados no formulário e atribuímos as variáveis $assunto e $mensagem;

Linha 10: Instanciamos a classe PHPMailer para setar seus atributos e utilizar seus métodos;

Linha 12: Definimos o protocolo que será utilizado, nesse caso, o SMTP;

Linha 13: Definimos o endereço para o servidor de e-mails do Gmail;

Linha: 14: Habilitamos a autenticação SMTP;

Linha 15: Definimos a criptografia a ser usada, conforme recomendado pelo Gmail;

Linhas 16 e 17: É preciso informar os dados de uma conta de e-mail ativa para concluir o envio;

Linha 18: Para autenticar via SSL precisamos informar a porta 587, conforme recomendado pelo Gmail;

Linhas 20 e 21: Informamos o e-mail de destinatário e remetente, respectivamente;

Linha 23: Indicamos o uso do HTML no conteúdo do e-mail;

Linha 25: Informamos o assunto para a mensagem;

Linha 26: Definimos o conteúdo do e-mail e aplicamos a função nl2br() para que o conteúdo insira as quebras de linhas adicionadas ao texto;

Linha 27: Criamos um texto opcional para clientes que não suportem HTML, ou que tenham esse recurso desativado. Aplicamos a função nl2br() e a função strip_tags(), que remove os caracteres em HTML.

Linhas 29 a 31: Adicionamos uma condição que verifica o retorno da função send, responsável por disparar o e-mail. Informamos o erro que foi retornado pela propriedade $mail->ErrorInfo, se o envio falhar;

Linha 33: Caso a função retorne verdadeiro, é impressa uma mensagem de sucesso.

Em um exemplo real, os endereços do remetente e destinatário podem ser capturados de uma fonte de dados. Aqui usamos valores fictícios a título de exemplo.

Com isso garantimos o envio do e-mail utilizando o protocolo SMTP.

Artigos relacionados