Foros del Web » Programando para Internet » PHP »

verificar servidor antes de enviar mail

Estas en el tema de verificar servidor antes de enviar mail en el foro de PHP en Foros del Web. hola maestros . esotoy haciendo un sistema que envia mail , funciona perfecto pero el servidor de correo se cae muy seguidamente. existe la manera ...
  #1 (permalink)  
Antiguo 06/02/2006, 13:16
Avatar de mveraa  
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.895
Antigüedad: 15 años
Puntos: 2
verificar servidor antes de enviar mail

hola maestros .

esotoy haciendo un sistema que envia mail , funciona perfecto pero el servidor de correo se cae muy seguidamente.

existe la manera de saber si el server esta caido para asi estar seguro que el mail llego a destino,

un saludo.
__________________
"Cuando se adelanta un oponente, enfréntalo y salúdalo; si intenta retroceder, déjalo seguir su camino"
  #2 (permalink)  
Antiguo 06/02/2006, 13:33
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 12 años
Puntos: 5
las funciones getmxrr() y checkdnsrr() y aqui te dejo un ejemplo de como verificar si un servidor de correos esta presente para un dominio especifico :
Código PHP:
<?
$email 
"[email protected]";

print(
"Checking: $email<br>");

if (
eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$"$email)) {

   print(
"Format Test: PASSED<br>");
   print(
"Online host verification Test...<br><br>");
   print(
"MX Records for: $email<br>");
  
   list(
$alias$domain) = split("@"$email);
  
   if (
checkdnsrr($domain"MX")) {
  
       
getmxrr($domain$mxhosts);
      
       foreach(
$mxhosts as $mxKey => $mxValue){
           print(
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mxValue<br>");
       }
      
       print(
"Online host verification Test: PASSED<br><br>");
       print(
"Email Status: VALID");
  
   } else {
  
       print(
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No records found.<br>");
       print(
"Online host verification Test: FAILED<br><br>");
       print(
"Email Status: INVALID");
  
   }

} else {

   print(
"Format Test: FAILED<br><br>");
   print(
"Invalid email address provided.<br><br>");
   print(
"Email Status: INVALID");
  
}
?>
cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #3 (permalink)  
Antiguo 06/02/2006, 13:49
Avatar de mveraa  
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.895
Antigüedad: 15 años
Puntos: 2
muchas gracias por tu ayuda.

chequeare el codigo.

un saludo.
__________________
"Cuando se adelanta un oponente, enfréntalo y salúdalo; si intenta retroceder, déjalo seguir su camino"
  #4 (permalink)  
Antiguo 06/02/2006, 14:05
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 13 años
Puntos: 34
Ese código checkea que el dominio de un email exista, nada mas (si me equivoco corrijanme), y lo que necesita mveraa es saber si el smtp esta en pie.
Lo que se me ocurre es hacer un primer envío a una cuenta tuya y ver si la función email() (estimo que usas esta) funciono. Para saber haces un simple if sobre esta, ya que da true en caso de entregar el mensaje al smtp, o false si no lo hace. Ej:
<?
if( mail( ... ) === false ){ echo "El server smtp seguramente esta caído"; exit ;}
...
Todo el resto de tu envio de email.
...
?>
Para testearlo sería bueno que apagues el smtp, si no tiene acceso intentalo en tu máquina.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 06/02/2006, 14:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En principio si el MTA (Mail Transfer Agent) que usa PHP está funcionado . .PHP entregará el e-mail y la función mail() devolverá "true" (es un "boolean").

Esto no asegura que llegue el e-mail a su destinatario .. sólo que PHP consiguió entregar el e-mail a MTA que use en su configuración.

Si quieren algo más preciso .. el envio del e-mail debería ser directo por SMTP .. por ejemplo usando:

PHP Mailer
http://phpmailer.sourceforge.net

De esta forma se envia el e-mail directamente por sockets al servidor SMTP que lo envie. Directamente se pueden ver mejor errores de conexión o similares.

La opción de deadlykyo está bien cuando queremos chekear si el destinatario (servidor) existe .. o el usuario en ese servidor .. por ejemplo.

Un saludo,
  #6 (permalink)  
Antiguo 06/02/2006, 15:34
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 12 años
Puntos: 5
bueno creo que tienen razon en eso, me confundi en lo que pedia pero, creo lo que ella quiere es verificar si el server esta en linea para poder enviar su correo, lo unico que se me ocurre hacer un ping al dominio que te den y ver si te devuelve respuesta si es asi entonces ya tienes verificado que el server del correo esta online:

Código PHP:
<?
....
$host=gethostbyname("mx.hotmail.com");
$resShell shell_exec("ping -c2 -w2 $host");
if(
strpos($resShell'0 received')) 
{
  
//el servidor esta abajo
}
con esto verias si el host esta online, bueno espero que te ayude, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #7 (permalink)  
Antiguo 07/02/2006, 05:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Con el "ping" sólo no ves si hay problemas temporales con el servidor .. o si te están aplicando alguna restricción ...

Lo ideal sería hacer una conexión por sockets y recibir el mensaje de error/exito que la conexión devuelve (el mismo que ves si haces un telnet a ese host y puerto).

La classe "PHP Mailer" hace eso mismo.

Un saludo,
  #8 (permalink)  
Antiguo 06/03/2006, 06:07
Avatar de mveraa  
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.895
Antigüedad: 15 años
Puntos: 2
por el escaso tiempo que tengo no creo que alcance a hacer funcionar el phpmailer en esta primera etapa del proyecto . asi que les pido que me orienten es lo siguiente.

estoy haciendo una aplicacion flash+php+mysql todo funciona ok hasta que el servidor de correo cae . entonces mi pregunta es

¿como puedo evitar que aunque exista un error en el servidor de correo la aplicacion siga tal cual pasando por alto el error.?


pretendo por ejemplo si existe error que guarde el mail en bd y posteriormente lo envie.


intente con error_reporting(0) pero sucede los mismo.

lo que hago actualmente(hasta que veo el phpmailer) es si hay problemas comentar la linea que llama a la funcion que envia el mail.

un saludo.
__________________
"Cuando se adelanta un oponente, enfréntalo y salúdalo; si intenta retroceder, déjalo seguir su camino"
  #9 (permalink)  
Antiguo 06/03/2006, 06:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Yo te insisto ..

PHP Mailer controla los mensajes de error .. así que tu mismo puedes hacerte tu "if()" tipo:

if ($mail->send()){
// es envió el e-mail ...
} else {
// hay problemas . .tu veras como gestionas el error ...
}

Y listo. De hecho en "PHP Mailer" para "ver" el mensaje de error es necesario usar otro método que dispone para verlo físicamente ..

Y si no quieres usar "PHP Mailer" .. usa mail() con un @ delante para omitir todo mensaje de error que pueda producirse:

if (@mail(..........)){
// se envió el e-mail ..
} else {
// no se envió.
}


Un saludo,
  #10 (permalink)  
Antiguo 06/03/2006, 06:59
Avatar de mveraa  
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.895
Antigüedad: 15 años
Puntos: 2
De acuerdo

muchas gracias cluster.


un saludo.
__________________
"Cuando se adelanta un oponente, enfréntalo y salúdalo; si intenta retroceder, déjalo seguir su camino"
  #11 (permalink)  
Antiguo 06/03/2006, 10:56
Avatar de mveraa  
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.895
Antigüedad: 15 años
Puntos: 2
ya , ahora lo probe usando phpmailer

en este momento se cayo el server pero aun asi se cae lo que hago .

//esto muestra al ejecutar el test.php que usa la clase(en servidor caido).

Warning: fsockopen(): unable to connect to mail.munistgo.cl:25 in c:\php\www\seguimientos2\procedimientos\phpmailer\ phpmailer\test\class.smtp.php on line 105

Fatal error: Maximum execution time of 30 seconds exceeded in c:\php\www\seguimientos2\procedimientos\phpmailer\ phpmailer\test\class.smtp.php on line 101





probe con dos cambios:


1) if (@mail ($destino, $subject, $message, $additional_headers))
2) enviando un mail usando la clase mencionada .


nota: ambas formas me funcionan bien cuando el server esta ok.
me esta dando la impresionn que es un error mas grave que simplemente el server de correo caido.


un saludo
__________________
"Cuando se adelanta un oponente, enfréntalo y salúdalo; si intenta retroceder, déjalo seguir su camino"
  #12 (permalink)  
Antiguo 06/03/2006, 11:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La opción de uso de PHP Mailer .. el error que reporta es "critico" .. debería controlarlo a base de "timeout". Vi un poco por encima el código de la sub-classe smpt y tiene bastantes controles para tratar los mensajes de error ..

Tiene una variable para controlar supuestamente el "timeout" de la conexión SMTP .. es decir. Podrías ajustarlo (a menos de 30 segundos por qué sino es PHP el que termina la ejecución del script a no ser que lo ajustes a su vez con set_time_limit())

$mail->$Timeout = 10;

La segunda opción con mail() y su @ ... no comentas como te fué .. supongo que bien .. es decir no mostrarías ningún mensaje si el MTA no funciona.

Por otro lado . .no sé si conocías pero PHP Mailer puede enviar e-mails usando la función mail() de PHP original (con todas las mejoras que aporta a nivel de archivos adjuntos y demás ...) o usar SendMail si lo usas en tu servidores.

Un saludo,
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 20:19.