Ayuda para correo

Ayuda para correo

Postby Jose Luis » Mon Nov 07, 2005 8:36 pm

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.
Lo puede hacer el blat ?
Utilizo la clase TSmtp ?
Como ?

Dadme alguna idea por favor

Un Saludo

Jose Luis
Jose Luis
 
Posts: 28
Joined: Mon Nov 07, 2005 8:30 pm
Location: Toledo (España)

Postby dbzap » Tue Nov 08, 2005 12:07 pm

utiliza la clase modificada de Luis Krause M. la encuentras en
http://www.fivewin.info/html/downloads. ... ons&id=299

yo estoy luchando para realizar descargas con la tpop3, cualquier avance te aviso.

saludos
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Postby Jose Luis » Wed Nov 09, 2005 8:29 am

Muchas gracias por responder tan rápido.
Me he puesto a ver si me sirve, y me ha ocurrido algo que me viene sucediendo últimamente, y es que después de compilarlo me aparece ésta pantalla y no puedo ejecutar algunos ejemplos que quiero probar.
No se si será de la versión de compilador o qué.
Utilizo clipper 5.2+five 2.4

Saludos

Jose Luis
[img]c:\descargas\five\five.jpg[img][/img]

Bueno, como no se poner la imagen, os la describo el log

Application
===========
Path and name: C:\DESCAR~1\FIVE\FTPTEST.EXE (16 bits)
Size: 824,960 bytes
Max files handles permited: ( SetHandleCount() ) 91
Time from start: 0 hours 0 mins 0 secs
Error occurred at: 11/09/05, 09:27:56
Error description: Error BASE/1001 Funci¢n no definida: GETTEXTHEI
Args:
[ 1] = N 878

Stack Calls
===========
Called from LOCKERRHAN(0)
Called from (b)INITHANDL$(0)
Called from GETTEXTHEI(0)
Called from TMSGBAR:NEW(0)
Called from MAIN(58)
Jose Luis
 
Posts: 28
Joined: Mon Nov 07, 2005 8:30 pm
Location: Toledo (España)

Postby dbzap » Wed Nov 09, 2005 11:51 am

saca las cosas bonitas de tu aplicacion y luego las vas insertando de a una, es decir, saca las baras de botones, pon un menu simple y luego le das con el resto de cosas.
quizas de esa forma determines el real error, pero a mi ver, no es de producto de las clases nuevas.
saludos
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Re: Ayuda para correo

Postby R.F. » Fri Nov 11, 2005 2:20 am

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.
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby Jose Luis » Fri Nov 11, 2005 8:03 am

Caramba maestro, vaya clase magistral.
Muchisimas gracias, ahora ya si que no tengo más remedio que migrar a harbour.
Estoy haciendo pruebas con la ayuda que me ha enviado Antonio y voy avanzando, ahora me he atascado en compilar varios prg's, que no me coge el .LNK que tenía creado para ello, pero ya vamos poco a poco.

Saludos

Jose Luis
Jose Luis
 
Posts: 28
Joined: Mon Nov 07, 2005 8:30 pm
Location: Toledo (España)

Postby dbzap » Fri Nov 11, 2005 12:00 pm

un millon de gracias !!!
( cuando tenga listo mi correo16 lo publico para todos )
User avatar
dbzap
 
Posts: 189
Joined: Mon Nov 07, 2005 7:36 pm
Location: Chile

Postby Jose Luis » Sun Nov 13, 2005 12:36 pm

Perdona que te moleste de nuevo René.
He compilado el ejemplo testpop3, tanto para fw como fwh, y cuando doy al botón "Get mail", no hace nada, es decir no me importa el correo ni me hace nada.
Creo que me falta documentación o algún ejemplo de funcionamiento, por ejemplo en el prg dice IP, y supongo que ahí habrá que poner la IP pública de mi ADSL, y así con el resto.
tampoco sé que otros parámetros poner.
Mi intención es poner un timer y que se ejecute el programa cada 5 minutos para:
1º Ver si hay correo
2º Si hay, compobar que viene de una dirección determinada.
3º Caso de ser así, extraer el adjunto en un directorio asignado.
4º A partir de ahí el resto de mi aplicación se encarga de trabajar con éste fichero.

Esto se puede con tpop3?

Un Saludo

Jose Luis
Jose Luis
 
Posts: 28
Joined: Mon Nov 07, 2005 8:30 pm
Location: Toledo (España)

Postby R.F. » Sun Nov 13, 2005 5:13 pm

Jose Luis wrote:Creo que me falta documentación o algún ejemplo de funcionamiento, por ejemplo en el prg dice IP, y supongo que ahí habrá que poner la IP pública de mi ADSL


Pues va a ser que no, la IP que te pide ahi es la IP de tu servidor de correo pop, si no la conoces, puedes utilizar:

ciP := GetHostByName("mail.google.com")

donde "mail.google.com" es el nombre del servidor de correo pop.

GetHostByName() te devuelve la IP del servidor y luego con esa direccion IP retornada en cIP, puedes conectarte.
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby Jose Luis » Fri Nov 18, 2005 7:28 pm

Hola Rene
Gracias a tu ayuda, ya he podido hacer lo siguiente:
Con la clase tpop3 he conseguido guardar en disco un mensaje de correo, pero todo el mensaje.
Dentro del mensaje he localizado donde comienza el adjunto, y como éste adjunto es .txt, (que es el que voy a recibir siempre), pues no viene codificado en mime.
Ahora me falta una cosa, me dijiste que dentro del mensaje, en algún sitio viene la longitud, pero no lo localizo, tan sólo localizo al comienzo del mensaje los bytes que ocupa todo el mensaje, no el adjunto; por lo tanto como no sé la longitud que va a traer el adjunto, no puedo separarlo con un substr().
A lo mejor es que la longitud del adjunto viene codificada en mime, pero no sé.

Gracias por todo

Jose Luis
Jose Luis
 
Posts: 28
Joined: Mon Nov 07, 2005 8:30 pm
Location: Toledo (España)


Return to FiveWin para CA-Clipper

Who is online

Users browsing this forum: No registered users and 10 guests