Guia do PHPMailer: Configuração, Setup SMTP e Envio de Emails

On junho 03, 2024
14min read
Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Ivan Djuric Technical Content Writer @Mailtrap

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:

"phpmailer/phpmailer": "^6.9"

Ou execute o seguinte comando:

composer require phpmailer/phpmailer

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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajuste o caminho conforme necessário se você não estiver usando o Composer

$mail = new PHPMailer(true);

try {
    // Configurações do servidor
    $mail->isSMTP();                                            // Enviar usando SMTP
    $mail->Host       = 'smtp.exemplo.com';                     // Defina o servidor SMTP para enviar
    $mail->SMTPAuth   = true;                                   // Habilitar autenticação SMTP
    $mail->Username   = 'seu_email@exemplo.com';               // username SMTP
    $mail->Password   = 'sua_senha';                        // senha SMTP
    $mail->SMTPSecure = 'tls'; // Habilitar criptografia TLS
    $mail->Port       = 587;                                    // Porta TCP para conectar

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:

  • 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.
Captura de tela das Configurações SMTP/API do Mailtrap
  • 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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajustar com base no seu método de instalação

$mail = new PHPMailer(true); // Habilitar exceções

// Configuração SMTP
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io'; // Seu servidor SMTP
$mail->SMTPAuth = true;
$mail->Username = 'seu_username'; // Seu username Mailtrap
$mail->Password = 'sua_senha'; // Sua senha Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

// Configurações de remetente e destinatário
$mail->setFrom('remetente@exemplo.com', 'Nome do Remetente');
$mail->addAddress('destinatario@exemplo.com', 'Nome do Destinatário');

// Enviar email em texto simples
$mail->isHTML(false); // Definir formato do email para texto simples
$mail->Subject = 'Seu Assunto Aqui';
$mail->Body    = 'Este é o corpo da mensagem em texto simples';

// Enviar o email
if(!$mail->send()){
    echo 'A mensagem não pôde ser enviada. Erro do Mailer: ' . $mail->ErrorInfo;
} else {
    echo 'A mensagem foi enviada';
}

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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php'; // Certifique-se de que o caminho está correto

$mail = new PHPMailer(true); // Passar `true` habilita exceções

try {
    $mail->isSMTP();
    $mail->Host = 'live.smtp.mailtrap.io'; // Seu servidor SMTP
    $mail->SMTPAuth = true;
    $mail->Username = 'cole um gerado pelo Mailtrap'; // Seu username do Mailtrap
    $mail->Password = 'cole uma gerada pelo Mailtrap'; // Sua senha do Mailtrap
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Configurações do remetente e destinatário
    $mail->setFrom('info@mailtrap.io', 'Mailtrap');
    $mail->addReplyTo('info@mailtrap.io', 'Mailtrap');
    $mail->addAddress('destinatario1@mailtrap.io', 'Tim'); // Destinatário principal
    // CC e BCC
    $mail->addCC('cc1@exemplo.com', 'Elena');
    $mail->addBCC('bcc1@exemplo.com', 'Alex');
    // Adicionando mais destinatários BCC
    $mail->addBCC('bcc2@exemplo.com', 'Anna');
    $mail->addBCC('bcc3@exemplo.com', 'Mark');

    // Conteúdo do email
    $mail->isHTML(true); // Definir formato de email para HTML
    $mail->Subject = "Teste do SMTP PHPMailer";
    $mail->Body = '<h1>Envie Emails HTML Email usando SMTP em PHP</h1><p>Este é um email de teste que enviei usando o servidor de email SMTP com PHPMailer.</p>'; // Exemplo de corpo HTML
    $mail->AltBody = 'Esta é a versão de texto simples do conteúdo do email';

    if(!$mail->send()) {
        echo 'A mensagem não pôde ser enviada.';
        echo 'Erro do Mailer: ' . $mail->ErrorInfo;
    } else {
        echo 'Mensagem enviada';
    }
} catch (Exception $e) {
    echo "A mensagem não pôde ser enviada. Erro do Mailer: {$mail->ErrorInfo}";
}
?>

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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = '1a2b3c4d5e6f7g'; // gerado pelo Mailtrap
$mail->Password = '1a2b3c4d5e6f7g'; // gerado pelo Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->SMTPKeepAlive = true; // adicione isso para manter a conexão SMTP aberta após cada email enviado
$mail->setFrom('lista@exemplo.com', 'Gerenciador de Lista');
$mail->Subject = "Nova Lista de Email Mailtrap";
$users = [
  ['email' => 'max@gmail.com', 'name' => 'Max'],
  ['email' => 'box@exemplo.com', 'name' => 'Bob']
];
foreach ($users as $user) {
  $mail->addAddress($user['email'], $user['name']);
  $mail->Body = "<h2>Oi, {$user['name']}!</h2> <p>Como está?</p>";
  $mail->AltBody = "Oi, {$user['name']}! \n Como está?";
  try {
      $mail->send();
      echo "Mensagem enviada para: ({$user['email']}) {$mail->ErrorInfo}\n";
  } catch (Exception $e) {
      echo "Erro do Mailer ({$user['email']}) {$mail->ErrorInfo}\n";
  }
  $mail->clearAddresses();
}
$mail->smtpClose();

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:

$mail->addAttachment('path/to/fatura1.pdf', 'fatura1.pdf');

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:

$mail->addAttachment('path/to/calculo1.xlsx', 'calculo1.xlsx');
  • 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:

$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'db_data.db');

Este exemplo adiciona dados armazenados como um BLOB de um banco de dados MySQL.

Você também pode usar uma URL remota, assim:

$mail->addStringAttachment(file_get_contents($url), 'myfile.pdf');

Enviando emails com imagens incorporadas

Para enviar emails com imagens incorporadas, você pode usar anexos CID:

$mail->addEmbeddedImage('path/to/ficheiro_imagem.jpg', 'image_cid');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';

E aqui está como fica em um trecho de código completo:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // Habilita exceções
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'cole um gerado pelo Mailtrap';
$mail->Password = 'cole uma gerada pelo Mailtrap';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('remetente@exemplo.com', 'Primeiro e Último');
$mail->addReplyTo('paraquem@exemplo.com', 'John Doe');
$mail->addAddress('destinatario@example.com', 'Nome do Destinatário'); // Especifique o destinatário

$mail->isHTML(true);
$mail->Subject = "Teste SMTP em PHPMailer";
$mail->addEmbeddedImage('path/to/ficheiro_da_imagem.jpg', 'image_cid'); // Especifique o caminho para a sua imagem e CID
$mail->Body = '<img src="cid:image_cid"> Corpo do email em HTML'; // Use o CID como o atributo src na sua tag img
$mail->AltBody = 'Esta é a versão em texto simples do conteúdo do email';

if(!$mail->send()){
    echo 'A mensagem não pôde ser enviada.';
    echo 'Erro de Mailer: ' . $mail->ErrorInfo;
}else{
    echo 'A mensagem foi enviada';
}

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.

Teste SMTP do PHPMailer

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:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/vendor/autoload.php'; // Ajuste o caminho conforme necessário

$mail = new PHPMailer(true);

// Configuração SMTP
$mail->isSMTP();
$mail->Host = 'smtp.exemplo.com'; // Especificar servidores SMTP principais e de backup
$mail->SMTPAuth = true; // Habilitar autenticação SMTP
$mail->Username = 'user@exemplo.com'; // Nome de usuário SMTP
$mail->Password = 'secret'; // Senha SMTP
$mail->SMTPSecure = 'tls'; // Habilitar criptografia TLS, `ssl` também é aceito
$mail->Port = 587; // Porta TCP para conectar

// Configurações do email
$mail->setFrom('remetente@exemplo.com', 'Mailer');
$mail->addAddress('destinatario@exemplo.com', 'Nome do Destinatário'); // Adicionar um destinatário
$mail->isHTML(true); // Definir formato de email para HTML
$mail->Subject = 'Aqui está o assunto';
$mail->Body    = 'Esté é o corpo do email HTML <b>em negrito!</b>';
$mail->AltBody = 'Esta é a mensagem em texto simples para provedores de email não-HTML';

try {
    $mail->send();
    echo 'Mensagem enviada';
} catch (Exception $e) {
    echo "A mensagem não pôde ser enviada. Erro do Mailer: {$mail->ErrorInfo}";
}

Para executar o script, use o seguinte comando:

exec("php /path/to/sendEmail.php > /dev/null &");

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

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 DomainsSMTP/API Settings tab. À direita, você deve ver as credenciais do Transactional Stream.

Mailtrap Bulk Stream

Depois, basta inserir as credenciais no seguinte script para enviar emails em massa:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Caminho para o ficheiro autoload do Composer

$mail = new PHPMailer(true);

try {
    // Configurações do servidor
    $mail->isSMTP();
    $mail->Host       = 'bulk.smtp.mailtrap.io'; // Definir o servidor SMTP pelo qual enviará
    $mail->SMTPAuth   = true;               // Habilitar autenticação SMTP
    $mail->Username   = 'seu_username_smtp'; // Nome do usuário SMTP
    $mail->Password   = 'sua_senha_smtp'; // Senha SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Habilitar criptografia TLS; 
    $mail->Port       = 587; // Porta TCP port à qual conectar

    // Endereço de remetente e de reply-to
    $mail->setFrom('remetente@exemplo.com', 'Mailer');
    $mail->addReplyTo('replyto@exemplo.com', 'Mailer');

    // Conteúdo
    $mail->isHTML(true); // Definir formato do email para HTML
    
    // Lista de destinatários
    $recipients = [
        ['email' => 'pessoa1@exemplo.com', 'name' => 'Pessoa Um'],
        ['email' => 'pessoa2@exemplo.com', 'name' => 'Pessoa Dois'],
        // Add more recipients as needed
    ];

    foreach ($recipients as $recipient) {
        $mail->addAddress($recipient['email'], $recipient['name']); // Adicionar destinatário

        // Personalize a mensagem
        $mail->Subject = 'Aqui está o assunto';
        $mail->Body    = 'Este é o corpo da mensagem em HTML <b>e a negrito!</b>';
        $mail->AltBody = 'Este é o corpo da mensagem em texto simples para provedores de email não-HTML';

        $mail->send();
        $mail->clearAddresses(); // Limpar endereços para a próxima iteração
    }

    echo 'As mensagens foram enviadas';
} catch (Exception $e) {
    echo "A mensagem não pôde ser enviada. Erro de Mailer: {$mail->ErrorInfo}";
}

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:

composer require php-amqplib/php-amqplib

Então, o script produtor de trabalho publicará emails em uma fila RabbitMQ:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

$emailData = [
    'email' => 'destinatario@exemplo.com',
    'subject' => ‘Email de Teste',
    'body' => 'Este é um corpo de email de teste.'
];

$msg = new AMQPMessage(json_encode($emailData), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'emailQueue');

echo " [x] Enviado 'Email Job'\n";

$channel->close();
$connection->close();

E, por fim, o script worker consumirá as mensagens da fila e enviará emails:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTPException;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

echo " [*] Aguardando mensagens. Para sair pressione CTRL+C\n";

$logFile = 'email_log.txt'; // Caminho para o seu ficheiro de log

$callback = function ($msg) use ($logFile) {
    echo " [x] Recebido ", $msg->body, "\n";
    $emailData = json_decode($msg->body, true);

    $mail = new PHPMailer(true);
    try {
        // Configurar definições SMTP
        $mail->isSMTP();
        // Sua configuração SMTP aqui

        $mail->setFrom('remetente@exemplo.com', 'Mailer');
        $mail->addAddress($emailData['email']); // Email do destinatário dos dados do job

        $mail->isHTML(true); // Formato do email para HTML
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        echo "Email enviado para {$emailData['email']}\n";
        
        // Registrar envio de email bem-sucedido
        file_put_contents($logFile, "Email enviado com sucesso para {$emailData['email']} em " . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    } catch (Exception $e) {
        echo "Email não pôde ser enviado. Erro do Mailer: {$mail->ErrorInfo}\n";
        // Registrar erros gerais
        file_put_contents($logFile, "Erro de envio de email para {$emailData['email']} em " . date('Y-m-d H:i:s') . ". Error: {$mail->ErrorInfo}\n", FILE_APPEND);
    } catch (SMTPException $e) {
        echo "Erro SMTP: {$mail->ErrorInfo}\n";
        // Registrar erros específicos do SMTP
        file_put_contents($logFile, "Erro SMTP ao enviar o email para {$emailData['email']} em " . date('Y-m-d H:i:s') . ". Error: {$mail->ErrorInfo}\n", FILE_APPEND);
    }

    $msg->ack();
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('emailQueue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Dicas

  • Substitua valores do placeholder como localhost, 5672, user, password e emailQueue 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:

$mail->SMTPDebug = 2;
  • 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

2018-12-12 14:51:32	Connection: opening to mailtrap.io:587, timeout=10, options=array()
2018-12-12 14:51:42	Connection failed. Error #2: stream_socket_client(): unable to connect to mailtrap.io:587 (Operation timed out) [/Users/xxxx/Downloads/PHPMailer/src/SMTP.php line 326]
2018-12-12 14:51:42	SMTP ERROR: Failed to connect to server: Operation timed out (60)
2018-12-12 14:51:42	SMTP connect() failed.

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

2018-12-12 14:49:26	Connection: opening to live.smtp.mailtrap.io:587, timeout=300, options=array()
2018-12-12 14:49:26	Connection: opened
2018-12-12 14:49:26	SMTP INBOUND: "220 mailtrap.io ESMTP ready"
2018-12-12 14:49:26	SERVER -> CLIENT: 220 mailtrap.io ESMTP ready
...
2018-12-12 14:49:30	SMTP INBOUND: "535 5.7.0 Invalid login or password"
2018-12-12 14:49:30	SERVER -> CLIENT: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP ERROR: Username command failed: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP Error: Could not authenticate.
2018-12-12 14:49:30	CLIENT -> SERVER: QUIT
2018-12-12 14:49:30	SMTP INBOUND: "221 2.0.0 Bye"
2018-12-12 14:49:30	SERVER -> CLIENT: 221 2.0.0 Bye
2018-12-12 14:49:30	Connection: closed
2018-12-12 14:49:30	SMTP connect() failed.
Erro do Mailer: SMTP connect() failed.

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.

Verificação de HTML do Mailtrap Email Testing

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.

Análise de Spam do Mailtrap Email Testing

Dito isso, deixe-me mostrar como funciona.

Para testar seus emails com um servidor SMTP falso, vá para Email TestingInboxesSMTP Settings e selecione PHPMailer na lista de integrações (Integrations).

Credenciais SMTP do Mailtrap Email Testing

Em seguida, basta colar as configurações no seu script PHPMailer, que deve parecer algo assim:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$phpmailer = new PHPMailer(true); // Crie uma nova instância PHPMailer

try {
    // Configurações SMTP para o Mailtrap
    $phpmailer->isSMTP(); // Definir o mailer para usar SMTP
    $phpmailer->Host = 'sandbox.smtp.mailtrap.io'; // Especificar os servidores SMTP principal e backup
    $phpmailer->SMTPAuth = true; // Habilitar autenticação SMTP
    $phpmailer->Username = '1234567891234'; // Nome de usuário SMTP
    $phpmailer->Password = '1234567891234'; // Senha SMTP
    $phpmailer->Port = 2525; // Porta TCP port à qual conectar

    // Configurações do conteúdo do email
    $phpmailer->setFrom('seu_email@exemplo.com', 'Mailer');
    $phpmailer->addAddress('destinatario@exemplo.com', 'Joe User'); // Adicionar destinatário
    $phpmailer->isHTML(true); // Definir formato do email para HTML
    $phpmailer->Subject = 'Aqui está o assunto';
    $phpmailer->Body    = 'Este é o corpo da mensagem em HTML <b>e em negrito!</b>';
    $phpmailer->AltBody = 'Este é o corpo da menasagem em texto simples para provedores de email não-HTML';

    $phpmailer->send(); // Enviar o email
    echo 'A mensagem foi enviada';
} catch (Exception $e) {
    echo "A mensagem não pôde ser enviada. Erro do Mailer: {$phpmailer->ErrorInfo}";
}
?>

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:

Além disso, se você aprende melhor visualmente, não deixe de conferir nosso canal do YouTube e veja como enviar emails usando PHP!

Article by Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Article by Ivan Djuric Technical Content Writer @Mailtrap

I’m a Technical Content Writer with 5 years of background covering email-related topics in tight collaboration with software engineers and email marketers. I just love to research and share actionable insights with you about email sending, testing, deliverability improvements, and more. Happy to be your guide in the world of emails!