Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problemas con la lectura de correos (https://www.clubdelphi.com/foros/showthread.php?t=64341)

Caro 27-03-2009 15:45:49

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

Caro 27-03-2009 15:55:07

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

Neftali [Germán.Estévez] 27-03-2009 17:41:04

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.

ContraVeneno 27-03-2009 17:52:23

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.

Caro 27-03-2009 17:54:34

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

Caro 27-03-2009 18:19:04

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

Caro 27-03-2009 18:24:16

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

Caro 28-03-2009 18:36:56

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

Neftali [Germán.Estévez] 30-03-2009 09:07:12

Cita:

Empezado por Caro (Mensaje 343075)
...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.

golf2008 19-11-2012 21:15:06

Instalar biblioteca OpenSSL
 
Cita:

Empezado por Caro (Mensaje 343075)
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


La franja horaria es GMT +2. Ahora son las 00:49:50.

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