É 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.

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.