Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Problemas con la lectura de correos

Hola a todos

Tengo un problema al leer correos con Indy de una cuenta de Gmail, resulta que hice mis pruebas en mi maquina y otras funciona todo bien, pero en las maquinas del cliente no y la veradad nose que puede ser.

Este es mi codigo:

Código Delphi [-]
  Lectura := False;
  slCuerpo.Clear;
  Try
    if IdPOP3.Connected then
     IdPOP3.Disconnect;
    idPOP3.Connect;
 
    //Obtenemos el numero de emails que tenemos
    TotalMails:=idpop3.CheckMessages;
 
    //Recuperamos todas las cabeceras de los mensajes nuevos
    if TotalMails>0 then  //Solo leeremos un email a la vez
     begin
      idpop3.RetrieveHeader(1,idMessage);
      De := idMessage.From.Text;
      Tema := idMessage.Subject;
 
      AddLog('Se ha recibido un email de '+De+' con asunto'+Tema);
      //Recuperamos el cuerpo 
      idpop3.Retrieve(1, idMessage);
      For i:=0 to idMessage.MessageParts.Count - 1 do
       begin
        if (idMessage.MessageParts.Items[i] is TIdText) then
         begin
          slCuerpo.AddStrings(TIdText(idMessage.MessageParts.Items[i]).Body);
          contenido := True;
         end
        else //Si hubiera archivos adjuntos
         if (idMessage.MessageParts.Items[i] is TIdAttachmentFile) then
          begin
           // Nombre del archivo adjunto
           FileAdjunto := TIdAttachmentFile(idMessage.MessageParts.Items[i]).FileName;
           if FileExists(ExtractFilePath(ParamStr(0))+FileAdjunto) then
             DeleteFile(ExtractFilePath(ParamStr(0))+FileAdjunto);
           // Guardamos el archivo adjunto y lo añadimos a la lista de adjuntos
           TIdAttachmentFile( idMessage.MessageParts.Items[i] ).SaveToFile(ExtractFilePath(ParamStr(0))+FileAdjunto);
           slAdjuntos.Add(FileAdjunto);
          end;
       end;//for
      idMessage.Clear;
     end; //if
    Lectura := True;
  except   
    AddLog('No se ha podido conectar con el servidor POP.');
  end;

En mi archivo Log aparece muchas veces "No se ha podido conectar con el servidor POP." , osea que ha habido problemas al leer el correo, pense que era problema de la bliblioteca OpenSSL, pero no, he probado con la ultima versión y nada, el problema sigue, despues pense que era problema de conexion o que el puerto estaba bloqueado, pero nada, despues de hacer pruebas resulta que si lee algunas veces y me guarda en BD, pero la mayoría de las veces no le y se sigue guardando "No se ha podido conectar con el servidor POP" en mi archivo Log.

Esto solo ocurre con las maquinas del cliente, en las otras que yo he probado, no he tenido ningún problema me lee los correos, la unica ves que vi que no lo hizo fue porque la conexión a Internet se me ha desconectado, pero despues todo bien.

Debi haber añadido el mensaje de error en mi excepción, pero se me ha ido, con esto de las exepciones no soy muy buena.

¿Mi pregunta, que creen que pueda estar pasando, que mas puedo probar, me pueden ayudar por favor, por favor?

Nota.- Voy a continuar mi mensaje abajo.

Saluditos y muchísimas gracias por adelantado
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 27-03-2009 a las 16:50:14.
Responder Con Cita
  #2  
Antiguo 27-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Continuando..........

Lo ultimo que hice y que no he probado todavía en las maquinas del cliente, es aumentar mas excepciones y guardarme el error, me gustaría que por favor me lo revisen para decirme si he puesto bien mis excepciones por favor.

Código Delphi [-]
  Lectura := False;
  slCuerpo.Clear;
  Try
    //Nos conectamos
    if IdPOP3.Connected then
     IdPOP3.Disconnect;
    Try
     idPOP3.Connect;
    except
     On Error: Exception Do
      AddLog('No se ha podido conectar con el servidor POP. Error: ' + Error.message);
    end;
 
    //Obtenemos el numero de emails que tenemos
    TotalMails:=idpop3.CheckMessages;
 
    //Recuperamos todas la cabeceraa del mensaje nuevo
    if TotalMails>0 then  //solo leeremos un email a la vez
     begin
      Try
       idpop3.RetrieveHeader(1,idMessage);
       AddLog('Se ha recibido un email de '+De+' con asunto '+Tema);
      except
       On Error: Exception Do
        AddLog('No se ha podido leer el Header del correo. Error: ' + Error.message);
      end;
      De := idMessage.From.Text;
      Tema := idMessage.Subject;
 
      //Recuperamos el contenido
      Try
       idpop3.Retrieve(1, idMessage);
      Except
       On Error: Exception Do
        AddLog('No se ha podido leer el correo. Error: ' + Error.message);
      end;
 
      for i:=0 to idMessage.MessageParts.Count - 1 do
      begin
       if (idMessage.MessageParts.Items[i] is TIdText) then
        begin
         slCuerpo.AddStrings(TIdText(idMessage.MessageParts.Items[i]).Body);
         contenido := True;
        end
       else //Si hubiera archivos adjuntos
        if (idMessage.MessageParts.Items[i] is TIdAttachmentFile) then
          begin
            // Nombre del archivo adjunto
            FileAdjunto := TIdAttachmentFile(idMessage.MessageParts.Items[i]).FileName;
            if FileExists(ExtractFilePath(ParamStr(0))+FileAdjunto) then
              DeleteFile(ExtractFilePath(ParamStr(0))+FileAdjunto);
            // Guardamos el archivo adjunto y lo añadimos a la lista de adjuntos
            TIdAttachmentFile( idMessage.MessageParts.Items[i] ).SaveToFile(ExtractFilePath(ParamStr(0))+FileAdjunto );
            slAdjuntos.Add(FileAdjunto);
          end
      end;//for

      idMessage.Clear;
     end; //if
     Lectura := True;
  except
   On Error: Exception Do
      AddLog('Ha ocurrido un error. Error: ' + Error.message);
  end;

Saluditos y muchas gracias de nuevo
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 27-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hola Caro.
Te puedo comentar del tema de las excepciones, si quieres que pruebe algo de la conexión me puedes enviar un proyecto de prueba, creo que tengo alguna cuenta de GMail por ahí, aunque no la uso normalmente, y lo pruebo gustoso.

En cuanto a las excepciones, lo único que yo cambiaría es que después de hacer el AddLog colocaría un Exit (o un raise), porque sino como ya has capturado la excepción, el programa intentará continuar. Y eso creo que no te interesa.

Es decir; Si falla la conexión en la línea:
Código Delphi [-]
  idPOP3.Connect;


Como ya capturas la excepción correctamente en:
Código Delphi [-]
 except
     On Error: Exception Do
      AddLog('No se ha podido conectar con el servidor POP. Error: ' + Error.message);
    end;




El programa intentará continuar con la siguiente línea; Es decir:

Código Delphi [-]
    //Obtenemos el numero de emails que tenemos
    TotalMails:=idpop3.CheckMessages;



Y supongo que como la conexión ya no se ha hecho bien, volverá a dar error.

Lo que yo haría es salir con un Exit, depues de capturar cada error y añadirlo al log. En este caso no creo que te interese propagar la excepción con raise.

Un saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 27-03-2009
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Yo además le agregaría el nombre de la clase del error:

Código Delphi [-]
AddLog('Ha ocurrido un error. Error: ' + Error.ClassName+' - 'Error.message);

Esto después te puede servir para no hacer lo mismo cada que pase algo. Algo como:

Código Delphi [-]
Try
 ...
Except
 On E:EDBEngineError do showmessage('erro de DB');
 On E:EDIvByZero do showmessage('divisón por cero');
 On E:EBombaNuclear do showmeesage('Cayó la bomba');
end;
De esta forma podrías tratar cada error de manera especial. Si falló la conexión te sales, si fue alguna otra cosa, podrías hacer otra cosa.

o como recomiendan en la ayuda de delphi:
Código Delphi [-]
try 
  ... 
except 
  on EZeroDivide do HandleZeroDivide; 
  on EOverflow do HandleOverflow; 
  on EMathError do HandleMathError; 
else 
  HandleAllOthers; 
end;

Además, de esta forma podrías poner todo tu código en un solo bloque Try..Except. No tendrías necesidad de poner try..except a cada instrucción.
Si todos los errores son de la misma clase, se deberían poder identificar por número con Error.ErrNum, con lo que también podrías darle un manejo distinto a cada uno.
__________________


Última edición por ContraVeneno fecha: 27-03-2009 a las 20:09:40.
Responder Con Cita
  #5  
Antiguo 27-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Mil gracias por responder amiguito, estoy de acuerdo con el exit, entonces mi código quedaría así y la execpción que engloba las demas ya no sería necesarío verdad.

Código Delphi [-]
  Lectura := False;
  slCuerpo.Clear;
  //Try Esta ya no es necesario
    //Nos conectamos
    if IdPOP3.Connected then
     IdPOP3.Disconnect;
    Try
     idPOP3.Connect;
    except
     On Error: Exception Do begin
      AddLog('No se ha podido conectar con el servidor POP. Error: ' + Error.message);
      exit;
     begin
    end;
 
    //Obtenemos el numero de emails que tenemos
    TotalMails:=idpop3.CheckMessages;
 
    //Recuperamos todas la cabeceraa del mensaje nuevo
    if TotalMails>0 then  //solo leeremos un email a la vez
     begin
      Try
       idpop3.RetrieveHeader(1,idMessage);
       AddLog('Se ha recibido un email de '+De+' con asunto '+Tema);
      except
       On Error: Exception Do begin
        AddLog('No se ha podido leer el Header del correo. Error: ' + Error.message);
        exit;
       end;
      end;
      De := idMessage.From.Text;
      Tema := idMessage.Subject;
 
      //Recuperamos el contenido
      Try
       idpop3.Retrieve(1, idMessage);
      Except
       On Error: Exception Do begin
        AddLog('No se ha podido leer el correo. Error: ' + Error.message);
        exit;
       end;
      end;
 
      for i:=0 to idMessage.MessageParts.Count - 1 do
      begin
       if (idMessage.MessageParts.Items[i] is TIdText) then
        begin
         slCuerpo.AddStrings(TIdText(idMessage.MessageParts.Items[i]).Body);
         contenido := True;
        end
       else //Si hubiera archivos adjuntos
        if (idMessage.MessageParts.Items[i] is TIdAttachmentFile) then
          begin
            // Nombre del archivo adjunto
            FileAdjunto := TIdAttachmentFile(idMessage.MessageParts.Items[i]).FileName;
            if FileExists(ExtractFilePath(ParamStr(0))+FileAdjunto) then
              DeleteFile(ExtractFilePath(ParamStr(0))+FileAdjunto);
            // Guardamos el archivo adjunto y lo añadimos a la lista de adjuntos
            TIdAttachmentFile( idMessage.MessageParts.Items[i] ).SaveToFile(ExtractFilePath(ParamStr(0))+FileAdjunto );
            slAdjuntos.Add(FileAdjunto);
          end
      end;//for

      idMessage.Clear;
     end; //if
     Lectura := True;
  {except         //Esto ya no es necesario
   On Error: Exception Do
      AddLog('Ha ocurrido un error. Error: ' + Error.message);
  end;}

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #6  
Antiguo 27-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
No había visto tu mensaje contraveneno, muchas gracias por responder, aumentare lo del Error.ClassName por ahora, pero tomare en cuenta lo demas que me has explicado para despues.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 27-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Se me había olvidado, el proyecto de prueba lo he subido aquí http://rapidshare.com/files/21420000...orreo.zip.html , trabajo con Indy 10.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 28-03-2009
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Holitas, muchas gracias de nuevo Neftali, sobre mi primera pregunta de la conexión ya esta solucionado, era problema de la biblioteca OpenSSL que no estaba bien instalada, lo volví a instalar y me ha funcionado bien, gracias también a ti ContraVeneno.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 30-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.586
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Caro Ver Mensaje
...era problema de la biblioteca OpenSSL que no estaba bien instalada, lo volví a instalar y me ha funcionado bien.
Hola Caro.
Me alegro de que finalmente se haya solucionado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 19-11-2012
golf2008 golf2008 is offline
Miembro
 
Registrado: feb 2008
Posts: 151
Poder: 17
golf2008 Va por buen camino
Instalar biblioteca OpenSSL

Cita:
Empezado por Caro Ver Mensaje
Holitas, muchas gracias de nuevo Neftali, sobre mi primera pregunta de la conexión ya esta solucionado, era problema de la biblioteca OpenSSL que no estaba bien instalada, lo volví a instalar y me ha funcionado bien, gracias también a ti ContraVeneno.

Saluditos
Caro:
Te quería preguntar como fue la reinstalación que hiciste del OpenSSL que al final te resultó, porque estoy intentado recibir mail desde cuentas de gmail o hotmail usando Indy y no puedo. Me sale el famoso mensaje "Could not load SSL library"...

Seguramente que me está pasando lo mismo que te pasó a vos.

Desde ya muchas gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lectura de correos con TIdPOP3 y TIdMessage de Indy en delphi 5 hardezky Internet 9 25-01-2017 02:46:41
Correos masivos Willo Internet 5 08-02-2008 09:40:25
Uso de correos Nomad Internet 6 14-07-2007 16:18:15
servidor de correos karocs Internet 3 09-08-2006 02:29:56
recibir correos RaulChemical OOP 1 26-02-2004 13:44:24


La franja horaria es GMT +2. Ahora son las 21:44:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi