Introdução

PHPMailer é uma biblioteca para envio de emails escrita em PHP, que possui uma implementação do protocolo SMTP, o que a torna independente de plataforma. Com ela, a partir de uma API de alto nível podemos enviar e-mails para mais de uma conta ao mesmo tempo, copiar mensagens para outras conta, CC, ou separar as mensagens em cópia, BCC.

PHPMailer

Além disso, essa biblioteca também suporta o envio de mensagens em HTML/TXT, disponibilizando ainda um modo no qual a mensagem possui mais de uma versão, em ambos os formatos, para clientes que não suportam HTML.

Uma outra vantagem dessa biblioteca é o suporte a múltiplos mecanismos autenticação SMTP, como LOGIN, PLAIN, NTLM, CRAM-MD5 e o XOAUTH2 da Google por SSL ou TLS. Com ele também é possível usar assinatura DKIM e S/MIME.

Todas essas funcionalidades estão disponíveis para projetos que utilizem o PHP 5.0 ou superior.

Neste conteúdo veremos como enviar emails com o PHPMailer através do SMTP do Gmail, smtp.gmail.com.

Ir para o código

Download e Instalação

A instalação do PHPMailer pode ocorrer de duas formas: pelo Composer ou realizando o download do código fonte compactado na página oficial do projeto no GitHub.

Passo 1: Ir para a página do projeto Passo 2: Ou instalar via composer Passo 3: Incluir o arquivo PHPMailerAutoload.php
#PraCegoVer - Transcrição dos Slides Agora é só criar um objeto do tipo PHPMailer - $mail = new \PHPMailer();

Configurar os dados de Acesso ao servidor de envio de e-mails. Nós utilizamos o smtp.gmail.com
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = 'mailcurso702@gmail.com';
$mail->Password = '';

Configurar as contas para as quais você deseja enviar a mensagem
$mail->setFrom('mailcurso702@gmail.com', 'Meu Nome');
$mail->addReplyTo('replyto@meusite.com', 'Meu Nome');
$mail->addAddress('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->addCC('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->addBCC('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->Subject = 'Envio de email';

Também o que você deseja enviar na mensagem, como HTML, texto e anexos...
$mail-> Charset = 'UTF-8';
$mail-> msgHTML("< p >Mensagem de < b >boas-vindas< /b >!< /p >");
$mail-> AltBody = 'Mensagem de boas-vindas');
$mail->addAttachment(_DIR_ .'/logo-devmedia.png');

Por fim, basta chamar a função send(), que realiza o envio do e-mail
if (!$mail -> send()){
die ("Erro no envio do e-mail: {$mail -> ErrorInfo}");
}echo 'Mensagem enviada com sucesso';

Para instalar via Composer, adicione a linha "phpmailer/phpmailer": "~5.2" ao seu composer.json e então utilize o comando abaixo:

composer require phpmailer/phpmailer

Se ainda não possui familiaridade com o composer, recomendamos o curso O que é Composer.

Também é possível descompactar os arquivos da biblioteca no seu projeto, após realizar o download.

Enviando emails

Após ter a biblioteca inserida no projeto, devemos incluir o autoloader do PHPMailer para ter acesso às suas classes e funções. Logo em seguida, devido à sua API de alto nível, podemos realizar algumas configurações, usando para isso uma instância da classe PHPMailer e então chamar a função send() para disparar a mensagem através de um servidor de envio.

Passo 1: Instanciar um PHPMailer Passo 2: Configurar com os dados do servidor Passo 3: Informar os destinatários Passo 4: Incluir conteúdo na mensagem, inclusive anexos Passo 5: Enviar o e-mail com send()
#PraCegoVer - Transcrição dos Slides Agora é só criar um objeto do tipo PHPMailer - $mail = new \PHPMailer();

Configurar os dados de Acesso ao servidor de envio de e-mails. Nós utilizamos o smtp.gmail.com
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = 'mailcurso702@gmail.com';
$mail->Password = '';

Configurar as contas para as quais você deseja enviar a mensagem
$mail->setFrom('mailcurso702@gmail.com', 'Meu Nome');
$mail->addReplyTo('replyto@meusite.com', 'Meu Nome');
$mail->addAddress('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->addCC('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->addBCC('samuel-vicente-moraes@outlook.com', 'Moraes');
$mail->Subject = 'Envio de email';

Também o que você deseja enviar na mensagem, como HTML, texto e anexos...
$mail-> Charset = 'UTF-8';
$mail-> msgHTML("< p >Mensagem de < b >boas-vindas< /b >!< /p >");
$mail-> AltBody = 'Mensagem de boas-vindas');
$mail->addAttachment(_DIR_ .'/logo-devmedia.png');

Por fim, basta chamar a função send(), que realiza o envio do e-mail
if (!$mail -> send()){
die ("Erro no envio do e-mail: {$mail -> ErrorInfo}");
}echo 'Mensagem enviada com sucesso';

Um exemplo completo desse código pode ser visto a seguir.


   include_once __DIR__ . '/phpmailer/PHPMailerAutoload.php';
   
   $mail = new \PHPMailer();
   $mail->isSMTP();
   $mail->Host = 'smtp.gmail.com';
   $mail->Port = 587;
   $mail->SMTPSecure = 'tls';
   $mail->SMTPAuth = true;
   $mail->Username = 'mailcurso702@gmail.com';
   $mail->Password = '';
   $mail->setFrom('mailcurso702@gmail.com', 'Meu Nome');
   $mail->addReplyTo('replyto@meusite.com', 'Meu Nome');
   $mail->addAddress('samuel-vicente-moraes@outlook.com', 'Moraes');
   $mail->addCC('samuel-vicente-moraes@outlook.com', 'Moraes');
   $mail->addBCC('samuel-vicente-moraes@outlook.com', 'Moraes');
   $mail->Subject = 'Envio de email';
   $mail->CharSet = 'UTF-8';
   $mail->msgHTML("<p>Mensagem de <b>boas-vindas</b>!</p>");
   $mail->AltBody = 'Mensagem de boas-vindas';
   $mail->addAttachment(__DIR__ . '/logo-devmedia.png');
   
   if (!$mail->send()) {
             die("Erro no envio do e-mail: {$mail->ErrorInfo}");
   }
   
   echo 'Mensagem enviada com sucesso';

Configurando o servidor de envio

As informações de acesso ao servidor de envio podem mudar de acordo com o serviço escolhido. No exemplo acima estamos disparando a mensagem pelo servidor do Gmail, saiba mais sobre os passos necessários para autenticação.

Esta documentação nos orienta utilizar $mail->isSMTP(), pois usaremos autenticação SMTP; $mail->Host, para que a autenticação seja feita no servidor SMTP do Gmail; $mail->Port, como porta; e $mail->SMTPSecure como protocolo de autenticação, além de $mail->SMTPAuth, visto que nós solicitaremos a autenticação por usuário e senha, definidos com $mail->Username e $mail->Password.

Inserindo endereços de envio e recebimento

Com a função $mail->setFrom() definimos o e-mail de origem da mensagem. Essa função recebe um segundo argumento opcional com o nome da pessoa ou entidade que está enviando o e-mail.

Em alguns casos, exibir o e-mail de origem não é necessário, ou desejamos que as respostas caiam em uma conta diferente da utilizada para enviar a mensagem. Para isso podemos usar a função $mail->addReplyTo(), para a qual informamos a conta que receberá as respostas.

O destinatário é definido na função $mail->addAddress(), que pode ser chamada tantas vezes quanto forem necessárias para incluir todos os destinatários na mensagem.

Título e corpo da mensagem

A propriedade $mail->Subject recebe o título do e-mail a ser enviado. A mensagem incluída neste e-mail pode ser informada como String para o método $mail->msgHTML(), que também pode receber a localização de um arquivo HTML como parâmetro, e ainda um texto opcional pode ser usado para clientes sem suporte a HTML, através da propriedade $mail->AltBody.

Caso a mensagem enviada apresente problemas com a exibição de alguns caracteres, podemos usar a propriedade $mail->CharSet para determinar codificação mais adequada. Neste caso utilizamos UTF-8.

Cópia e cópia oculta

Além da função $mail->addAddress(), também podemos utilizar $mail->addCC(), para adicionar uma pessoa em cópia, ou $mail->addBCC(), para incluir um endereço que não terá conhecimento dos demais incluídos na mensagem.

Anexando arquivos

PHPMailer também suporta o envio de anexos de diferentes tipos. Para demonstrar essa funcionalidade, neste exemplo incluímos uma imagem contendo o logotipo da empresa. Isso pode ser realizado com a função $mail->addAttachment(), que recebe como parâmetro a localização do arquivo.

Depuração

Apesar da API de alto nível do PHPMailer, que resolve boa parte dos problemas, algumas vezes precisamos testar as configurações, até que tudo esteja de acordo com o exigido pelo servidor de envio. Para auxiliar o programação nesse processo podemos habilitar o modo de depuração que, quando ativo, oferece mensagens adicionar sobre cada passo em segundo plano pela biblioteca.

Para isso utilizamos a propriedade $mail->SMTPDebug, que recebe valores de 0 a 3, de acordo com o nível de profundidade que desejamos depurar. Quanto mais alto o valor, mais detalhada será a mensagem de retorno.