Quando se trata de adicionar funcionalidade de email ao seu aplicativo PHP, a classe PHPMailer é a opção vencedora.
Neste artigo, descreverei o processo de instalação do PHPMailer, configuração de definições SMTP e adição da funcionalidade de envio de emails ao seu aplicativo passo a passo.
Para ir direto à ação, clique aqui.
Os trechos de código que forneço neste artigo são para o PHPMailer 6.9, que é compatível com PHP 5.5 e superior.
O que é o PHPMailer?
PHPMailer é a biblioteca open-source clássica de envio de emails para PHP. É compatível com a maioria dos frameworks PHP, como Laravel e Symfony e é usado por muitos projetos open-source como WordPress. Ele também suporta várias maneiras de enviar mensagens de email, incluindo a mais confiável, envio direto para servidores SMTP, e a função PHP mail()
, Sendmail
e qmail
.
Algumas das funcionalidades mais importantes do PHPMailer incluem:
- Autenticação SMTP
- Validação de endereços de email automática
- Proteção contra ataques de injeção de cabeçalho
- Suporte aos protocolos TLS e SSL
- Suporte à assinatura DKIM e S/MIME
- Suporte para imagens incorporadas
- Suporte para adicionar anexos, incluindo inline
- Vários formatos, anexos de string e binários
- Emails multipart/alternative para provedores que não leem emails HTML
- Suporte para envio de emails com vários endereços To, CC, BCC e Reply-to
Como instalar o PHPMailer
Para instalar o PHPMailer, você precisará do Composer, um gerenciador de dependências para PHP, recomendado pelos criadores do PHPMailer no GitHub.
Uma vez instalado, adicione esta linha ao seu ficheiro composer.json:
Ou execute o seguinte comando:
Nota:
- A pasta vendor e o script vendor/autoload.php não fazem parte do PHPMailer. Em vez disso, são gerados pelo Composer.
Se você não é fã do Composer, pode baixar os ficheiros do PHPMailer com o código-fonte manualmente e copiar o conteúdo da pasta para um diretório include_path especificado em sua configuração PHP e carregar cada ficheiro de classe manualmente, assim:
Adicionar uma classe de Exceção ajudará você a lidar com erros e depurá-los. Em PHP, funciona de maneira semelhante a outras linguagens de programação. Então, sem ela, se houver um erro no seu código de envio de email, você verá apenas uma mensagem dizendo que a classe Exceção não foi encontrada, mas não receberá detalhes sobre como depurá-lo.
Você também pode instalar o PHPMailer apenas com os ficheiros vitais. Os ficheiros PHP principais a serem incluídos são src/PHPmailer.php e src/SMTP.php se você estiver usando SMTP. Você também precisará de src/OAuth.php se estiver usando XOAUTH2 e das dependências para os serviços com os quais deseja autenticar. E você pode ignorar a pasta de idiomas se estiver ok com erros apenas em inglês.
Para mais informações sobre a instalação do PHPMailer, você pode verificar o manual de instalação oficial.
Configurações SMTP do PHPMailer
Enviar emails com o PHPMailer é mais otimizado quando emparelhado com um servidor SMTP externo. Isso o torna confiável e seguro, pois pode ser criptografado (TLS/SSL), tornando-o uma escolha ideal para sua aplicação PHP.
Confira a configuração do SMTP básica no exemplo abaixo:
Uma vez que você tenha seus detalhes e credenciais SMTP, tudo o que você precisa fazer é substituir os espaços reservados neste código por eles, o que mostrarei como fazer no capítulo seguinte.
Como enviar emails usando PHPMailer e SMTP
Para enviar emails usando o PHPMailer, optei pelo SMTP do Email API/SMTP do Mailtrap, pois ele oferece altas taxas de entregabilidade por defeito. Além disso, o Mailtrap permite testar meus emails antes de enviá-los (descreverei isso mais adiante no artigo) e é super fácil de configurar.
Veja como funciona:
- Crie uma conta no Mailtrap
- Verifique seu domínio de envio de email conforme descrito no vídeo abaixo. ⬇️
- Navegue até a janela SMTP/API Settings em Sending Domains, onde você encontrará as credenciais SMTP. Por favor note que enviar usando API não funciona com PHPMailer.
- Copie e cole as credenciais do Transactional Stream no seu script PHP.
E finalmente, aqui está como você pode enviar um email em texto simples com suas credenciais SMTP do Mailtrap configuradas:
Certifique-se de que seu método isHTML
esteja definido como false para enviar emails em texto simples.
Enviar emails HTML
Aprenda mais sobre a personalização de emails HTML em PHP, confira nosso artigo dedicado.
Para enviar um email HTML, basta definir a propriedade isHTML
como (true), como no exemplo abaixo:
Como enviar emails para múltiplos destinatários
Para enviar emails para múltiplos destinatários, você pode usar o trecho de código a seguir:
Enviar emails com anexos
Para enviar emails com anexos, você pode:
- Anexar um ficheiro do seu sistema de ficheiros
Se você optar por esta opção, certifique-se de salvar seus ficheiros no mesmo diretório do script.
Para anexar um ficheiro, basta especificar o caminho do ficheiro. Você também pode adicionar um nome de ficheiro, mas isso é opcional, pois o script usará o nome real do seu ficheiro:
Quando você executa este script, o PHPMailer anexa o ficheiro localizado em path/to/fatura1.pdf ao email. O segundo parâmetro, fatura1.pdf, é opcional e especifica o nome do ficheiro. Para este exemplo, usei .pdf, mas lembre-se de que você também pode adicionar outros tipos de ficheiros, como imagens (.jpg ou .png), por exemplo.
Para adicionar outro ficheiro, basta repetir o comando:
- Adicionar um anexo de string
Ao adicionar um anexo de string, você anexa dados sem precisar salvá-los primeiro como um ficheiro físico no seu sistema. Em tradução, os dados que você anexa são armazenados em uma variável. Por exemplo, isso permite extrair um ficheiro de um banco de dados, como um BLOB (Binary Large Object), sem precisar salvá-lo como um ficheiro.
Para isso, você pode usar o seguinte comando:
Este exemplo adiciona dados armazenados como um BLOB de um banco de dados MySQL.
Você também pode usar uma URL remota, assim:
Enviando emails com imagens incorporadas
Para enviar emails com imagens incorporadas, você pode usar anexos CID:
E aqui está como fica em um trecho de código completo:
O resultado “Mensagem enviada” informa que seu código está sendo executado corretamente. Para verificar o resultado e detalhes da entrega, vá para sua caixa de entrada do Mailtrap: suas mensagens chegarão lá em segundos.
Envio assíncrono de email
Ao contrário do Node.js, que suporta operações assíncronas, o PHPMailer é síncrono por defeito. No entanto, você pode usar a função exec()
para chamar um script PHP para enviar email em segundo plano.
Primeiro, instale o PHP CLI (Command Line Interface) e depois use o seguinte script sendEmail.php:
Para executar o script, use o seguinte comando:
Notas:
- Certifique-se de que o caminho para o executável PHP CLI (php) esteja corretamente especificado.
- Em alguns casos e ambientes, você pode ter que usar o caminho completo para o binário CLI (por exemplo, /usr/bin/php).
- Verifique a configuração do PHP no seu servidor para garantir que funções como
exec()
não estejam desativadas, pois muitas vezes estão em ambientes hosting compartilhados por razões de segurança.- A diretiva que controla isso é a diretiva
disable_functions
no php.ini
- A diretiva que controla isso é a diretiva
Como enviar emails em massa
Para enviar emails para muitos destinatários simultaneamente no PHPMailer, uso as credenciais do Bulk Stream do Mailtrap.
Você pode encontrá-las após fazer login na sua conta Mailtrap e navegar até Sending Domains → SMTP/API Settings tab. À direita, você deve ver as credenciais do Transactional Stream.
Depois, basta inserir as credenciais no seguinte script para enviar emails em massa:
Este script permite enviar emails para vários destinatários sem abrir e fechar a conexão SMTP para cada email, o que é muito mais eficiente do que criar uma nova instância do PHPMailer para cada email, por exemplo.
No entanto, se você planeja enviar um grande volume de emails, pode querer usar um sistema de fila de trabalho, como RabbitMQ, Beanstalkd, Redis ou outros.
Para fins de explicação, mostrarei como fazer isso com o RabbitMQ.
Mas primeiro, vamos instalar uma biblioteca PHP para isso via Composer:
Então, o script produtor de trabalho publicará emails em uma fila RabbitMQ:
E, por fim, o script worker consumirá as mensagens da fila e enviará emails:
Dicas:
- Substitua valores do placeholder como
localhost
,5672
,user
,password
eemailQueue
com seus detalhes reais do RabbitMQ e nome da fila. - Considere também um gerenciador de processos como, por exemplo Supervisor, para garantir que seu script worker esteja sempre em execução e reinicie automaticamente quando travar.
- O script worker precisa dos seus detalhes específicos de configuração SMTP; neste caso, são suas credenciais do Bulk Stream.
Depuração do PHPMailer
Se você encontrar problemas ao enviar emails por meio de um servidor SMTP, o comando SMTPDebug
ajudará a explorar esses erros e descobrir o que deve ser corrigido.
Habilite a depuração SMTP e defina o nível de depuração em seu script da seguinte forma:
- nível 1 = provedor; mostrará mensagens enviadas pelo provedor.
- nível 2 = provedor e servidor; adicionará mensagens do servidor, é a configuração recomendada.
- nível 3 = provedor, servidor e conexão; adicionará detalhes sobre as informações iniciais, o que pode ser útil para descobrir falhas do STARTTLS.
- nível 4 = informações de baixo nível.
Exemplo 1. Nome de host SMTP inválido
Para este exemplo, digitei um nome de host inválido: mailtrap.io em vez de live.smtp.mailtrap.io. e instantaneamente recebi uma mensagem indicando que ocorreu um erro na primeira etapa de comunicação com o servidor.
Exemplo 2. Credenciais inválidas
Aqui, demonstro onde ocorre o erro: agora o SMTP, seu nome de host e porta são válidos, mas uma combinação de login e senha não foi encontrada, então você deve verificar e modificar suas credenciais.
Há alguns artigos detalhados no GitHub sobre depuração e solução de problemas, consulte-os quando precisar se aprofundar nesses tópicos. E se você estiver vendo o famoso SMTP Error: Could not connect to SMTP host
, há uma seção dedicada para resolver esse problema.
Teste seus emails e envio de email em um ambiente de staging
Enviar seus emails sem testá-los previamente seria como fazer uma viagem sem verificar se você empacotou tudo. Imagine que se encontra no terminal do aeroporto e percebe que esqueceu seu passaporte no check-in. 🛂
Algo assim pode realmente acontecer com seus emails se você não os testar antes de enviá-los. Por exemplo, eles podem estar pulando caixas de entrada ou sendo marcados como spam, seu HTML pode não ser renderizado corretamente por todos os provedores de email, suas variáveis de personalização podem estar erradas, etc.
Felizmente, temos você coberto com a solução holística de Email Testing do Mailtrap.
O Email Testing do Mailtrap permite capturar o tráfego de ambientes de staging e dev e depois visualizá-los e analisar seu HTML/CSS antes de enviá-los.
Há também o Spam Report, que pode ajudá-lo a resolver potenciais problemas de entregabilidade de email se você mantiver sua pontuação de spam abaixo de 5.
Dito isso, deixe-me mostrar como funciona.
Para testar seus emails com um servidor SMTP falso, vá para Email Testing → Inboxes → SMTP Settings e selecione PHPMailer na lista de integrações (Integrations).
Em seguida, basta colar as configurações no seu script PHPMailer, que deve parecer algo assim:
Pro tip:
- Você também pode usar as credenciais SMTP do Mailtrap para testar emails com PHPMailer no localhost e obter funcionalidade extra.
Concluindo
Neste tutorial, cobri os casos de uso mais comuns do PHPMailer, desde a criação de emails HTML com imagens e anexos, até o envio com ou sem SMTP, e mais!
Espero que você possa usar este artigo como seu guia de referência para adicionar funcionalidade de email ao seu aplicativo.
No entanto, se você está procurando outros exemplos de uso, dê uma olhada na pasta “examples” dentro da documentação do PHPMailer no Github, ou confira nosso blog, onde você pode encontrar artigos como:
- PHPMailer Gmail: Tutorial com Code Snippets [2024]
- Enviar Emails em PHP: Tutorial com Code Snippets[2024]
- Formulário de Contato de Email em PHP | Mailtrap
- Maneiras Simples de Testar Emails no Seu Aplicativo PHP
Além disso, se você aprende melhor visualmente, não deixe de conferir nosso canal do YouTube e veja como enviar emails usando PHP!