PHP - Explicación de porque con la instrucción mail() no siempre se reciben los correos enviados

 
Vista:
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Explicación de porque con la instrucción mail() no siempre se reciben los correos enviados

Publicado por xve (6935 intervenciones) el 04/12/2015 08:05:33
Veo muchos usuarios que preguntan en el foro sobre problemas con el envío de correos utilizando la instrucción del mail() del PHP

Primeramente os voy a comentar como funciona la instrucción mail(), ya que no funciona como el envío de correo normal que podemos hacer desde nuestro thunderbird, outlook, gmail...

Cuando enviamos un correo con mail(), no especificamos nunca que servidor de correo envía el mensaje, por lo que el servidor, primeramente revisa la configuración de nuestro php.ini, en el grupo de variables [mail function], donde ahí se especifica el servidor a utilizar para el envío de correo, usuario y contraseña del mismo.

Por defecto, sus variables son estas para Windows, ya que las posibles variables para Linux están todas comentadas (http://php.net/manual/es/mail.configuration.php#ini.smtp):
1
2
3
4
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
Esto quiere decir, que no utiliza ninguna servidor en concreto para el envío (por ejemplo, el de nuestro servidor de correo), ni se valida en dicho servidor con ningún usuario ni contraseña.

Todo esto, no quieres decir que el correo no se envié, el correo si se envía correctamente, pero el problema, esta en los servidores que reciben dicho correo.

El problema esta, en que muchos servidores, para impedir la cantidad de spam que recibimos diariamente, utilizan diferentes herramientas para verificar que realmente el correo que se recibe es de una cuenta real, y que la persona que lo envía, realmente sea ella y no otra suplantando el correo.

Una de estas herramientas, es verificar que realmente se envié el correo desde la misma IP donde se encuentra el servidor de correo del usuario que realiza dicho envío (esto se sabe mediante la DNS MX).

Por ejemplo, si nuestro servidor de correo esta en el servidor A y nuestra pagina web en el servidor B, al hacer el envío desde nuestro PHP, la ip sera la del servidor B, no la del servidor A que es donde se encuentra nuestro servidor de correo, por lo que el servidor de correo del destinatario podría eliminar el correo por lo comentado con anterioridad.


Otra de estas herramientas, se llama greylist que la traducción seria algo como "marcado en lista gris" (https://es.wikipedia.org/wiki/Lista_gris).

Esta técnica, es bastante sencilla, y muy útil... su funcionamiento, es que cuando se recibe por primera vez un correo electronico, el servidor de correo contesta al servidor de correo que envío dicho mensaje, que se lo vuelva a enviar. Esta comunicación entre servidores SMTP es correcta y funciona perfectamente, pero que pasa si hemos enviado nuestro correo con al instrucción mail()... que nuestro servidor de correo, no ha enviado dicho mensaje, por lo que no sabe que correo reenviarle por lo que el destinarlo ya no recibe dicho correo.


Estas son las dos herramientas que yo conozco...


La solución, pasa por enviar siempre los correos utilizando nuestro servidor SMTP, de esta manera, saldremos siempre por la IP correcta, y si hay que reenviar la copia de nuestro correo, nuestro servidor de correo lo realizara sin problemas.

Aquí hay un ejemplo muy completo de como enviar correo utilizando nuestro servidor SMTP:
http://www.lawebdelprogramador.com/codigo/PHP/1884-Envio-de-correo-mediante-servidor-SMTP.html


Espero que ayude a entender porque no siempre llegan los correos utilizando la instrucción mail()

Cualquier duda...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder