Blog de Notícias

Email autenticado com o PHPMailer

Email autenticado com o PHPMailer

Email autenticado com o 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:

1.       require 'mailer/PHPMailerAutoload.php';

2.       

3.       if (isset($_POST['assunto']) && !empty($_POST['assunto'])) {

4.                  $assunto = $_POST['assunto'];

5.       }

6.       if (isset($_POST['mensagem']) && !empty($_POST['mensagem'])) {

7.                  $mensagem = $_POST['mensagem'];

8.       }

9.       

10.    $mail = new PHPMailer;

11.    

12.    $mail->isSMTP();

13.    $mail->Host = 'smtp.gmail.com';

14.    $mail->SMTPAuth = true;

15.    $mail->SMTPSecure = 'tls';

16.    $mail->Username = 'exemplo@gmail.com';

17.    $mail->Password = 'senha';

18.    $mail->Port = 587;

19.    

20.    $mail->setFrom('email@gmail.com', 'Contato');

21.    $mail->addAddress('email@mail.com.br');

22.    

23.    $mail->isHTML(true);

24.    

25.    $mail->Subject = $assunto;

26.    $mail->Body    = nl2br($mensagem);

27.    $mail->AltBody = nl2br(strip_tags($mensagem));

28.    

29.    if(!$mail->send()) {

30.        echo 'Não foi possível enviar a mensagem.<br>';

31.        echo 'Erro: ' . $mail->ErrorInfo;

32.    } else {

33.         header('Location: index.php?enviado');

34.    }

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.