todas las guías

// cómo solucionarlo

PHPMailer "SMTP Error: Could not authenticate": cómo solucionarlo

¿PHPMailer falla con SMTP Error: Could not authenticate? Activa la depuración y corrige el usuario, el puerto, el cifrado o la configuración del proveedor.

Qué significa

PHPMailer se conectó al servidor SMTP, pero el servidor rechazó el usuario y la contraseña. PHPMailer muestra un mensaje breve:

SMTP Error: Could not authenticate.

Este texto breve oculta el motivo real. La respuesta del servidor (a menudo un código 535) solo se ve con la depuración activada. No lo confundas con SMTP connect() failed, que significa que PHPMailer ni siquiera pudo llegar al servidor (host incorrecto, puerto bloqueado, problema de TLS).

Por qué ocurre

  • Usuario o contraseña incorrectos. La mayoría de los proveedores piden la dirección de email completa como usuario. Las contraseñas con caracteres especiales pueden cortarse o alterarse al guardarlas en un archivo .env o en una configuración con comillas.
  • El proveedor ya no acepta la contraseña normal. Gmail exige una contraseña de aplicación (consulta Gmail 535 5.7.8 username and password not accepted). Microsoft 365 suele tener SMTP AUTH desactivado (consulta Microsoft 365 535 5.7.139).
  • Credenciales SMTP específicas. Servicios como Amazon SES, SendGrid o Mailgun usan credenciales SMTP dedicadas, no el usuario de tu cuenta (para SES, consulta Amazon SES 535 credenciales no válidas).
  • Combinación incorrecta de puerto y cifrado. El puerto 465 necesita TLS implícito (ENCRYPTION_SMTPS); el puerto 587 necesita STARTTLS (ENCRYPTION_STARTTLS). Algunos servidores no ofrecen el inicio de sesión hasta que el cifrado está activo.
  • El hosting redirige el SMTP. Algunos hostings compartidos envían todo el SMTP saliente a su propio servidor. Tu inicio de sesión llega entonces al servidor equivocado y falla.
  • Cuenta bloqueada tras demasiados intentos fallidos, o por una comprobación de seguridad del proveedor.

Cómo comprobarlo

Activa la depuración para una prueba (no la dejes nunca activada en producción, muestra el intercambio de inicio de sesión):

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->SMTPDebug  = SMTP::DEBUG_SERVER;
$mail->Host       = 'smtp.example.com';
$mail->Port       = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth   = true;
$mail->Username   = 'you@yourdomain.com';
$mail->Password   = getenv('SMTP_PASSWORD');

Lee las líneas que empiezan por SERVER -> CLIENT:

  • Una línea 535 después de AUTH da el motivo del proveedor (credenciales incorrectas, contraseña de aplicación obligatoria, SMTP AUTH desactivado…).
  • Si el saludo 220 o el certificado muestran un nombre de host que no es el de tu proveedor, tu hosting está redirigiendo el SMTP.
  • Si no aparece AUTH en la lista 250 después de EHLO, el servidor no ofrece el inicio de sesión en este puerto o antes de TLS.

Prueba el mismo usuario fuera de PHP con swaks, desde el mismo servidor:

swaks --server smtp.example.com:587 --tls --auth LOGIN \
  --auth-user you@yourdomain.com --to you@yourdomain.com

Si swaks funciona, el problema está en tu configuración PHP (comillas de la contraseña, variable incorrecta). Si swaks también falla, el problema es la cuenta o el proveedor.

Cómo solucionarlo

  1. Usa exactamente la configuración de tu proveedor: host, puerto, cifrado y formato del usuario según su documentación.
  2. Guarda la contraseña de forma segura y comprueba que se lee correctamente (muestra su longitud durante una prueba, no la contraseña).
  3. Usa el tipo de credencial correcto: una contraseña de aplicación para Gmail, credenciales SMTP para SES u otros servicios, y SMTP AUTH activado en el buzón para Microsoft 365. PHPMailer también admite OAuth2 (XOAUTH2) para Gmail y Microsoft 365 si prefieres no usar contraseñas.
  4. Combina bien puerto y cifrado: 587 con ENCRYPTION_STARTTLS, o 465 con ENCRYPTION_SMTPS.
  5. En un hosting compartido, pregunta si el SMTP saliente se redirige, y usa su servidor SMTP o permite el SMTP externo en el panel si lo ofrecen.
  6. Desbloquea la cuenta si el proveedor la bloqueó, y vuelve a intentarlo una sola vez, no en bucle.

Cuando el correo ya salga, asegúrate de que está autenticado para tu dominio; los formularios de contacto y las webs WordPress tienen trampas adicionales, explicadas en los emails de tu web van a spam.

Comprueba que está solucionado

Vuelve a ejecutar el script con la depuración activada: deberías ver 235 Authentication successful (la redacción varía) y después 250 tras los datos del mensaje. Pon como destinatario la dirección única de la página de inicio de Delivmail y lee el informe para comprobar SPF, DKIM y DMARC. Después desactiva la depuración y envía al destinatario real.

Comprueba que está solucionado

Un cambio de DNS puede tardar de unos minutos a unas horas. Después, envía un nuevo email de prueba o vuelve a escanear tu dominio.

Guías relacionadas