Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Errores en el envío de correos con TIdSmtp (Indy 9) (https://www.clubdelphi.com/foros/showthread.php?t=90249)

Angel.Matilla 02-05-2016 19:03:40

Errores en el envío de correos con TIdSmtp (Indy 9)
 
Estoy usando este código que utilizo habitualmente con BCB 6 e Indy 9.0.17, incluyendo las dll que indicais pro aquí algunos.
Código:

IdMessage1->From->Address = "administracion-socios@internautas.org";  //Remitente
IdMessage1->Subject = "Prueba de envío";
IdMessage1->Body->SetText("Esto es una prueba.");
IdMessage1->Recipients->Add();
IdMessage1->Recipients->EMailAddresses = "angelmatillacandas@gmail.com";      //Destinatario

IdSMTP1->Host = "mail.internautas.org";  //Servidor saliente
IdSMTP1->Username = <usuario>";  //Usuario
IdSMTP1->Password = "<clave>";  //Clave
IdSMTP1->Port    = 465;
IdSMTP1->AuthenticationType = atLogin;
IdSMTP1->IOHandler = IdSSLIOHandlerSocket1;

IdSSLIOHandlerSocket1->SSLOptions->Method = sslvTLSv1;
IdSSLIOHandlerSocket1->SSLOptions->Mode  = sslmClient;
try
{
    IdSMTP1->Connect();
    try
    {
          IdSMTP1->Send(IdMessage1);
    }
    catch(...)
    {
          ShowMessage("Se produjo un fallo durante el envío del mensaje");
    }
}
__finally
{
    ShowMessage("El mensaje se envió correctamente");
}

if (IdSMTP1->Connected())
    IdSMTP1->Disconnect();

Y al pasar por el método Connect me da este error:

No se ha cambiado nada en las especificaciones del servidor, pero no sé pro dónde agarrarlo.. He probado todos los valores posibles en SSLOptions->Method.

fredo 03-05-2016 01:28:11

SSL, tienes la libreria con el programa?

Angel.Matilla 03-05-2016 10:41:21

Cita:

Empezado por fredo (Mensaje 504889)
SSL, tienes la libreria con el programa?

En la carpeta dl ejecutable tengo las dos dll: libeay32 y ssleay32. O ¿te refieres a alguna otra librería?

fredo 03-05-2016 21:36:11

efectivamente al libeay32.dll y openssl.exe

Angel.Matilla 04-05-2016 12:23:05

He pasado a Indy 10
 
Bueno. Después de muchas idas y venidas he instalado los componentes de Indy 10, descargados desde https://indy.fulgan.com/ZIP/Indy10_5359.zip (vienen con el instalador para todas las versiones de Builder y Delphi). He modificado el código de la siguiente forma:
Código:

IdMessage1->From->Address = "administracion-socios@internautas.org";  //Remitente
IdMessage1->Subject = "Prueba de envío";
IdMessage1->Body->SetText("Esto es una prueba.");
IdMessage1->Recipients->Add();
IdMessage1->Recipients->EMailAddresses = "angelmatillacandas@gmail.com";      //Destinatario

IdSSLIOHandlerSocketOpenSSL1->PassThrough = true;
IdSMTP1->IOHandler = IdSSLIOHandlerSocketOpenSSL1;
IdSMTP1->Username                  = "<usuario>";
IdSMTP1->Password                  = "<clave>";
IdSMTP1->Host                      = "mail.internautas.org";
IdSMTP1->AuthType                  = satDefault;
IdSMTP1->Port                      = 25;
IdSMTP1->Connect();
IdSMTP1->SendCmd("STARTTLS");
IdSSLIOHandlerSocketOpenSSL1->PassThrough = false;
IdSMTP1->Authenticate();
IdSMTP1->Send(IdMessage1);

Ahora el error que se muestra es este otro:

Y en la carpeta del ejecutable están las librerías SSL

Neftali [Germán.Estévez] 04-05-2016 14:37:26

Cita:

Empezado por fredo (Mensaje 504909)
efectivamente al libeay32.dll y openssl.exe

Cita:

Empezado por Angel.Matilla (Mensaje 504895)
En la carpeta dl ejecutable tengo las dos dll: libeay32 y ssleay32. O ¿te refieres a alguna otra librería?

Son los ficheros:
  • ssleay32.dll
  • libeay32.dll

Revisa porque hay diferentes versiones según el sistema (32/64 bits).

Revisa los parámetros que necesitas para conectarte. Te lo digo porque estoy con el mismo tema y he tenido que instslar la versión 10 de las Indy, porque según la autentificación del servidor, no te va a servir con la versión 9, que es la que viene por defecto en Delphi/BCB 6/7.

Revisa este link: http://www.indyproject.org/kb/index....ststarttls.htm

Angel.Matilla 04-05-2016 20:01:41

Cita:

Empezado por Neftali (Mensaje 504923)
Revisa porque hay diferentes versiones según el sistema (32/64 bits).

Revisa los parámetros que necesitas para conectarte. Te lo digo porque estoy con el mismo tema y he tenido que instslar la versión 10 de las Indy, porque según la autentificación del servidor, no te va a servir con la versión 9, que es la que viene por defecto en Delphi/BCB 6/7.

Revisa este link: http://www.indyproject.org/kb/index....ststarttls.htm

Gracias por contestar Neftalí. Me estoy volviendo loco porque no sé, o no acabo de comprender, como obtener esas dos librerías. Tengo instalado W7 64 bits y he instalado Indy 10. He encontrado un montón de sitios donde teóricamente pueden descargarse ambos ficheros en la versión de 64 bits; incluso hay una dirección en indyproject (https://www.openssl.org/source/openssl-1.0.2h.tar.gz) desde la que deberían poderse bajar ambos. Según esa web la última versión estable es la 1.0.2 pero el fichero que hay para mi es un mundo desconocido y no sé como meterle mano. Os agardecería que me ayudarais.

roman 04-05-2016 20:17:46

Las bibliotecas se descargan de http://indy.fulgan.com/SSL/ y, específicamente, debería servirte ésta, que es la de Windows 64bits.

LineComment Saludos

Angel.Matilla 04-05-2016 20:22:57

Cita:

Empezado por roman (Mensaje 504946)
Las bibliotecas se descargan de http://indy.fulgan.com/SSL/ y, específicamente, debería servirte ésta, que es la de Windows 64bits.

LineComment Saludos

Gracias roman. Efectivamente; mientras contestabas encontré esa dirección y descargué el enlace que me indicas. Las copié y al probar me indicó que faltaba otra dll (vsinit.dll); la busqué y la descargué pero me sigue dando el mismo error de antes. No obstante, en esa dirección está también la última versión estable en openssl-1.0.2h-x64_86-win64.zip.

roman 04-05-2016 20:40:51

¡Qué raro! Esa biblioteca no parece tener nada que ver con Indy o SSL. De todas formas, si no mal recuerdo, en el visor de eventos de Windows puedes ver más detalles de porqué no se pudo cargar una DLL. Quizá te de alguna idea.

LineComment Saludos

Angel.Matilla 05-05-2016 11:18:21

1 Archivos Adjunto(s)
¡No hay manera! No soy capaz de que funcione. He eliminado las dll de la evsión 1.0.2h, la otra que comentaba ayer (vsinit.dll), he vuelto a descargar las que me indica roman, he vuelto a compilar el proyecto y sigue saliendo el mismo error de que no puede cargar. Estoy desesperado porque me urge darle solción a este problema; tengo una aplicación parada por no poder enviar correos.

Por si podéis ayudarme de alguna forma en el archivo adjunto está el proyecto. Está hecho en BCB 6 con Indy10 y usando las dll de openssl-0.9.8r-x64_86-win64-rev2.zip

juanelo 05-05-2016 20:32:30

Mira y aunque no lo creas (bueno si lo creerás porque te esta pasando) me pasa exactamente lo mismo, aunque en mi caso no es siempre, y no he logrado detectar las circunstancias que ocasionan el error.
Pero como tu, ya me tenia loco y habia que dar una solucion al problema (al cliente), y esto es lo que hice, nada elegante ni soluciona el problema, pero si que funciona.
Código Delphi [-]
....
// Conectamos con el servidor SMTP
  while(Intento < 2)
  {

    try
    {
      try
      {
        Application->ProcessMessages();
        if(Barra != NULL)
          Barra->Panels->Items[0]->Text="Conectando ... ";

          if(UsaSTARTTLS)
            SMTP->Connect(IdTimeoutDefault);
          else
            SMTP->Connect();
            
          if(UsaSTARTTLS && SMTP->SendCmd("STARTTLS", 220) == 220)// se coloca PassThrough a false
            SSL->PassThrough = false;
            
          if(SMTP->Connected())
          {
            Application->ProcessMessages();

            if(UsaSTARTTLS)
              SMTP->Authenticate();
            if(Barra != NULL)
              Barra->Panels->Items[0]->Text="Enviando correo ... ";
                SMTP->Send(Mensaje);
            Application->ProcessMessages();
            if(Barra != NULL)
              Barra->Panels->Items[0]->Text="Desconectando ... ";
                SMTP->Disconnect();
            Application->ProcessMessages();
            if(Barra != NULL)
              Barra->Panels->Items[0]->Text="Correo Enviado ... ";

                if(EsFactura || EsCPRN)
                  MarcaFacturaEnviadaPorMail(CveDocto,EnviaXML,-1,TipoDoc);
          }
          Intento=2;
          PuedeCerrar=true;
      }
      catch(Exception &e)
      {
        Que=false;
        if(e.Message.AnsiPos("load") == 0)  // Por error de Indy
        {
          Intento=2;
          Application->ProcessMessages();
          Que=false;
          if(Barra != NULL)
           Barra->Panels->Items[0]->Text="Error en el envio";
          Application->MessageBox(e.Message.c_str(),"Error",MB_OK);
        }
        else
          Intento++;

        PuedeCerrar=false;
      }
    }
    __finally
    {
      if(SMTP->Connected())
        SMTP->Disconnect();       
      }   
    }
  }

Basicamente lo que se hace es cachar el error de "Load ..." e intentar nuevamente, lo que me di cuenta es que solo una vez lanza ese error, las siguientes no lo hace (si no cierras la aplicacion).
Espero te ayude al menos a darle solucion al cliente, ya luego veremos de que se trata.

NOTA: mi proyecto es tambien BCB6 pero con Indy 9.0.14

Angel.Matilla 06-05-2016 10:44:45

Cita:

Empezado por juanelo (Mensaje 504973)
Mira y aunque no lo creas (bueno si lo creerás porque te esta pasando) me pasa exactamente lo mismo, aunque en mi caso no es siempre, y no he logrado detectar las circunstancias que ocasionan el error.
Pero como tu, ya me tenia loco y habia que dar una solucion al problema (al cliente), y esto es lo que hice, nada elegante ni soluciona el problema, pero si que funciona.

Gracias por la respuesta; lo de la elegancia, si funciona, como queda en segundo plano. Sólo una pregunta: Tienes en varios sitios supongo que una variable UsaSTARTTLS; ¿de dónde toma el valor?

Angel.Matilla 06-05-2016 14:33:05

Bueno. Después de muchas idas y venidas, de estar a punto de mandar todo a hacer puñetas me ha funcionado. En una aplicación que tengo instalada en el PC vienen las dos librerías dichosas ssleay32.dll y libeay32.dll, que venían con el programa cuando se instaló.

Ya desesperado, por aquello que en el peor de los casos no iba a funcionar tampoco, las copié en la carpeta y ha salido arreando de maravilla. Según las fichas de propiedades de ambos ficheros se trata de la versión 1.0.0d.


La franja horaria es GMT +2. Ahora son las 13:29:31.

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