Foros del Web » Programando para Internet » PHP »

¿Cómo comprobar si se puede enviar un email?

Estas en el tema de ¿Cómo comprobar si se puede enviar un email? en el foro de PHP en Foros del Web. Estoy creando un script que tiene que enviar un email a los usuarios que se registran con el link para activar sus cuentas. El problema ...
  #1 (permalink)  
Antiguo 10/01/2009, 02:14
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 17 años, 11 meses
Puntos: 18
¿Cómo comprobar si se puede enviar un email?

Estoy creando un script que tiene que enviar un email a los usuarios que se registran con el link para activar sus cuentas.

El problema que tengo es que no sé cómo comprobar que el email se puede enviar, es decir, yo tengo el servidor SMTP configurado, y mi script puede enviar emails, pero necesito que pueda comprobar mediante PHP que el email se pueda enviar, para que en el caso de que no se pueda enviar, los usuarios no tengan que activar su cuenta.

¿Cómo puedo comprobar mediante PHP si el servidor SMTP funciona y se puede enviar un email?
  #2 (permalink)  
Antiguo 10/01/2009, 09:31
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: ¿Cómo comprobar si se puede enviar un email?

Sumolari:
Considerando que el correo tiene dos etapas esenciales y medulares, tu pregunta se puede contestar en dos puntos basicos.
AREA LOCAL INTERNA:
1.- la funcion mail() o imap_mail() en caso tengas instalada la libreria imap, y si haces un if(mail(............)) {.....}.
Es importante notar que este envio inicial tiene que ver entre tu script o codigo y el servidor de correo o SMTP instalado ya sea en tu computadora o localhost o instalado en un sitio remoto como por ejemplo tu ISP o google.com en caso tengas cuenta con ellos.
Esto es rechazado cuando tu servidor de correo o SMTP determina que, entre otras cosas, el dominio esta mal escrito, (Ejemplo: goggle.xyz) o porque hay error en la escritura del correo de destino (Ejemplo: no contiene @) o porque no hay asunto ni mensaje a enviar o porque tu IP no esta autorizada para utilizar ese servidor, etc
AREA EXTERNA:
2.- Una vez que tu servidor de correo ha aceptado para su envio el correo que tu script o codigo le ha enviado, este servidor debera cumplir con los requisitos impuestos, por lo que podremos razonablemente llamar la industria de los correos electronicos; que dentro de los requisitos estan, entre otros, la utilizacion del puerto 25 para el intercamcio de comunicacion, la necesidad que la IP que utiliza el servidor no este listada en alguna de esas bases de datos de SPAM, la necesidad de que la IP tenga el debido reverso, los records SPF, un dominio que no este blacklisted y que exista y finalmente lo que se llama greylisting que no es mas que el correo contenga su asunto, mensaje y cabeceras adecuadamente configurados y listos para enviar.
El rechazo del servidor de destino es comunicado al servidor que envia y tu script o codigo NO tiene forma directa para saber el status del correo en determinado momento; en este caso me refiero especificamente a cuando fue entregado (Tiempo), si fue retrasada su recepcion para proxima conexion, rechazo total del correo por alguna de las razones expuestas arriba.
FINALMENTE, EL RECHAZO TAMBIEN DEPENDE DE LA FORMA DE CONFIGURAR NO SOLO EL SERVIDOR DE CORREO QUE ENVIA SINO QUE TAMBIEN EL SERVIDOR DE CORREO QUE RECIBE.
3.- Hay formas que un servidor de correo que envia pueda notificarte si un correo falla, pero ya en esos casos entramos en la administracion de un servidor de correo profesional que tenga esta opcion dentro de sus archivos de configuracion.
Saludos
Y espero te ayude
Franco
  #3 (permalink)  
Antiguo 10/01/2009, 13:14
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 17 años, 11 meses
Puntos: 18
Respuesta: ¿Cómo comprobar si se puede enviar un email?

¡Gracias por la respuesta!

Bien, usando un if(mail(... podría saber si el correo que envío ha pasado la fase interna (que es la que me interesa verificar), el problema es que usando ese código enviaría un email, cuando lo que me interesa es comprobar que el email podría enviarse.

Algo como extension_loaded (que también lo uso para comprobar si está diponible la extensión GD), pero paracomprobar si podría enviar emails.

Así que tengo dos dudas:

¿Puedo enviarle un email a nadie (para hacer el if(mail(...)) sin tener que enviar un email a una cuenta de correo activa)?

¿Hay algo como extension_loaded para comprobar si se puede enviar un email (obviamente la parte interna)?
  #4 (permalink)  
Antiguo 10/01/2009, 15:35
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: ¿Cómo comprobar si se puede enviar un email?

sumolari:
Para responder tu primara pregunta, debo, antes que nada, hacerte ver que NO hay dos servidores de correo que sean identicos y por ende
podrian haber servidores de correo deficientes que acepten el primer paso aun cuando NO se pueda enviar el correo.
En este caso el servidor recibe el correo y posteriormente fracaza en el envio efectivo.
Tu codigo o script retorno un true ante el if( con la funcion mail.
Pero que si el correo llego al destinatario solo lo puede saber LOS ADMINISTRADORES DEL SERVIDOR DE CORREO.
Un servidor de correo profesional como las decenas que hay en el mercado muy probablemente te rechazan el correo y por ende tu script o codigo reporta un false y tu recibes la respuesta en tu navegador que el correo ha fracazado en su primer y fundamental fase; Nuevamente los asuntos entre el servidor tuyo y el servidor del destinatario es asunto totalmente diferente.
Espero esta parte haya contestado satisfactoriamente tu primera pregunta.
Tu segunda pregunta, definitivamente se refiere al manejo del script o codigo. Es decir que si tu recibes la direccion de correo via una base de datos o de un form y por ende un html o xhtml o php pagina entonces para evitar que, en su primer paso, el correo sea rechazado, debes validar cada uno de los inputs, me refiero especificamente a direccion de correo, asunto, mensaje y cabeceras!!!. Hay una inmensa cantidad de pequeños codigos o scripts que validan direcciones de correos en lo referente a que contengan al menos un @ y un punto, etc etc.
Ahora, si se diera el caso que un usuario te haya dado una direccion de correo inexistente, ejemplo [email protected] (Supongamos que no existe en google.com); en este caso el servidor de correo lo tomara como bueno y procedera al segundo paso para despues recibir un rechazo total, del cual tu desde tu scipt o codigo NO tendras forma de saberlo a menos que tengas total control del servidor de correo que pretendia enviar hacia google.com
Espero esto haya contestado, al menos parcialmente, tu segunda pregunta.
Finalmente, es valido decir que el tema de los correos, su diseño, configuracion y envio exitoso es un tema profundo, interesante y lleno de muchas cosas interesantes.
Saludos
Franco
P.S. Como te podrias imaginar el envio de documentos adjuntos al correo plantea un gran reto para el programador.
Es curioso que cuando alguien pretende enviar un documento adjunto, de pronto todo parece bien y la funcion mail() no reporta error y el archivo nunca fue realmente adjuntado. Esto te debiera indicar que existe una metodologia especifica e interesante en la forma estandarizada que se deben adjuntar archivos.
  #5 (permalink)  
Antiguo 10/01/2009, 19:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: ¿Cómo comprobar si se puede enviar un email?

Lo que puedes hacer es usar fsockopen y abrir una conexion al servidor SMTP configurado en el php.ini usando ini_get, si te responde correctamente es que existe, y entonces ya configuras la logica para usar mail(), si no te responde o esta vacia la cadena es que no hay un servidor SMTP configurado.

Saludos
  #6 (permalink)  
Antiguo 11/01/2009, 02:03
Avatar de sumolari  
Fecha de Ingreso: mayo-2006
Ubicación: localhost
Mensajes: 1.367
Antigüedad: 17 años, 11 meses
Puntos: 18
Respuesta: ¿Cómo comprobar si se puede enviar un email?

¡¡Muchas gracias a los dos, creo que ya estoy solucionando el problema!!

He usado la idea que ha propuesto GatorV así:

Código PHP:
$smtp ini_get('SMTP');
$da fsockopen($smtp'25'$errno$errstr'10'); 
Y ya he conseguido distinguir cuándo está el servidor SMTP funcionando y cuando no lo está.

Ahora la única duda que me queda es si esto también funciona en Linux, me explico:

Cuando he comenzado a aplicarlo, no funcionaba, ya que el servidor SMTP era localhost y nunca podía conectarse a él, así que he entrado en el php.ini y lo he cambiado por 127.0.0.1 (ahora sí que funciona bien), y aparecía un aviso sobre que era sólo para Win32:

Cita:
[mail function]
; For Win32 only.
SMTP = 127.0.0.1
smtp_port = 25
¿Este código funcionará en servidores Linux?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:56.