La función integrada mail() de PHP entrega los mensajes al binario local sendmail sin autenticación SMTP, sin negociación TLS y sin reporte estructurado de errores. PHPMailer añade a las aplicaciones PHP un cliente SMTP, formato MIME y soporte para adjuntos.
¿Cómo instalas PHPMailer?
Usa Composer:
composer require phpmailer/phpmailer
Luego carga el autoloader e importa las clases que necesitas:
<?php
require "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
¿Cómo configuras SMTP y envías un mensaje?
Crea una instancia de PHPMailer, cámbiala al modo SMTP con isSMTP() y configura los campos de conexión y mensaje. Envuelve la llamada en try/catch para que un envío fallido se reporte en lugar de pasar desapercibido:
<?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}";
}
Ajusta SMTPSecure al puerto de tu servidor: ENCRYPTION_STARTTLS en el puerto 587 convierte una conexión sin cifrar en TLS, y ENCRYPTION_SMTPS en el puerto 465 negocia TLS de inmediato. Al configurar isHTML(true), Body se marca como HTML y AltBody se incluye como parte en texto plano para los clientes que no muestran HTML. Incluir ambas partes también mejora la entregabilidad. Si pasas true al constructor, los fallos lanzan una Exception en lugar de devolver false.
¿Cómo agregas un adjunto?
Llama a addAttachment con una ruta de archivo antes de send():
<?php
$mail->addAttachment("./invoices/invoice-1042.pdf", "invoice.pdf");
El segundo argumento renombra el archivo tal como lo ve el destinatario. Puedes llamarlo más de una vez para varios adjuntos.
Envíalo con Bird
Para enviar correo electrónico desde PHP mediante HTTPS sin gestionar una conexión SMTP, instala el SDK de PHP de Bird (composer require messagebird/sdk) y llama a $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";
El remitente onboarding@messagebird.dev y el destinatario de sandbox delivered@messagebird.dev te permiten comprobar tu clave de API y el contenido de la solicitud antes de configurar un dominio propio.