Ver Mensaje Individual
  #6  
Antiguo 11-02-2021
ArtPortEsp ArtPortEsp is offline
Miembro
 
Registrado: may 2018
Ubicación: Mexico
Posts: 153
Reputación: 7
ArtPortEsp Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Sí, pero cuándo, en qué línea, pon el código para que veamos algo.
ah ok, tratare de ser mas especifico.... estoy usando el código que encontré en:

https://proyectoa.com/como-enviar-co...i-6-e-indy-10/

el cual es:

Código Delphi [-]
var
  mail : TIdMessage;
  adjuntos : TStrings;
  i,x : integer;
begin
     if txtServidorSMTP.Text = '' then
     begin
          MessageDlg ('Debe indicar el la dirección del servidor de SMTP.', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;

     if (lsAutenticacion.Text <> 'Ninguna') and ((txtUsuario.Text = '') or (txtContrasena.Text = '')) then
     begin
          MessageDlg ('Debe indicar el usuario y contraseña de autenticación del servidor SMTP.', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;

     if lsTLS.Text = '' then
     begin
          MessageDlg ('Debe indicar si requiere TLS / SSL.', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;

     if txtPuerto.Text = '' then
     begin
          MessageDlg ('Debe indicar el puerto de envío de mail (por defecto para TLS ' + 'es 587 y sin TLS es 25).', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;

     if txtRemitenteNombre.Text = '' then
     begin
          MessageDlg ('Debe indicar el nombre del remitente.', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;

     if txtRemitenteMail.Text = '' then
     begin
          MessageDlg ('Debe indicar el e-mail del remitente.', mtWarning, [mbok], 0);
          tabDatos.Show;
          exit;
     end;
     if txtDestinatario.Text = '' then
     begin
          MessageDlg ('Debe indicar el e-mail del destinatario (para varios mails separar con comas).',
           mtWarning, [mbok], 0);
          tabEnviarMail.Show;
          exit;
     end;
     if txtAsunto.Text = '' then
     begin
          MessageDlg ('Debe indicar el asunto del correo electrónico.', mtWarning, [mbok], 0);
          tabEnviarMail.Show;
          exit;
     end;
     if txtMensaje.Text = '' then
     begin
          MessageDlg ('Debe indicar el cuerpo del correo electrónico.', mtWarning, [mbok], 0);
          tabEnviarMail.Show;
          exit;
     end;
     if (pos('adjunto', AnsiLowerCase(txtMensaje.Text)) > 0) and (lFicherosAdjuntos.Count = 0) then
     begin
          if MessageDlg ('Ha introducido la palabra "adjunto" en el cuerpo pero no ha adjuntado documentos ' +
               'al correo electrónico ¿Desea continuar con el envío sin adjuntos?',
               mtConfirmation, [mbYes, mbNo], 0) = mrno then
          begin
               tabEnviarMail.Show;
               exit;
          end;
     end;


     //Si no está conectado al servidor SMTP conectar
     with idSMTP do
     begin
          if lsMetdoSSL.Text = 'sslvTLSv1' then
               IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
          if lsMetdoSSL.Text = 'sslvTLSv2' then
               IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv2;
          if lsMetdoSSL.Text = 'sslvTLSv23' then
               IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
          if lsMetdoSSL.Text = 'sslvTLSv3' then
               IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3;

          IoHandler := IdSSLIOHandlerSocketOpenSSL1;

          //Tipo de autenticación
          if lsAutenticacion.Text = 'Defecto' then
               AuthType := atDefault;
          if lsAutenticacion.Text = 'Ninguna' then
               AuthType := atNone;
          if lsAutenticacion.Text = 'SASL' then
               AuthType := atSASL;

          //Si se requiere autenticación para el envío indicar usuario y contraseña
          Username := txtUsuario.Text;
          Password := txtContrasena.Text;
          Host := txtServidorSMTP.Text;

          //Usar TLS SLL para el envío
          if lsTLS.Text = 'TLS explícito' then
            useTLS := utUseExplicitTLS;
          if lsTLS.Text = 'Sin soporte TLS' then
            useTLS := utNoTLSSupport;
          if lsTLS.Text = 'TLS implícito' then
            useTLS := utUseExplicitTLS;
          if lsTLS.Text = 'TLS requerido' then
            useTLS := utUseExplicitTLS;

          //Puerto que se usará para la conexión con el servidor SMTP, en el caso de TLS el de defecto es 587
          port := strtoint(txtPuerto.Text);
     end;

     try
          txtResultado.Lines.add(DateTimeToStr(now) + ' Conectando con el servidor ' + txtServidorSMTP.Text);
          idSMTP.Connect;
          txtResultado.Lines.add(DateTimeToStr(now) + ' Conectado a ' + txtServidorSMTP.Text);
     except
          on e : exception do
          begin
               txtResultado.Lines.add(DateTimeToStr(now) + ' Error al conectar al servidor SMTP. ' + e.ClassName + ' ' + e.Message);
               MessageDlg('Error al conectar con servidor SMTP: ' + e.Message, mtError, [mbok], 0);
          end;
     end;

     mail := TIdMessage.Create(Self);
     with mail do
     begin
          From.Name                 := txtRemitenteNombre.Text;
          From.Address              := txtRemitenteMail.Text;
          Recipients.EMailAddresses := txtDestinatario.Text;
          CCList.EMailAddresses     := txtCC.Text;
          BccList.EMailAddresses    := txtCCO.Text;
          Subject                   := txtAsunto.Text;

          body.Text := txtMensaje.Text;

          //Cargar ficheros adjuntos seleccionados
          adjuntos := lFicherosAdjuntos.Items;
          for i := 0 to adjuntos.Count - 1 do
          begin
               if FileExists(adjuntos.Strings[i]) then
               begin
                    TIdAttachmentFile.Create(MessageParts, adjuntos.Strings[i])
               end;
          end;
     end;

     try
          idSMTP.Send(mail);
          txtResultado.Lines.add(DateTimeToStr(now) + ' Mensaje enviado correctamente ('+inttostr(x)+')');
          MessageDlg('Mensaje enviado correctamente.', mtInformation, [mbok], 0);
          if idSMTP.Connected then idSMTP.Disconnect;
     except
          on e : exception do
          begin
               txtResultado.Lines.add(DateTimeToStr(now) + ' Error al enviar mensaje. ' + e.ClassName + ' ' + e.Message);
               MessageDlg('Error al enviar e-mail: ' + e.Message, mtError, [mbok], 0);
               if idSMTP.Connected then
                    idSMTP.Disconnect;
          end;
     end;

y el mismo funciona perfectamente en mi maquina, pero no así en las maquinas de los usuarios, le puse unos mensajes (que no inclui en el codigo) para tratar de seguir lo que hacia el programa en una de las maquinas y en la linea :

Código:
 idSMTP.Connect;
es donde se interrumpe el proceso y envía el error que menciono...

tengo la sospecha que las maquinas de usuarios por "alguna extraña razón" no tienen acceso a las librerías : ssleay32.dll y libeay32.dll ; a pesar que están en la misma carpeta que el ejecutable (en mi maquina las librerías están también en Windows/System32) y en las carpetas de otras aplicaciones (aunque al parecer con versiones diferentes (por la fecha y tamaño de los archivos)

lo que pienso probar el dia de hoy es poner las librerías en Windows/System32 y tal vez usar alguna otra versión de las mismas.

Última edición por Casimiro Notevi fecha: 11-02-2021 a las 17:05:04.
Responder Con Cita