Problema al recibir datos de un servidor pop3
Publicado: 03 Feb 2009, 14:49
Hola
Estoy intentando completar una pequeña librería que inicié hace ya algún tiempo ...
Se trata de funciones para gestionar el correo electrónico mediante sockets.
Hace tiempo desarrollé una función que conseguía enviar e-mails mediante sockets. Ahora que he tenido tiempo y he aprendido el protocolo pop3 estoy desarrollando funciones para gestionar el correo (Conectar al servidor, autentificarse, consultar si hay correos etc).
El problema que tengo, es a la hora de descargar un correo.
Intento descargar un correo electrónico con datos adjuntos pero por algún motivo que desconozco el servidor envía el mensaje como en partes...
Es decir, primero envía las cabeceras, y algún segundo después envía el mensaje, que también llega como por bloques...
No se si esto será normal o se deberá a un problema del servidor (lag o algo de eso). Esto lo he observado con un cliente telnet, haciendo pruebas del protocolo. Al aplicarlo a autoit veo que no puedo recibir el mensaje completo, pues tengo este código:
Func Get_Mail()
Local $LoopTimer=0, $ListMailRecv, $NumMails=1
For $I=1 To $NumMails Step +1
TcpSend($ClientSocket[0], "retr "&$I&@CRLF)
While 1
Sleep(1)
$Data=TcpRecv($ClientSocket[0], 2048)
If ($Data<>"" Or $LoopTimer>=5000) Then ExitLoop
$ListMailRecv&=$Data
$LoopTimer+=1
Wend
$LoopTimer=0
msgbox(0, "", $ListMailRecv)
Next
EndFunc
que lo que haría es descargar mediante un bucle todos los mensajes que hubieran en el servidor (las funciones para conectar y consultar el correo no las pongo porque creo qe no son relevantes para el problema)
Como veis, en el while que recibe los datos del servidor puse una especie de temporizador para precisamente que no saliera si no se recibía nada, hasta pasados 5 segundos, por lo que comentaba antes de que el servidor envía la información por bloques.
Pero no se el porqué, no funciona. Unicamente recibo la primera línea y luego se termina el bucle... (algo un poco extraño ¿Verdad?
Haber si alguien tiene idea de como solucionarlo y conseguir que salga del bucle únicamente cuando se termina de recibir datos...
Lo intenté con @Error, pero devuelve 0 tanto si recibe información, como si no recibe nada (en una de esas pausas que hace el servidor) como si se ha terminado de recibir toda la información (el servidor no desconecta al cliente cuando termina de enviar los datos) así, que no vale comprobar si vale -1...
Gracias de antemano.
Salu2!
Estoy intentando completar una pequeña librería que inicié hace ya algún tiempo ...
Se trata de funciones para gestionar el correo electrónico mediante sockets.
Hace tiempo desarrollé una función que conseguía enviar e-mails mediante sockets. Ahora que he tenido tiempo y he aprendido el protocolo pop3 estoy desarrollando funciones para gestionar el correo (Conectar al servidor, autentificarse, consultar si hay correos etc).
El problema que tengo, es a la hora de descargar un correo.
Intento descargar un correo electrónico con datos adjuntos pero por algún motivo que desconozco el servidor envía el mensaje como en partes...
Es decir, primero envía las cabeceras, y algún segundo después envía el mensaje, que también llega como por bloques...
No se si esto será normal o se deberá a un problema del servidor (lag o algo de eso). Esto lo he observado con un cliente telnet, haciendo pruebas del protocolo. Al aplicarlo a autoit veo que no puedo recibir el mensaje completo, pues tengo este código:
Func Get_Mail()
Local $LoopTimer=0, $ListMailRecv, $NumMails=1
For $I=1 To $NumMails Step +1
TcpSend($ClientSocket[0], "retr "&$I&@CRLF)
While 1
Sleep(1)
$Data=TcpRecv($ClientSocket[0], 2048)
If ($Data<>"" Or $LoopTimer>=5000) Then ExitLoop
$ListMailRecv&=$Data
$LoopTimer+=1
Wend
$LoopTimer=0
msgbox(0, "", $ListMailRecv)
Next
EndFunc
que lo que haría es descargar mediante un bucle todos los mensajes que hubieran en el servidor (las funciones para conectar y consultar el correo no las pongo porque creo qe no son relevantes para el problema)
Como veis, en el while que recibe los datos del servidor puse una especie de temporizador para precisamente que no saliera si no se recibía nada, hasta pasados 5 segundos, por lo que comentaba antes de que el servidor envía la información por bloques.
Pero no se el porqué, no funciona. Unicamente recibo la primera línea y luego se termina el bucle... (algo un poco extraño ¿Verdad?
Haber si alguien tiene idea de como solucionarlo y conseguir que salga del bucle únicamente cuando se termina de recibir datos...
Lo intenté con @Error, pero devuelve 0 tanto si recibe información, como si no recibe nada (en una de esas pausas que hace el servidor) como si se ha terminado de recibir toda la información (el servidor no desconecta al cliente cuando termina de enviar los datos) así, que no vale comprobar si vale -1...
Gracias de antemano.
Salu2!