«No llega ningún correo» tiene dos causas muy distintas: que el servidor nunca lo enviara, o que lo enviara y el receptor lo rechazara. El registro de correo responde a eso en una línea, y todo lo demás se sigue de la respuesta.

tail -50 /var/log/mail.log
  • status=sent: salió. El problema es la entrega, no el envío: consulta el artículo sobre el correo que acaba en spam.
  • status=bounced: el receptor lo rechazó, y la línea dice por qué.
  • Nada en absoluto: la aplicación nunca entregó nada.

Cuando no llega nada al registro

El mail() de PHP devuelve true cuando el programa de correo local ACEPTÓ el mensaje, que no es lo mismo que enviarlo. Si no hay ningún programa de correo instalado, devuelve false, y casi todas las aplicaciones lo ignoran.

php -r 'var_dump(mail("you@example.com","test","body"));'
which sendmail

Usa SMTP en vez de mail()

Un SMTP autenticado hacia tu propio buzón es más fiable y se entrega mucho mejor: el mensaje va firmado y sale de un servidor con reputación, no de un proceso web.

Host: mail.yourdomain.com
Port: 465 (SSL) or 587 (TLS)
User: the full address
From: the SAME address
La dirección del campo From debe ser un buzón que exista en el dominio remitente. Un formulario que envía con la dirección del visitante falla el SPF en el receptor, porque tu servidor no tiene permiso para enviar en su nombre. Pon al visitante en Reply-To.

Prueba el camino, no el formulario

swaks --to you@example.com --from noreply@yourdomain.com --server mail.yourdomain.com:587 -tls -au noreply@yourdomain.com

Eso prueba SMTP directamente e imprime toda la conversación. Si funciona y el sitio sigue fallando, la avería está en los ajustes de la aplicación, no en el servidor de correo.

Mira la cola además del registro: mailq. Un mensaje atascado en la cola ha sido aceptado y aún no entregado, y la cola nombra el motivo de la espera.