Tutorial do Desenvolvedor: Envio de Emails usando PHPMailer e Gmail SMTP

On maio 30, 2024
15min read
Denys Kontorskyy Technical Content Writer @Mailtrap
Dzenana Kajtaz Technical Content Writer @Mailtrap
This is a featured image for an article covering sending emails in PHPMailer via Gmail SMTP

PHPMailer é uma das bibliotecas de código mais populares da linguagem de desenvolvimento web PHP. Também é usada por gigantes de CMS como Drupal, WordPress e Joomla, para enviar notificações por email, muitas vezes usando o Gmail como o seu servidor.

Com isso em mente, após extensas pesquisas, decidi criar este tutorial sobre como enviar emails com PHPMailer via servidor SMTP do Gmail.

Além disso, no tutorial, explorarei as limitações do SMTP do Gmail, apresentarei opções alternativas, e mostrarei como fazer testes adequados de email.

Disclaimer: A biblioteca PHPMailer foi criada principalmente para comunicação SMTP e não suporta nativamente o envio de emails através da API do Gmail. Portanto, se você precisar usar essa API específica para enviar emails, confira nosso tutorial sobre como enviar emails em PHP para aprender como.

Completando a configuração do PHPMailer para Gmail

Instalando o PHPMailer

Para instalar a biblioteca PHPMailer, é recomendado usar o Composer, então foi essa a rota que segui também.

Existem duas maneiras de fazer isso:

1. Inclua a seguinte linha no seu arquivo composer.json dentro da seção “require” {}:

"phpmailer/phpmailer": "^6.9"

2. Ou abra o prompt command no diretório raiz do seu projeto e execute:

composer require phpmailer/phpmailer
Esta é uma imagem mostrando um prompt de comando em um projeto PHPMailer

Se a biblioteca for instalada com sucesso, você deverá ver o PHPMailer incluído no arquivo composer.json.

Esta é uma imagem mostrando o arquivo composer.json

Gerando uma “App Password” ou configurando a autenticação OAuth2

Enviar emails através do Gmail usando o PHPMailer tornou-se um pouco mais complexo desde que o Google descontinuou a funcionalidade “Enable Less Secure Apps”. Então agora, como um passo extra, você precisa gerar uma Senha de Aplicativo ou configurar o OAuth2.

Para mim, como eu só criei projetos pequenos ou de teste, gerar uma Senha de Aplicativo foi mais conveniente, e foi assim que fiz:

  • Vá para as configurações da sua Conta do Google.
  • Navegue até Security > Signing in to Google > App Passwords.

Se você não encontrar a opção para adicionar uma senha de aplicativo, mas tiver configurado a verificação em duas etapas, pode ser porque sua conta do Google configurou a verificação em duas etapas apenas para chaves de segurança; porque você está logado em uma conta de trabalho, escola ou outra organização; ou porque sua conta do Google tem Proteção Avançada (Advanced Protection).

  • Selecione “Mail” como o aplicativo e “Other (Custom name)” como o dispositivo. Insira um nome e crie.
  • Anote a senha de 16 caracteres gerada, pois você a usará no lugar da sua senha regular do Gmail no campo Senha nas configurações SMTP do PHPMailer.

Para uma explicação mais detalhada, confira as instruções do Google

Se você quiser implementar um método mais robusto e seguro para autenticação e autorização de usuários, siga a rota do OAuth2.

Oauth2-google é um pacote que suporta OAuth 2.0 do Google para o Cliente OAuth 2.0 da PHP League, bem como PHP 7.3 – PHP 8.3.

Para usá-lo, você precisa primeiro obter um client ID e um client secret do Google.

Siga este guia do Google para configurar tudo.

Depois que tudo estiver configurado, você pode instalar o pacote usando o Composer com o seguinte comando e adicionar os detalhes de autorização como mostrado abaixo:

composer require league/oauth2-google

use League\OAuth2\Client\Provider\Google;
$provider = new Google([
    'clientId'     => '{google-client-id}',
    'clientSecret' => '{google-client-secret}',
    'redirectUri'  => 'https://example.com/callback-url',
    'accessType' => 'offline',
]);
        if (!empty($_GET['error'])) {
            // Ocorreu um erro; provavelmente o usuário negou acesso
            exit('Got error: ' . htmlspecialchars($_GET['error'], ENT_QUOTES, 'UTF-8'));
        } elseif (empty($_GET['code'])) {
            // Se não temos um código de autorização, então obtenha um
            $authUrl = $provider->getAuthorizationUrl([
                'scope' => [
                    'https://mail.google.com/'
                ]
            ]);
            header('Location: ' . $authUrl);
            exit;
        } else {
            // Tente obter um token de acesso (usando o grant do código de autorização)
            $token = $provider->getAccessToken('authorization_code', [
                'code' => $_GET['code']
            ]);
            // Use isso para obter um novo token de acesso se o antigo expirar
            $refreshToken = $token->getRefreshToken();
        }

Agora você precisa salvar $refreshToken, para que possa ser usado no código de envio de emails:

     $mail = new PHPMailer();
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com';
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Port = 465;
        $mail->AuthType = 'XOAUTH2';

        $provider = new Google(
            [
                'clientId' => '{google-client-id}',
                'clientSecret' => '{google-client-secret}',
            ]
        );

        $mail->setOAuth(
            new OAuth(
                [
                    'provider' => $provider,
                    'clientId' => '{google-client-id}',
                    'clientSecret' => '{google-client-secret}',
                    'refreshToken' => $refreshToken,
                    'userName' => '{email da sua conta de gmail}',
                ]
            )
        );

Para mais detalhes, siga oauth2-google no GitHub. E se você é novo no PHPMailer e quer ir além de configurar o PHPMailer para Gmail, sinta-se à vontade para ler nosso Guia PHPMailer.

Como enviar emails usando PHPMailer e Gmail SMTP

Com a configuração feita, não perdi tempo e comecei a enviar emails.

O código que escrevi faz algumas coisas.

Primeiro, especifica os endereços e nomes dos emails do remetente e do destinatário. Incluídas, mas comentadas no código, estão também as linhas para especificar os destinatários de CC e BCC.

Depois disso, o código define o email como um formato de texto simples e define a linha de assunto e o conteúdo do texto simples.

Para as linhas responsáveis por enviar o email, usei uma declaração if-else para que uma mensagem de sucesso ou erro fosse exibida dependendo do resultado da tentativa de envio do email. Como, por exemplo, se um erro SMTP for encontrado.

Finalmente, para estar em conformidade com as boas práticas e liberar recursos associados à conexão com o servidor SMTP, fechei a conexão SMTP.

Aqui está como tudo isso parece junto em código PHP:

<?php
// Importar classes do PHPMailer no namespace global
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

// informações do remetente
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');

// endereço de email e nome do destinatário
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS', 'RECIPIENT_NAME'); 

// Adicionar cc ou bcc   
// $mail->addCC('email@mail.com');  
// $mail->addBCC('user@mail.com');  
 
 
$mail->isHTML(false);
 
$mail->Subject = 'Teste SMTP PHPMailer';
$mail->Body    = "PHPMailer o pacote incrível\nPHPMailer está funcionando bem para enviar email\nEste é um tutorial para orientá-lo na integração do PHPMailer";

// Tentar enviar o email
if (!$mail->send()) {
    echo 'Email não enviado. Um erro foi encontrado: ' . $mail->ErrorInfo;
} else {
    echo 'Mensagem foi enviada.';
}

$mail->smtpClose();

Enviar emails para vários destinatários

Não sei quanto a você, mas no meu caso, enviar emails para mais de um destinatário é uma ocorrência muito comum. Então, naturalmente, quis implementar a mesma funcionalidade no meu projeto PHP.

Para fazer isso, expandi o snippet de código anterior com algumas coisas:

  • Uma linha para definir vários destinatários principais:
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS_1', 'RECIPIENT_NAME_2'); 
  • Uma linha para definir vários destinatários de CC:
$mail->addCC('CC_EMAIL_ADDRESS_1', 'CC_NAME_1');  
$mail->addCC('CC_EMAIL_ADDRESS_2', 'CC_NAME_2');
  • E uma linha para definir vários destinatários de BCC:
$mail->addBCC('BCC_EMAIL_ADDRESS_1', 'BCC_NAME_1');  
$mail->addBCC('BCC_EMAIL_ADDRESS_2', 'BCC_NAME_2'); 

O código completo:

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

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

// Configurar um SMTP
$mail->isSMTP();
$mail->Host = ‘smtp.gmail.com’;
$mail->SMTPAuth = true;
$mail->Username = ‘sender@gmail.com’;
$mail->Password = ‘App Password’;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Post = 587;

// Informações do remetente
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');

// Vários endereços de email e nomes de destinatários
// Recipientes principais
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS_1', 'RECIPIENT_NAME_1'); 
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS_2', 'RECIPIENT_NAME_2'); 

// Adicionando destinatários de CC
$mail->addCC('CC_EMAIL_ADDRESS_1', 'CC_NAME_1');  
$mail->addCC('CC_EMAIL_ADDRESS_2', 'CC_NAME_2');  

// Adicionando destinatários de BCC
$mail->addBCC('BCC_EMAIL_ADDRESS_1', 'BCC_NAME_1');  
$mail->addBCC('BCC_EMAIL_ADDRESS_2', 'BCC_NAME_2');  

$mail->isHTML(false);

$mail->Subject = 'Teste SMTP PHPMailer';

$mail->Body    = "PHPMailer o pacote incrível\nPHPMailer está funcionando bem para enviar email\nEste é um tutorial para orientá-lo na integração do PHPMailer";

// Tentar enviar o email
if (!$mail->send()) {
    echo 'Email não enviado. Um erro foi encontrado: ' . $mail->ErrorInfo;
} else {
    echo 'Mensagem foi enviada.';
}

$mail->smtpClose();

Enviar emails com anexos

Incluir vários destinatários foi fácil. Mas sabe o que (para minha surpresa) foi ainda mais fácil? Incluir anexos!

Para isso, precisei expandir o código com apenas uma linha:

$mail->addAttachment('/path/to/file1.pdf', 'NomePersonalizado1.pdf'); // Anexo 1

A linha chama a função addAttachment após definir o corpo e passa o caminho para o arquivo que você deseja anexar.

Se necessário, você pode anexar vários arquivos chamando a função, adivinhe, várias vezes.

$mail->addAttachment('/path/to/file1.pdf', 'NomePersonalizado1.pdf'); // Anexo 1
$mail->addAttachment('/path/to/file2.jpg', 'NomePersonalizado2.jpg'); // Anexo 2

O código completo:

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

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

//Configurar SMTP
$mail->isSMTP();
$mail->Host = ‘smtp.gmail.com’;
$mail->SMTPAuth = true;
$mail->Username = ‘sender@gmail.com’;
$mail->Password = ‘App Password’;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

//informações do remetente
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');

//endereço de email e nome do destinatário
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS', 'RECIPIENT_NAME'); 

// Adicionar cc ou bcc  
// $mail->addCC('email@mail.com');  
// $mail->addBCC('user@mail.com');  
 
 
$mail->isHTML(false);
 
$mail->Subject = 'Teste SMTP PHPMailer';
$mail->Body    = "PHPMailer o pacote incrível\nPHPMailer está funcionando bem para enviar email\nEste é um tutorial para orientá-lo na integração do PHPMailer";

$mail->addAttachment('/path/to/file1.pdf', 'NomePersonalizado1.pdf'); // Anexo 1

// Tentar enviar o email
if (!$mail->send()) {
    echo 'Email não enviado. Um erro foi encontrado: ' . $mail->ErrorInfo;
} else {
    echo 'Mensagem foi enviada.';
}

$mail->smtpClose();

Nota: PHPMailer pode ser usado em um formulário de contato em PHP para enviar emails com anexos.

Enviar emails em HTML

Até agora, todos os snippets de código que mostrei foram destinados a enviar uma mensagem de texto simples. Agora, se você quiser elevar o nível das coisas e converter a mensagem de um formato de texto simples para HTML, precisará fazer duas alterações no código.

Primeiro, a linha $mail->isHTML(false); deve ser alterada para $mail->isHTML(true);. Isso informará ao PHPMailer para enviar o email como HTML e alterar como o conteúdo do email é interpretado e renderizado pelos provedores de email.

Em seguida, $mail->Body deve ser atualizado para definir o formato do email para HTML.

Aqui está como a linha atualizada para definir o corpo deve ficar:

$mail->Body    = "<h1>PHPMailer o pacote incrível</h1>
                  <p>PHPMailer está funcionando bem para enviar email.</p>
                  <p>Este é um tutorial para orientá-lo na integração do PHPMailer.</p>";

O código completo:

<?php
// Importar classes do PHPMailer no namespace global
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

// Configurar SMTP
$mail->isSMTP();
$mail->Host = ‘smtp.gmail.com’;
$mail->SMTPAuth = true;
$mail->Username = ‘sender.gmail.com’;
$mail->Password = ‘App Password’;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

// Informações do remetente
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');

// Endereço de email e nome do destinatário
$mail->addAddress('RECIPIENT_EMAIL_ADDRESS', 'RECIPIENT_NAME'); 

// Adicionar cc ou bcc   
// $mail->addCC('email@mail.com');  
// $mail->addBCC('user@mail.com');  
 
 
$mail->isHTML(true); // Definir formato do email para HTML
 
$mail->Subject = 'Teste SMTP PHPMailer';
$mail->Body    = "<h1>PHPMailer o pacote incrível</h1>
                  <p>PHPMailer está funcionando bem para enviar email.</p>
                  <p>Este é um tutorial para orientá-lo na integração do PHPMailer.</p>";

// Tentar enviar o email
if (!$mail->send()) {
    echo 'Email não enviado. Um erro foi encontrado: ' . $mail->ErrorInfo;
} else {
    echo 'Mensagem foi enviada.';
}

$mail->smtpClose();
?>

Para uma personalização mais aprofundada de email HTML em PHP, não deixe de conferir nosso artigo dedicado.

Enviar emails em massa

Por último, mas não menos importante, em termos de envio com PHPMailer via SMTP do Gmail, vou abordar emails em massa.

Enviar emails em massa exigiu que eu fizesse vários ajustes no meu código de envio de emails:

  • Tratamento de destinatários: Em vez de um único endereço de email e nome hard-coded, mudei para um array que armazena vários endereços de email e nomes de destinatários.
$recipients = [
    ['email' => 'destinatário1@exemplo.com', 'name' => 'Destinatário 1'],
    ['email' => 'destinatário2@exemplo.com', 'name' => 'Destinatário 2'],
    // Adicione mais destinatários conforme necessário
];
  • Implementação de loop: Para aplicar o processo de envio para cada destinatário, implementei um loop foreach que percorre todo o array $recipients. Depois que cada email é enviado, limpo os endereços de destinatários para garantir que o próximo email vá apenas para o próximo destinatário pretendido, evitando o acúmulo de destinatários.
foreach ($recipients as $recipient) {
    try {
        $mail->addAddress($recipient['email'], $recipient['name']); // Adicionar um destinatário
        
        // Tentar enviar o email
        if (!$mail->send()) {
            echo 'Email não enviado para ' . $recipient['email'] . '. Um erro foi encontrado: ' . $mail->ErrorInfo . "\n";
        } else {
            echo 'Mensagem foi enviada para ' . $recipient['email'] . ".\n";
        }

        $mail->clearAddresses(); // Limpar endereços para a próxima iteração
    } catch (Exception $e) {
        echo "A mensagem não pôde ser enviada para " . $recipient['email'] . ". Erro do Mailer: {$mail->ErrorInfo}\n";
    }
  • Configuração dinâmica de destinatários: Dentro do loop foreach, configurei dinamicamente cada destinatário.
$mail->addAddress($recipient['email'], $recipient['name']);
  • Tratamento de erros e feedback: Também dentro do loop foreach, implementei mensagens fornecendo feedback para cada destinatário e indicando se o email foi enviado com sucesso ou não.
    if (!$mail->send()) {
            echo 'Email não enviado para ' . $recipient['email'] . '. Um erro foi encontrado: ' . $mail->ErrorInfo . "\n";
        } else {
            echo 'Mensagem foi enviada para ' . $recipient['email'] . ".\n";
        }
  • Uso de bloco try-catch: Para lidar com exceções para cada tentativa de envio de email, usei um bloco try-catch. Isso permite um tratamento de erros mais detalhado e garante que o script do arquivo PHP possa continuar tentando enviar para o resto dos destinatários, mesmo que ocorra um erro com um.

O código completo:

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

require_once 'vendor/autoload.php';

// Definir destinatários
$recipients = [
    ['email' => 'destinatário1@example.com', 'name' => 'Destinatário 1'],
    ['email' => 'destinatário2@example.com', 'name' => 'Destinatário 2'],
    // Adicione mais destinatários conforme necessário
];

$mail = new PHPMailer(true);

// Configurar SMTP
$mail->isSMTP();
$mail->Host = ‘smtp.gmail.com’;
$mail->SMTPAuth = true;
$mail->Password = ‘App Password’;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

// informações do remetente
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');

$mail->isHTML(false);
$mail->Subject = 'Teste SMTP PHPMailer';
$mail->Body    = "PHPMailer o pacote incrível\nPHPMailer está funcionando bem para enviar email\nEste é um tutorial para orientá-lo na integração do PHPMailer";

foreach ($recipients as $recipient) {
    try {
        $mail->addAddress($recipient['email'], $recipient['name']); // Adicionar um destinatário
        
        // Tentar enviar o email
        if (!$mail->send()) {
            echo 'Email não enviado para ' . $recipient['email'] . '. Um erro foi encontrado: ' . $mail->ErrorInfo . "\n";
        } else {
            echo 'Mensagem foi enviada para ' . $recipient['email'] . ".\n";
        }

        $mail->clearAddresses(); // Limpar endereços para a próxima iteração
    } catch (Exception $e) {
        echo "A mensagem não pôde ser enviada para " . $recipient['email'] . ". Erro do Mailer: {$mail->ErrorInfo}\n";
    }
}

$mail->smtpClose();

Limitações do SMTP do Gmail

Para a maioria dos projetos que estão no ponto de partida, uma conta regular do Gmail é suficiente. No entanto, o Gmail tem suas próprias limitações e, portanto, em certo estágio, você pode precisar mudar para algo que atenda às suas necessidades.

Aqui estão as limitações mais importantes que você deve ter em mente:

  • 500 emails por dia (1 destinatário é contado como um email)
  • Tempo de espera de 24 horas para retomar o envio após atingir o limite
  • 25 MB de tamanho total de todos os anexos em um único email
  • Limitação de taxa ou redução da velocidade de envio dos seus emails (critérios específicos de limitação de taxa e redução de velocidade não detalhados publicamente)

Para as informações mais precisas e atuais sobre os limites de envio do Gmail, incluindo limitação de taxa e redução de velocidade, aconselho que consulte a documentação diretrizes oficiais do Google para remetented em massa, bem como o artigo detalhado do Mailtrap.

Existe uma alternativa ao SMTP do Gmail?

Além do Gmail, a escolha dominante para muitos, há outras alternativas gratuitas e acessíveis no mercado. Um ótimo exemplo é o Mailtrap!

A Plataforma de Email Delivery do Mailtrap, entre outras funcionalidades úteis, oferece um serviço SMTP fiável e sem complicações, bem como uma API de email. A configuração para ambos é simples e segura.

Com a Plataforma de Email Delivery do Mailtrap, os desenvolvedores obtêm uma infraestrutura com altas taxas de entrega por defeito.

Além de tudo isso, o Mailtrap oferece as melhores análises acionáveis da indústria, o que permite que os desenvolvedores tenham mais controle sobre o desempenho da infraestrutura de email e acelerem a resolução de problemas. Incluídas nas análises acionáveis estão funcionalidades como um painel de visão geral, 60 dias de logs de email, alertas de entregabilidade e muito mais.

Nota: Lembre-se de que, abaixo, mostrarei como enviar emails transacionais, que são emails enviados para um destinatário individual após uma ação ou transação específica. Esses emails frequentemente contêm dados confidenciais de clientes e precisam ser entregues prontamente e corretamente. É por isso que usar uma plataforma de confiança, como o Mailtrap, é crucial.

A integração do serviço SMTP do Mailtrap no seu projeto PHP pode ser feita em alguns passos simples e rápidos:

1. Crie uma conta Mailtrap.

2. Adicione e verifique seu domínio. 

3. Na seção Sending Domains, vá para a aba SMTP/API Settings, onde você encontrará as credenciais SMTP. Note que o envio usando uma API não funciona com PHPMailer.

4. Copie e cole as credenciais do Transactional Stream no seu script PHP.

Esta é uma imagem mostrando as configurações SMTP do stream transacional do Mailtrap.

Basta inserir essas credenciais no seguinte script para enviar emails em massa usando PHPMailer e o serviço de envio SMTP do Mailtrap:

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

require 'vendor/autoload.php'; // Ajuste 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 host SMTP
$mail->SMTPAuth = true;
$mail->Username = 'your_username'; // Seu nome de usuário Mailtrap
$mail->Password = 'your_password'; // Sua senha Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 2525;

// Configurações do remetente e destinatário
$mail->setFrom('from@example.com', 'From Name');
$mail->addAddress('recipient@example.com', 'Recipient Name');

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

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

Como a Plataforma de Email Delivery do Mailtrap com Email Sending também oferece uma funcionalidade de Bulk Stream, você pode usar essa ferramenta para campanhas de email em massa enviadas usando o PHPMailer também.

Emails em massa são geralmente mensagens de marketing ou promocionais destinadas a um grande número de destinatários de uma só vez, como newsletters, promoções de produtos, atualizações de serviços, etc.

As credenciais do Bulk Stream podem ser encontradas no lado direito da página após fazer login na sua conta Mailtrap e navegar para Sending Domains → aba SMTP/API Settings.

Esta é uma imagem mostrando as configurações SMTP do stream em massa do Mailtrap

Simply insert these credentials into the following script to send bulk emails using PHPMailer and the Mailtrap Email Sending SMTP service:

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

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

$mail = new PHPMailer(true);

try {
    // Configurações do servidor
    $mail->isSMTP();
    $mail->Host       = 'your_smtp_server'; // Defina o servidor SMTP para enviar através dele
    $mail->SMTPAuth   = true;               // Habilitar autenticação SMTP
    $mail->Username   = 'your_smtp_username'; // Nome de usuário SMTP
    $mail->Password   = 'your_smtp_password'; // Senha SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Habilitar criptografia TLS; 
    $mail->Port       = 587; // Porta TCP para conectar-se

    // Endereço do remetente e de reply-to
    $mail->setFrom('de@exempl.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@example.com', 'name' => 'Pessoa Um'],
        ['email' => 'pessoa2@example.com', 'name' => 'Pessoa Dois'],
        // Adicione mais destinatários conforme necessário
    ];

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

        // Personalizar a mensagem
        $mail->Subject = 'Aqui está o assunto';
        $mail->Body    = 'Esta é a mensagem em HTML <b>em negrito!</b>';
        $mail->AltBody = 'Este é o corpo em texto simples para clientes de email sem suporte a HTML';

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

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

Testando emails antes de os enviar

Adicionar uma funcionalidade de envio de email ao seu aplicativo é apenas o primeiro passo. Testar essa funcionalidade é o segundo passo, que é igualmente, senão mais, importante.

Seja encontrar links quebrados, verificar se o conteúdo é renderizado corretamente, realizar testes de spam ou verificar sua taxa de entregabilidade, esses são apenas alguns motivos pelos quais testar emails em PHP apps, ou qualquer outro tipo de aplicativo, é crítico.

Independentemente de ser PHP, Python, JavaScript ou outra linguagem usada para escrever uma biblioteca de email, a biblioteca será projetada especificamente para envio e não terá capacidades adequadas de teste. Para realizar os testes, uso a ferramenta rica em funcionalidades, Mailtrap Email Testing, disponível na Plataforma de Email Delivery.

Com o Email Testing da Plataforma de Email Delivery, você obtém um sandbox de email onde pode inspecionar e depurar emails antes de enviá-los para os destinatários. E como essa ferramenta funciona capturando o tráfego SMTP de ambientes de staging e de desenvolvimento, ao testar com ela, você não corre o risco de enviar spam para os usuários.

O Email Testing vem com uma gama de funcionalidades, como:

  • Verificação de HTML/CSS
  • Verificação de spam score
  • Pré-visualização do email
  • Várias caixas de entrada para diferentes projetos e etapas
  • E mais

Para começar a usar o Email Testing, você pode aproveitar as integrações prontas para uso disponíveis em diferentes linguagens (mais de 20, como Ruby, Python, PHP, Node.js, .Net, etc.)

Vamos ver como o processo de integração se parece no caso do PHPMailer!

Dentro do Email Testing, vá para InboxesSMTP Settings e selecione PHPMailer na lista de integrações.

Esta é uma imagem mostrando as configurações SMTP do Mailtrap Testing

Depois, uma vez que você tenha feito isso, basta colar as configurações no seu script PHP, que deve parecer algo assim:

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

require 'vendor/autoload.php';

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

try {
    // Configurações SMTP para o Mailtrap
    $phpmailer->isSMTP(); // Definir mailer para usar SMTP
    $phpmailer->Host = 'sandbox.smtp.mailtrap.io'; // Especificar servidores SMTP principais e de 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 para conectar-se

    // Configurações de conteúdo do email
    $phpmailer->setFrom('seu_email@exemplo.com', 'Mailer');
    $phpmailer->addAddress('destinatario@exemplo.com', 'Joe User'); // Adicionar um 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>em negrito!</b>';
    $phpmailer->AltBody = 'Este é o corpo em texto simples para clientes de email sem suporte a HTML';

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

Após executar o código, o email de teste deve chegar na caixa de entrada virtual definida no Email Testing, onde você pode então examiná-lo de perto usando as funcionalidades mencionadas e fazer as correções apropriadas.

No momento em que sentir que o email foi aperfeiçoado, basta voltar a usar o Mailtrap Email Sending para entregá-lo no momento certo!

Para concluir

Ufa! Que tutorial! Espero que não tenha sido tão esmagador para você quanto foi para mim descobrir os detalhes do PHPMailer e Gmail 😅

Eu com certeza estarei referindo-me a este conteúdo toda vez que houver a necessidade de construir a funcionalidade de envio de email com PHPMailer e Gmail. E à medida que novas adições forem feitas à biblioteca de código, farei o meu melhor para expandir o conteúdo conforme necessário.

Para mais casos de uso do PHPMailer, não deixe de dar uma olhada na pasta “examples” dentro da documentação do PHPMailer. Ou, se você estiver curioso sobre o envio de email usando outras linguagens e frameworks, não se esqueça de explorar mais o blog do Mailtrap.

Aqui estão algumas das minhas sugestões de artigos relacionados ao PHP:

Se você aprende melhor de forma visual, o Mailtrap também tem um canal no YouTube com ótimos tutoriais, como este sobre como enviar emails usando PHP:

Article by Denys Kontorskyy Technical Content Writer @Mailtrap

I am an experienced Technical Content Writer specializing in email infrastructure, offering insights on sending, testing, and optimizing emails. I also have a strong interest in product marketing, creating engaging content that drives audience engagement and supports business growth.

Article by Dzenana Kajtaz Technical Content Writer @Mailtrap

I’m a Technical Content Writer with an educational background in software engineering and 4 years of experience as a writer, editor, and content marketer. Currently, I mainly focus on writing about email infrastructure, sending, testing, and so on, but I do love creating fun and engaging content on email marketing topics as well.