// 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
.envo 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
535después deAUTHda el motivo del proveedor (credenciales incorrectas, contraseña de aplicación obligatoria, SMTP AUTH desactivado…). - Si el saludo
220o el certificado muestran un nombre de host que no es el de tu proveedor, tu hosting está redirigiendo el SMTP. - Si no aparece
AUTHen la lista250después deEHLO, 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
- Usa exactamente la configuración de tu proveedor: host, puerto, cifrado y formato del usuario según su documentación.
- Guarda la contraseña de forma segura y comprueba que se lee correctamente (muestra su longitud durante una prueba, no la contraseña).
- 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.
- Combina bien puerto y cifrado: 587 con
ENCRYPTION_STARTTLS, o 465 conENCRYPTION_SMTPS. - 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.
- 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
- Los emails de tu web o de WordPress van a spamLos formularios de contacto, las confirmaciones de pedido y los restablecimientos de contraseña que envía tu web suelen acabar en spam. Envíalos mediante SMTP autenticado o un servicio de email transaccional.
- Amazon SES SMTP "535 Authentication Credentials Invalid": cómo solucionarloAmazon SES rechaza tu inicio de sesión SMTP con 535 Authentication Credentials Invalid. Usa credenciales SMTP reales, la región y el endpoint correctos, y pruébalas.
- Amazon SES "Throttling: Maximum sending rate exceeded" (454): cómo solucionarloAmazon SES devuelve "Maximum sending rate exceeded" o "Daily message quota exceeded". Revisa tus cuotas, reduce la velocidad de envío y pide un aumento.
- Mailgun "401 Forbidden": clave de API incorrecta o región UE/EE. UU. equivocadaMailgun devuelve 401 Forbidden o Unauthorized. Revisa el tipo de clave de API, el usuario "api" y si tu dominio usa el endpoint de EE. UU. o de la UE.
- Gmail SMTP "535-5.7.8 Username and Password not accepted" (y 534-5.7.9): cómo solucionarlo¿El inicio de sesión SMTP de Gmail falla con 535-5.7.8 o 534-5.7.9 "Application-specific password required"? Usa una contraseña de aplicación u OAuth.