Correo electrónico

mail() de PHP: qué significa el resultado y cuándo usar SMTP

Revisado el 5 min de lectura php smtp

Función mail() de PHP

PHP permite entregar un mensaje al transporte de correo local mediante mail(). Define siempre un remitente válido y controlado por la aplicación:

$headers = ['From' => 'web@tudominio.com'];
$accepted = mail('email@destino.com', 'Título email', 'Mensaje', $headers);

Un resultado true solo confirma que el sistema local aceptó el mensaje para procesarlo; no demuestra que el servidor destinatario lo haya aceptado ni que haya llegado a la bandeja de entrada.

Problemas generados por el uso de mail()

El punto débil de un envío difícil de diagnosticar es la falta de información sobre lo que sucede después de entregarlo al transporte. Antes de sustituir código, comprueba si el mensaje fue aceptado, rechazado o quedó pendiente.

La función permite construir el encabezado de remitente sin autenticar por sí misma que la aplicación controla ese dominio. No aceptes nunca un valor From proporcionado libremente por el visitante; usa una dirección fija de tu dominio y coloca la dirección del usuario en Reply-To solo después de validarla.

Los proveedores comprueban mecanismos como SPF, DKIM y DMARC, además de la reputación y el formato del mensaje. mail() no configura por sí sola esos mecanismos ni informa del resultado final de la entrega.

Una configuración incompleta puede provocar rechazos o clasificaciones como spam, pero el resultado debe comprobarse en el seguimiento de entrega y en las cabeceras de un envío real.

La idoneidad de mail() no depende de que el destinatario sea propio o externo, sino de cómo esté configurado el transporte local, la autenticación resultante y la capacidad de observar errores y rebotes. Para mensajes importantes, usa un transporte que permita autenticar, registrar el resultado y controlar el remitente.

Correos enviados bajo autenticación SMTP

Una alternativa es el envío mediante SMTP autenticado con una cuenta real creada en cPanel. Usa el hostname con certificado válido indicado en Conectar dispositivos, TLS obligatorio y el puerto seguro recomendado. El From debe ser una dirección controlada y alineada con la cuenta o el dominio autenticado. SMTP mejora el control y la trazabilidad, pero tampoco garantiza que el receptor acepte el mensaje.

No cambies el remitente a una cuenta de Gmail como solución genérica. Gmail puede usarse mediante su configuración SMTP u OAuth cuando la aplicación lo admite, pero un error 401 corresponde a esa autorización y debe resolverse por separado; no diagnostica el transporte local de mail() ni la entrega del destinatario.

Muchas aplicaciones incluyen una opción para configurar SMTP. En Joomla puedes seleccionar ese transporte e introducir el servidor, cifrado y credenciales de la cuenta. Comprueba el resultado con un envío real de la aplicación.

En WordPress puedes utilizar un plugin SMTP compatible, como Easy WP SMTP.

Para desarrollos propios, puedes integrar una biblioteca mantenida como PHPMailer

Preparar el cambio a SMTP

Guarda las credenciales en la configuración privada de la aplicación, fuera del repositorio y del directorio público. Usa una biblioteca mantenida, validación del certificado y el puerto y modo TLS indicados por el proveedor. No desactives la verificación del certificado para ocultar un error de conexión.

Envía una prueba representativa y registra fecha, destinatario e identificador del mensaje sin guardar contraseñas. Comprueba el seguimiento de entrega y el resultado en el receptor. Si tu aplicación reintenta, evita generar duplicados cuando el primer envío ya fue aceptado pero la respuesta se perdió.

No introduzcas datos del formulario sin validar en destinatarios o cabeceras. Para responder al visitante, valida su dirección y úsala como Reply-To, manteniendo un From que controle tu aplicación.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.