Foros del Web » Programando para Internet » PHP »

Obtener el resultado del envio en PHP

Estas en el tema de Obtener el resultado del envio en PHP en el foro de PHP en Foros del Web. Buenas tardes, no se si lo que quiero es o no posible, me gustaría saber si es posible recoger el resultado del envio smtp (mediante ...
  #1 (permalink)  
Antiguo 24/02/2009, 09:46
 
Fecha de Ingreso: enero-2002
Mensajes: 182
Antigüedad: 22 años, 2 meses
Puntos: 0
Obtener el resultado del envio en PHP

Buenas tardes, no se si lo que quiero es o no posible, me gustaría saber si es posible recoger el resultado del envio smtp (mediante mail() o phpmailer()) es decir capturar los errores 500, 400 etc.. que da el servidor destino.

Un saludo.
  #2 (permalink)  
Antiguo 24/02/2009, 10:57
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: Obtener el resultado del envio en PHP

Hola Bibliotec,

No es posible, ese control ya esta fuera de PHP.

Saludos
  #3 (permalink)  
Antiguo 24/02/2009, 11:43
 
Fecha de Ingreso: enero-2002
Mensajes: 182
Antigüedad: 22 años, 2 meses
Puntos: 0
Respuesta: Obtener el resultado del envio en PHP

Y con cuaqluier otro lenguaje (ASP, .NET), una empresa de desarrollo web me ha dicho que puede facilitarme estos datos mediante la aplicación Web no se si es un desvario del comercial o es posible de algún modo.
Un saludo y gracia spor tu respuesta.
  #4 (permalink)  
Antiguo 24/02/2009, 12:05
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: Obtener el resultado del envio en PHP

Es independiente el lenguaje, lo que tienes que hacer es hacer un bot que este monitoreando la cuenta postmaster, o sea sí es posible con PHP pero no hay una función tal cual, necesitas crear un cliente IMAP, para conectarte a la cuenta Postmaster, ahí lees cuando hay un rebote de un correo, parseas el email y almacenas la respuesta en una bdd, o en un archivo y luego con eso creas tus estadisticas.

Hace unas semanas alguién tuvo la misma duda, y le deje unos links hacia los RFC de como parsear los emails, en el Manual de PHP viene la referencia para las funciones IMAP.

Saludos
  #5 (permalink)  
Antiguo 24/02/2009, 14:04
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 5 meses
Puntos: 4
Respuesta: Obtener el resultado del envio en PHP

yo tambien estudie eso en su tiempo para unos jodidos spamers xD

hay varias aplicaciones en php, script y clases.

lo que basicamente necesitas saber es que cuando envias un email hay una comunicacion entre el cliente y el servidor, muy similar a lo que es con http

yo en su tiempo hice unos tests ocupando fsockopen

lo que haces es que abres una conexion directa con el servidor que recibe el correo osea emulas un servidor smtp, entonces utilizas los comandos de smte para enviar el correo y a medida que vas enviando comandos o datos, el servidor te va dando respuestas.

haber incluso te puedes conectar a un servidor pop3 o imap con telnet y vas escribiendo los comandos y el servidor te responde como si fuera una consola

puedes probar instalando argosoft mail server (creo que todavia tienen una version gratis) entonces haces o pruebas el script contra tu servidor de correos y vas depurando la info que llega (la mayoria de los servidores de correo tienen un modo para ver en tiempo real los conandos que se estan ejecutando)

tambien puedes ir a phpclasses y buscar las librerias que hay, recuerdo que ocupe una que funciono super bien y que era muy facil, busca por "smtp server php" en google o "smtp" en phpclasses
__________________
Ayuda!! firmar y compartir
No a la privatizacion de semillas http://www.thepetitionsite.com/1/no-...n-de-semillas/
Mas info: http://chilesintransgenicos.cl/
  #6 (permalink)  
Antiguo 24/02/2009, 18:38
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 17 años, 11 meses
Puntos: 33
Respuesta: Obtener el resultado del envio en PHP

bibliotec:

Pareciera que lo que tu quieres saber es si el cliente abrio el correo
o bajo el adjunto que le mandastes.
De esa manera puedes depurar tu lista de destinos.

Si es asi, puedes hacer lo siguiente ->
1.- Envias un mensaje de correo (html)
y al $mensaje le agregas algo asi:
$mensaje .= "<br><img src=\"http://tudominio.com/.../CorreoDos.php?uno=$codigohoy\">";
2.- Cuando el usuario abre el correo activa este enlace que llama
a CorreoDos.php con la variable uno que lleva un codigo.
3.- Inmediatamente se establece conexion con CorreoDos.php
y recibe la variable uno que acto seguido valida con el codigo enviado.
4.- El archivo CorreoDos.php puede contener lo siguiente ->
a.- La debida recepcion de la variable
b.- una validacion para evitar abusos
c.- Un envio automatico de correo usando mail() hacia tu correo
o si tenes un API para SMS un envio de mensaje de texto instantaneo
a tu celular. El mensaje dira que acaban de ver el correo xxxxx.
5.- Para que el usuario reciba una imagen pequeña y verdadera
al final del archivo CorreoDos.php
pones
header('Location: celular.gif');
NOTA: No puedes usar echo ni print antes de esta ultima sentencia.

Para archivos adjuntos se hace algo similar.

Esto lo he probado con los cuatro grandes del correo
y funciona sin problemas(gmail, hotmail, yahoo y aol)
Asi controlo al 100% los correos enviados.

Saludos
Franco
  #7 (permalink)  
Antiguo 24/02/2009, 18:45
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 17 años, 11 meses
Puntos: 33
Respuesta: Obtener el resultado del envio en PHP

Bibliotec:

Lo que el amigo Remsankar quiere decir es que una conexion con sockets
para enviar correos hacia destinos variados conlleva algo asi ->

ESTA ES UNA TIPICA CONEXION CON UN SERVIDOR SMTP!!)
//Solicitamos logeo por autenticacion!
fputs($conexionsmtp,"AUTH LOGIN" . $nuevalinea);
$respuestasmtp = fgets($conexionsmtp, 515);
$ArrayLogeo['solicitarautenticacion'] = "$respuestasmtp";

//Enviamos el Nombre de Usuario
fputs($conexionsmtp, base64_encode($nombreusuario) . $nuevalinea);
$respuestasmtp = fgets($conexionsmtp, 515);
$ArrayLogeo['usuarioautenticacion'] = "$respuestasmtp";

//Enviamos la Contraseña
fputs($conexionsmtp, base64_encode($contrasena) . $nuevalinea);
$respuestasmtp = fgets($conexionsmtp, 515);
$ArrayLogeo['contrasenaautenticacion'] = "$respuestasmtp";

Como es facil observar las respuestas son guardadas en un arraylogeo
y puedes saber las contestaciones del servido receptor; pero aqui
nos estamos metiendo en el corazon del diseño de servidores de correo
que no deja de ser harto complicado.

Reitero que mi sistema anterior es eficaz, eficiente y probado.

Saludo
Y espero nos ayude a todos.
Franco

P.S. Aqui te incluyo una tipica conexion SMTP entre el que pretende enviar un correo y el que recibe;
es curioso obserbar que NO tomo ni un segundo.
04 21:41:08.85:3876: SurgeSMTP 3.9c-1, User connected (123.456.789.012) (999.999.999.999)
04 21:41:08.87:3876: smtp:[123.456.789.012] In: AUTH LOGIN
04 21:41:08.87:3876: smtp:[123.456.789.012] Out: 334 VXNlcm5hbWU6
04 21:41:08.87:3876: smtp:[123.456.789.012] Out: 334 UGFzc3dvcmQ6
04 21:41:08.87:3876: scmd_auth login (franco123) ****
04 21:41:08.87:3876: after call to default domain username=(franco123)
04 21:41:08.87:3876: doing domuser lookup with ([email protected]) username=franco
04 21:41:08.87:3876: scmd: smtp auth trying (franco123)
04 21:41:08.87:3876: scmd: user (franco123) pre () dom (misitio.net)
04 21:41:08.87:3876: scmd: auth (franco123) (misitio.net) OK Cached lookup
04 21:41:08.87:3876: user_send_max: ([email protected]) has max of (5000)
04 21:41:08.87:3876: user_send_rule: ([email protected]) can send to (*)
04 21:41:08.87:3876: smtp:[123.456.789.012] Out: 235 login succeeded
04 21:41:08.87:3876: smtp:[123.456.789.012] In: HELO localhost
04 21:41:08.87:3876: smtp:[123.456.789.012] Out: 250 misitio.net. Hello localhost (999.999.999.999)
04 21:41:08.87:3876: smtp:[123.456.789.012] In: MAIL FROM: <[email protected]>
04 21:41:08.87:3876: scmd: check ban list ([email protected])(<[email protected]>)
04 21:41:08.87:3876: smtp:[123.456.789.012] Out: 250 Command MAIL OK
04 21:41:08.87:3876: smtp:[123.456.789.012] In: RCPT TO: <[email protected]>
04 21:41:08.87:3876: user_send_max: Check limit for ([email protected]) max=5000 user_max=5000
04 21:41:08.87:3876: user_send_max: ([email protected]) is up to 6 out of 5000
04 21:41:08.87:3876: user_send_max: Check limit for ([email protected]) max=500 user_max=5000
04 21:41:08.87:3876: g_user_send_warning: ([email protected]) is up to 6 out of 500
04 21:41:08.87:3876: guess: istrusted=1 loggedin=1
04 21:41:08.87:3876: check rcpt ([email protected]) from (<[email protected]>)
04 21:41:08.87:3876: user_send_max: ([email protected]) add 1.
04 21:41:08.89:3876: response good 250 local recipient ok
04 21:41:08.89:3876: smtp:[123.456.789.012] Out: 250 local recipient ok
04 21:41:08.89:3876: smtp:[123.456.789.012] In: DATA
04 21:41:08.89:3876: scmd: recipient max_in 20971520
04 21:41:08.89:3876: scmd: local_from was happy
04 21:41:08.89:3876: smtp:[123.456.789.012] Out: 354 Command DATA Start mail input; end with <CRLF>.<CRLF>
04 21:41:08.89:3876: Fixing bare lf chars in message
04 21:41:08.89:3876: scmd: Data received 455 bytes 0k/sec OK
04 21:41:08.89:3876: Adding header (X-Originating-IP: 123.456.789.012)
04 21:41:08.89:3876: badfrom 0 badmx 0 badfrommx 0
04 21:41:08.89:3876: not applying badfrom_check as spam_allow matched 74036260
04 21:41:08.89:3876: scmd: Message submitted [1914] OK msg_que_later
04 21:41:08.89:3876: scmd: recipient state [1914] Stored (<[email protected]>)
04 21:41:08.89:3876: smtp:[123.456.789.012] Out: 250 message sent ok
04 21:41:08.89:3876: smtp:[123.456.789.012] In: QUIT
04 21:41:08.89:3876: smtp:[123.456.789.012] Out: 221 Command QUIT, disconnecting
04 21:41:08.89:3876: smtp: Closing connection 123.456.789.012, task took 0 seconds

Última edición por franco190453; 24/02/2009 a las 19:02
  #8 (permalink)  
Antiguo 25/02/2009, 02:42
 
Fecha de Ingreso: enero-2002
Mensajes: 182
Antigüedad: 22 años, 2 meses
Puntos: 0
De acuerdo

Muchisimas gracias a todos, lo que quiero hacer va mas en la línea de Remsankar, lo que me comentas franco190453 ya lo he usado pero ahora lo que necesito es controlar los errores de recepción, correos llenos etc. Lo último que me comentas es muy interesante voy a estudiar toda la información que me habeis pasado para haceros mas preguntas, de nuevo muchs gracias a los tres.

He descargado y he estado probando la clase SMTP E-mail sending class, he realizado un par de pruebas y tengo un problema con servidores que requieren autenticación me da el siguiente error:

"535 5.7.0 Error: authentication failed: authentication failure"

Hago un include de la clase sasl para autenticar.

¿Sabeis como solucionarlo de forma sencilla?

Un saludo y gracias.

Ya se pq es se produce al ejecutar el php fuera del equipo donde esta el smtp ¿esto se puede salvar de alguna manera?

Bueno parece que esta clase finalmente tampoco me sirve ya que solo me da información de conexión con servidor de envio no con el de recepción, sabeis alguna que haga la otra parte tb.
Gracias.

Prueba con seguimiento del mensaje:

Código:
<?php
//Abrimos la conexión 
$Conexion = fsockopen("smtp.miservidor.com","25"); 

//Sacamos el contenido de lo que nos devuelve el servidor antes de seguir 
$str_recibe = fgets($Conexion,256); 
echo "<p>"; 
print_r($str_recibe); 
echo "</p>"; 

//Esta es la cadena que dice "Hola". 
		$str_hola = "EHLO programacion.comrn"; 
		if(!fputs($Conexion,$str_hola)) { 
		echo "Imposible decirle hola al servidor."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}

		$strMAIL = "MAIL FROM: [email protected] \r\n";
		if(!fputs($Conexion,$strMAIL)){
		echo "Imposible establecer el origen."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}

		$strRCPT .= "RCPT TO: [email protected] \r\n";
		if(!fputs($Conexion,$strRCPT)){
		echo "Imposible establecer el origen."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}


		$strDATA1 = "DATA\r\n";
		if(!fputs($Conexion,$strDATA1)){
		echo "Error."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}

		
		$strS = "Subject: Prueba de correo \r\n\r\n";
		if(!fputs($Conexion,$strS)){
		echo "Imposible establecer el asunto."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}
		
		$strDATA2 = "Esto es una prueba. \r\n.\r\n";
		if(!fputs($Conexion,$strDATA2)){
		echo "Imposible establecer el mensaje."; 
		exit; 
		} else { 
		$str_recibimos = fgets($Conexion,256); 
		echo "<p>"; 
		print_r($str_recibimos); 
		echo "</p>"; 
		}


//envio del email
		
//Salimos de la sesión, primero diciendo "Adios" al servidor 
//y luego cerrando el socket con fclose() 
if(!fputs($Conexion,"QUITrn")) { 
echo "No se pudo salir de la sesión con el servidor SMTP"; 
exit; 
} else { 
fclose($Conexion); 
echo "Cerrado y terminado"; 
exit; 
} 
?>
Me responde todo con 250 y oks pero no manda el correo, ¿sabeis a que se debe?

Un saludo.

Última edición por GatorV; 25/02/2009 a las 11:08
  #9 (permalink)  
Antiguo 25/02/2009, 11:09
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: Obtener el resultado del envio en PHP

Como te comento eso solo lo puedes saber entrando a la cuenta Postmaster y ya te explique el procedimiento, desconozco si hay un script ya hecho que lo haga pero si vas por los pasos que te comenté lo podrás desarrollar.

Saludos
  #10 (permalink)  
Antiguo 25/02/2009, 21:05
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 17 años, 11 meses
Puntos: 33
Respuesta: Obtener el resultado del envio en PHP

bibliotec:

Cita:
ahora lo que necesito es controlar los errores de recepción, correos llenos etc.
Primeramente, ponernos a enviar correos utilizando sockets
es mas que todo funcion especifica de un servidor de correo.

Por deporte podrias hacer algun codigo para conectar con un servidor y
hacer entrega de un correo simple de texto.
Y va mas o menos como lo que tu has expuesto.

Tu mejor opcion es instalar un servidor de correo completo ya que, normalmente,
estos servidores cuando hay errores de entrega u envio reporta de inmediato al administrador via una direccion de correo interna u otra de tu eleccion,
bien podria redirecionar esa direccion hacia cualquier direccion de correo externa y asi estaras en total control de lo enviado exitosamente y lo no enviado y sus respectivos errores.
Es mas estos servidores aun reportan los retrazos en entregas destinadas a servidores de correos muy congestionados.

Saludos
Franco

P.s. El codigo que tu tienes adolece de el concepto de intercambio de comunicacion entre el codigo y el servidor SMTP, ya que tu solo utilizas fput, fput, fput, seguido sin esperar respuesta.
Cita:
$strMAIL = "MAIL FROM: [email protected] \r\n";
if(!fputs($Conexion,$strMAIL)){
echo "Imposible establecer el origen.";
exit;
} else {
$str_recibimos = fgets($Conexion,256);
echo "<p>";
print_r($str_recibimos);
echo "</p>";
}
Simplemento esto No se hace asi; mas bien mi codigo
que ya he probado en esa parte especifica yo hago lo siguiente ->

Cita:
//Correo Origen
fputs($conexionsmtp, "MAIL FROM: $decorreo" . $nuevalinea);
$respuestasmtp = fgets($conexionsmtp, 515);
$ArrayLogeo['respuestaorigencorreo'] = "$respuestasmtp";
Observa que despues del fputs DEBE venir un FGETS o la comunicacion se corta
y la respuesta debe ser logeada en un array para despues depositarla en un archivo de texto como log de envios. En vez de estar haciendo "\r\n" cada vez y como hay que utilizarla multiples veces, es mejor que hagas un $nuevalinea = "\r\n";

Última edición por franco190453; 25/02/2009 a las 21:14
  #11 (permalink)  
Antiguo 26/02/2009, 08:57
 
Fecha de Ingreso: enero-2002
Mensajes: 182
Antigüedad: 22 años, 2 meses
Puntos: 0
Respuesta: Obtener el resultado del envio en PHP

Ok Franco vo y aprobarlo del modo que indicas, la verdad es que lo de los saltos de línea ni me habia fijado jejejeje

Un saludo y gracias de nuevo.
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 12:14.