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