Jose Luis wrote:Hola amigos:
A ver si me sacais del apuro; Necesito descargar en fase automática correo electrónico de un proveedor, siempre viene un fichero adjunto, y luego mi aplicación se encarga de tratar esos datos.
Como no va a haber un operador para decir al Outlook que el fichero adjunto lo guarde en tal dirección, necesito saber cómo descargar el correo y guardar el adjunto.
Bien, por partes....
FiveWin tiene una clase TPOP3 que te permite descargar correos electronicos de un servidor POP sin ningun problema, funciona perfectamente, mirate el ejemplo TESTPOP3.PRG
El problema que presenta esta clase, es que bajo FW de 16 bits esta limitada, con FWH a 32 bits no tiene limitacion alguna y tiene grandes ventajas adicionales.
Para que entiendas esto tengo que explicarte un poco sobre el formato del correo electronico:
Bajo internet, TOOOODOO se maneja como cadenas de caracteres, el SMTP, EL FTP, EL WEB, EL POP..... todo. La informacion que se envia por la red, son enormes o pequeñas cadenas de caracteres en codigo ASCII puro y duro. El Correo POP no es la excepcion, cada mensaje de correo electronico esta compuesto de 3 partes principales: la cabecera, que es donde se encuentra informacion sobre el contenido del mensaje de correo y sus anexos, el cuerpo que es el mensaje en si, y los archivos anexos.
Cada mensaje de correo es una enorme cadena de caracteres, aun si tiene archivos añadidos, estos archivos estan pegados al mensaje de correo tambien como cadenas de caracteres, pero codificadas en un formato especial llamado MIME.
¿ Como juega FiveWin con esto ?, pues muy facil, como te explique anterioremente, la clase TPOP3 de FW se encarga de conectarse al servidor POP y de descargar los mensajes; la clase TPOP3 tiene una data donde se guardan todos los mensajes llamada ::aMsgs, cuando creas el objeto POP3 este se conecta al servidor, envia los parametros de autenticacion y descarga todos los mensajes (que son cadenas de caracteres, aun los archivos anexos) y los coloca uno a uno dentro de la data ::aMsgs, de tal forma que la longitud de ::aMsgs te indica cuantos mensajes haz leido del servidor POP.
Bien, ahora lo interesante, a 16 bits, la clase TPOP3 esta limitada, no puede recibir mensajes de mas de 64 Kbytes, por una simple y sencilla razon..... el tamaño maximo de una cadena de caracteres que Clipper puede manejar es precisamente 64 Kbytes, lo que quiere decir que si el mesaje de correo, archivos anexos incluidos, mide mas de 64K, laaaaaastima, el programa va a fallar, esto no pasa CON EL MISMO CODIGO a 32 bits, porque bajo Harbour, el tamaño maximo de una cadena de caracteres es de 4 Gigabytes.
Por otro lado, recuerda que los arrays de Clipper tambien estan limitados, a un maximo de 4096 elementos, lo que quiere decir que bajo 16 bits, no puedes recibir mas de 4096 mensajes y estos mensajes deben de ser menores de 64 kb de tamaño. A 32 bits, practicamente no tienes limitacion porque los arreglos pueden ser hasta de 4 millones de elementos y cada elemento hasta de 4 GBytes de tamaño.
Bien, suponiendo que estamos trabajando a 32 bits, y hemos descargado con exito todos los mensajes y que dichos mensajes estan almacenados en la data ::aMsgs del objeto TPOP3, viene ahora el problema de "extraer" los archivos añadidos, que viendolo bien no es un gran problema per se.
Dentro del cuerpo del mensaje, se encuentra guardado el nombre el archivo anexo y la longitud de este, lo unico que hay que hacer es hacer un substr() del tamaño del archivo, y guardarlo dentro de otra cadena de caracteres, dicha cadena de caracteres es el archivo añadido, pero no como tal, sino que esta codificado bajo un formato llamado MIME, este formato se utiliza para poder convertir todos los bytes de un EXE, ZIP, TXT u otro, en caracteres imprimibles que pueden ser enviado por internet. FiveWin provee de 2 funciones, MimeEnc() y MimeDec(), la primera es usada por la clase SMTP para codificar los archivos anexos en formato mime y la segunda..... adivinaste...... para decodificar los archivos que vienen en formato mime.
El resto el facil hace un FCREATE(unidad:\directorio\nombrefichero), luego un FWRITE(handler,MimeDec(cadena)) y eso es todo, ya tienes extraido el archivo anexo.
Ahora bien, no recuerdo si MimeDec() viene con FW o lo saque de otra lib, pero estoy seguro que (x)Harbour si tiene una funcion para decodificar formato mime.