Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Conectar a servidor IMAP con SSL (https://www.clubdelphi.com/foros/showthread.php?t=66891)

fide_uci 17-03-2010 14:56:30

Conectar a servidor IMAP con SSL
 
Hola amigos.

Estoy intentando realizar una aplicacion para notificar cuando nos llegan correos nuevos. En mi centro esta montado un servidor IMAP, de la suite OpenSource Zimbra. Lo que sucede es que cuando intento conectar al servidor por el puerto 993, que es el que esta puesto ahora, al parecer se me conecta, pero entonces me da el siguiente error.

"Invalid Command"

Alguien sabe que sucede?
Estoy utilizando Delphi 7, Indy 9 y en el directorio de la aplicacion tengo las librerias "ssleay32.dll" y "libeay32.dll" que las cogi del cliente Exodus.

Si me pudieran ayudar se los agradeceria mucho.

Este es mi codigo de conexion.

Código Delphi [-]
  IMAP4.Host := 'imap.uci.cu';
  IMAP4.Port := 993;
  IMAP4.IOHandler := idSSLIOHandlerSocket1;
  idSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3;
  idSSLIOHandlerSocket1.SSLOptions.Mode := sslmBoth;
  IMAP4.Connect;

fide_uci 17-03-2010 15:26:18

Acabo de descargar la Indy 10 a ver si con eso logro hacer algo. Ya que todos los ejemplos que veo en internet y que funcionan usan la version 10.
Luego les cuento como me va !

Enan0 18-03-2010 10:35:04

yo con Indy 10 no he podido hacerlo funcionar. voy a preparar un ejemplo con indy 9 si te parece bien, hacemelo saber y lo subo!

saludos

fide_uci 18-03-2010 12:59:19

Bueno nunca esta de mas. Si pudieras hacerlo te lo agradeceria muchisimo.

fide_uci 18-03-2010 13:09:26

Despues de un tiempo intentando establecer conexion con mi servidor logre hacerlo utilizando el siguiente codigo.

Código Delphi [-]
try
  ssl.ConnectTimeout := 3500;
  ssl.Open;
  ssl.StartSSL;
  ssl.PassThrough := True;
  ssl.SSLOptions.Mode := sslmUnassigned;
  ssl.SSLOptions.Method := sslvSSLv23;
  IMAP41.IOHandler := SSL;

  IMAP41.Connect(True);
except On E: Exception do
  Memo3.Lines.Add( Format('Exception "%s": %s', [E.ClassName, E.Message]) );
end;

Ya el host, puerto, usuario y contraseña se los puse al componente directo. Entonces agregue una pequeña porsion de codigo en los eventos OnStatus del SSLHandler y del idIMAP41 y lo que se ve es esto cuando intento conectarme.

Código:

Resolving hostname imap.edu.com
Connecting to 10.10.9.120
StatusInfo: SSL status: "before/connect initialization"
StatusInfo: SSL status: "before/connect initialization"
StatusInfo: SSL status: "SSLv2/v3 write client hello A"
StatusInfo: SSL status: "SSLv3 read server hello A"
StatusInfo: SSL status: "SSLv3 read server certificate A"
StatusInfo: SSL status: "SSLv3 read server done A"
StatusInfo: SSL status: "SSLv3 write client key exchange A"
StatusInfo: SSL status: "SSLv3 write change cipher spec A"
StatusInfo: SSL status: "SSLv3 write finished A"
StatusInfo: SSL status: "SSLv3 flush data"
StatusInfo: SSL status: "SSLv3 read finished A"
StatusInfo: SSL status: "SSL negotiation finished successfully"
StatusInfo: SSL status: "SSL negotiation finished successfully"
StatusInfo: Cipher: name = AES256-SHA; description = AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
; bits = 256; version = TLSv1/SSLv3;

Pero entonces me salta esta exception.

Código:

Exception "EAssertionFailed": Assertion failure (D:\Cosas de Programación\Programas y componentes\Cosas de la Indy\indy10\Protocols\IdSSLOpenSSL.pas, line 1435)
Cuando miro la version de Indy que estoy utilizando veo estos datos.

Código:

  gsIdVersion = '10.2.3'; {do not localize}
  gsIdProductName = 'Indy';  {do not localize}

Las librarias que estoy utilizando son:

Código:

openssl-0.9.8i-i386-win32
Alguien tiene una idea de por que ocurre esto?

Aqui comentan algo al respecto pero no entiendo mucho.

http://forums2.atozed.com/viewtopic.php?f=7&p=4403

Si alguien me pudiera explicar se los agradeceria muchisimo.

Ha en esa linea del archivo "IdSSLOpenSSL.pas" lo que se ve es esto.
Es decir es en este procedimiento que se dispara la exception.

Código:

procedure TIdSSLIOHandlerSocketOpenSSL.OpenEncodedConnection;
begin
  Assert(Binding<>nil);

  if not Assigned(fSSLSocket) then begin
    fSSLSocket := TIdSSLSocket.Create(Self);
  end;
  Assert(fSSLSocket.fSSLContext=nil);

  fSSLSocket.fSSLContext := fSSLContext;

  if IsPeer then begin
    fSSLSocket.Accept(Binding.Handle);
  end else begin
    fSSLSocket.Connect(Binding.Handle);
  end;
 
  fPassThrough := False;
end;


Enan0 19-03-2010 17:38:09

al parecer hay una nueva actualizacion para la version indy 10
Tuesday, March 09, 2010 12:17 AM 759404 openssl-0.9.8m-i386-win32.zipme fije aca

http://indy.fulgan.com/SSL/

espero que te ayude!

fide_uci 19-03-2010 23:49:21

Bueno. Ya me di cuenta de eso. Acabo de descargar la version ultima que es la

Código:

  gsIdVersion = '10.5.7'; {do not localize}
  gsIdProductName = 'Indy';  {do not localize}

Con las DLL's que me dices.
----> openssl-0.9.8m-i386-win32.zip

Ahora me sucede lo mismo y me salta este error.

Código:

Exception "EAssertionFailed": Assertion failure (D:\Cosas de Programación\Programas y componentes\Cosas de la Indy\IndyTiburon\Lib\Protocols\IdSSLOpenSSL.pas, line 1813)

fide_uci 19-03-2010 23:50:16

Para mi que es algo mal que estoy haciendo no se.
Para usas la SSL no es necesario inicializar algun componente, clase o algo ?

fide_uci 22-03-2010 13:26:37

Alguien tiene una idea de que sucede ?

fide_uci 22-03-2010 15:54:40

Bueno amigos ya he logrado resolver gran parte de lo que sucedia. Ahora se me conecta sin ningun problema, pero lo que me sucede es lo siguiente.

Cuando yo le doy al Imap41.Connect, este deberia conectarse y loguearme automaticamente pero no lo hace. El estado de la conexion imap se mantiene en csNonAuthenticated y de ahi no sale. No se que es lo que sucede pero si logro resolver ese problema la verdad es que creo que ya tendre todo listo para lo que necesito.

Alguien me podria indicar que es lo que sucede ?

Enan0 25-03-2010 09:04:46

1 Archivos Adjunto(s)
intentasete usar la llamada

Código Delphi [-]
IdIMAP41.Login

despues del connect?

la verdad que funciona muy diferente de lo que es Indy 9.

Yo la verdad que no pude hacerlos funcionar. (obvio no soy un experto) pero siempre tengo algun problema nuevo que no me deja avanzar.

Bueno aca dejo el ejemplo con Indy 9.0.18 y delphi 5 si utlizan delphi 6 o superior tendrian que agargar la unidad Variants en la declaracion.
esta version no incluye las DLL porque no me lo permite el Sistema (tamaño excedido)

Pd: el archivo es un RAR.


La franja horaria es GMT +2. Ahora son las 01:35:23.

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