A função nativa mail() do PHP entrega as mensagens ao binário local sendmail sem autenticação SMTP, sem negociação TLS e sem relatório de erros estruturado. O PHPMailer adiciona às aplicações PHP um cliente SMTP, formatação MIME e suporte a anexos.
Como instalar o PHPMailer?
Use o Composer:
composer require phpmailer/phpmailer
Depois carregue o autoloader e importe as classes necessárias:
<?php
require "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
Como configurar SMTP e enviar uma mensagem?
Crie uma instância de PHPMailer, ative o modo SMTP com isSMTP() e defina os campos de conexão e mensagem. Envolva a chamada em try/catch para que uma falha no envio seja reportada em vez de engolida:
<?php
$mail = new PHPMailer(true); // true enables exceptions
try {
// Server settings
$mail->isSMTP();
$mail->Host = "smtp.example.com";
$mail->SMTPAuth = true;
$mail->Username = getenv("SMTP_USER");
$mail->Password = getenv("SMTP_PASS");
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Recipients
$mail->setFrom("you@yourdomain.com", "Your App");
$mail->addAddress("recipient@example.org", "Recipient Name");
// Content
$mail->isHTML(true);
$mail->Subject = "Your receipt";
$mail->Body = "<p>Thanks for your order.</p>";
$mail->AltBody = "Thanks for your order. This is the plain-text version.";
$mail->send();
echo "Message sent.";
} catch (Exception $e) {
echo "Send failed: {$mail->ErrorInfo}";
}
Ajuste SMTPSecure à porta do seu servidor: ENCRYPTION_STARTTLS na porta 587 atualiza uma conexão em texto claro para TLS, e ENCRYPTION_SMTPS na porta 465 negocia TLS imediatamente. Definir isHTML(true) marca Body como HTML e inclui AltBody como a parte em texto puro para clientes que não renderizam HTML. Incluir as duas partes também melhora a entregabilidade. Passar true ao construtor faz com que as falhas lancem uma Exception em vez de retornarem false.
Como adicionar um anexo?
Chame addAttachment com o caminho do arquivo antes de send():
<?php
$mail->addAttachment("./invoices/invoice-1042.pdf", "invoice.pdf");
O segundo argumento renomeia o arquivo como o destinatário o vê. Você pode chamá-lo mais de uma vez para múltiplos anexos.
Envie com Bird
Para enviar e-mail a partir do PHP por HTTPS sem gerenciar uma conexão SMTP, instale o Bird PHP SDK (composer require messagebird/sdk) e chame $bird->email->send():
<?php
use MessageBird\Bird;
$bird = new Bird(apiKey: getenv("BIRD_API_KEY"));
$message = $bird->email->send(
from: "onboarding@messagebird.dev",
to: ["delivered@messagebird.dev"],
subject: "Hello from PHP",
html: "<p>It works.</p>",
);
echo $message->getId(), " ", $message->getStatus(), "\n";
O remetente onboarding@messagebird.dev e o destinatário de sandbox delivered@messagebird.dev verificam sua chave API e o payload antes de você configurar um domínio próprio.