Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Detectar la configuración del servidor de correo (https://www.clubdelphi.com/foros/showthread.php?t=94874)

ArtPortEsp 15-09-2020 21:01:04

Detectar la configuración del servidor de correo
 
buen dia;

tengo una aplicación que puede enviar correos en Delphi 7 con los componentes Indy 10

al parecer la rutina funciona bien, pero cuando quiero configurar los parametros de conexion para cada cliente, tengo que pasar por un tedioso proceso de prueba y error para determinar la configuración correcta de:

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method que puede ser:
sslvTLSv1
sslvSSLv2
sslvSSLv23
sslvSSLv3

o de TidSMTP.Authtype que puede ser:
atDefault
atNone
atSASL

y de TidSMTP.UseTSL que puede tener los sig valores:
utUseExplicitTLS
utNoTLSSupport
utUseExplicitTLS
utUseExplicitTLS

supongo que debe haber una mejor forma de configurar un cliente de correo (y que yo, por supuesto ignoro), alguna sugerencia?

Garada 16-09-2020 08:47:54

Puedes probar a implementar el protocolo Autodiscover:
https://www.ionos.es/ayuda/dominios/.../autodiscover/

Compruebas primero si existe el registro en el dominio y si no pues pasas a tu sistema manual.

Desconozco si ya hay algún componente creado para Delphi pero, en teoría, no es complicado.
Es una consulta DNS a ver si existe el registro, si existe descargar el fichero que indica.
El fichero descargado es un XML con la información de configuración.

ArtPortEsp 16-09-2020 13:52:57

hola, pues ahora ya no se que pasa, la aplicación ya no puede enviar correos con gmail, el código es el siguiente:

notas:
  • ya me asegure que la opcion de ALLOW LESS SECURE APPLICATIONS en Gmail estuviera activada
    en el programa principal incluyo las librerias
    Código:

                  xlinea:=ExtractFilePath(Application.ExeName);
                  if (not fileexists(xlinea+'\libeay32.dll')) or (not fileexists(xlinea+'\ssleay32.dll')) then
                  begin
                        MessageDlg('Las librerias SSL no estan presentes en la carpeta del ejecutable.'+#13+#10+''+#13+#10+'La capacidad de correo electronico del sistema no estara habilitada.', mtWarning, [mbOK], 0);
                        GVCORE := False;
                  end
                  else
                        IdSSLOpenSSLHeaders.Load;



Código:

          // Conexion con el servidor de correo
          ListBox2.Lines.clear;
          with SMTP do
          begin
              if Gemailmetodo = 'sslvTLSv1'  then IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
              if Gemailmetodo = 'sslvTLSv2'  then IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv2;
              if Gemailmetodo = 'sslvTLSv23' then IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
              if Gemailmetodo = 'sslvTLSv3'  then IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3;

              IoHandler := IdSSLIOHandlerSocketOpenSSL1;

              // tipo de autenticacion
              if Gemailauth = 'Defecto' then AuthType := atDefault;
              if Gemailauth = 'Ninguna' then AuthType := atNone;
              if Gemailauth = 'SASL'    then AuthType := atSASL;


              //Si se requiere autenticación para el envío indicar usuario y contraseña
              Username := Gemailcuenta;
              Password := Gemailpassword;
              Host    := Gemailserver;

              //Usar TLS SLL para el envío
              if GemailSSL = 'TLS explícito'  then useTLS := utUseExplicitTLS;
              if GemailSSL = 'Sin soporte TLS' then useTLS := utNoTLSSupport;
              if GemailSSL = 'TLS implícito'  then useTLS := utUseImplicitTLS;
              if GemailSSL = 'TLS requerido'  then useTLS := utUseRequireTLS;
                                                             
              // Puerto de salida                           
              port := strtoint(Gemailpuerto);
          end;

          try
              Listbox2.Lines.Add(DateTimeToStr(now)+' conectando con el servidor de correo ['+Gemailserver+']');
              SMTP.Connect;
              Listbox2.Lines.Add(DateTimeToStr(now)+' conectado con el servidor de correo');
          except
              on e : exception do
              begin
                    Listbox2.Lines.add(DateTimeToStr(now) + ' Error al conectar al servidor de correo ' + e.ClassName + ' ' + e.Message);
                    MessageDlg('Error al conectar con servidor SMTP: ' + e.Message, mtError, [mbok], 0);
              end;
          end;

          if SMTP.Connected then
          begin

              // Composicion del correo
              eMessage.Body.Assign(Etexto.Lines);
              eMessage.From.Text := Ede.text;
              eMessage.Recipients.Clear;
              x:= epara.text;

              If Ansipos(';',x) > 0 Then
              begin
                    While Ansipos(';',x) > 0 Do
                    begin
                        eMessage.Recipients.Add.Address:=Copy(x,1,Ansipos(';',x)-1);
                        x:=Copy(x,Ansipos(';',x)+1,999);
                    end;          { while }
                    eMessage.Recipients.Add.Address:=x;
              end
              else
                    eMessage.Recipients.Add.Address:=Epara.Text;

              eMessage.Subject := easunto.Text;

              If Efile.FileName <> '' then TIdAttachmentFile.Create(eMessage.MessageParts,Efile.FileName);

              Emessage.Priority := TidmessagePriority(mpHighest);

              Try
                    if Fcorreo.tag <> 7 then
                    begin
                        SMTP.Send(Emessage);
                        DM.Bitacora('Correo','Envio de correo electronico', '',' Destinatario ('+Epara.text+')');

                        if ladjuntos.Items.Count > 0 then MessageDlg('El correo y sus adjuntos fueron enviados correctamente',mtInformation,[mbOk],0)
                        else MessageDlg('El correo fue enviado correctamente',mtInformation,[mbOk],0);

                        //DeleteFile(Efile.FileName);
                    end
                    else
                        Fcorreo.Tag := 0;

                    if SMTP.Connected then SMTP.Disconnect;
              except
                    on e : exception do
                    begin
                        Listbox2.Lines.add(DateTimeToStr(now) + ' Error al enviar mensaje. ' + e.ClassName + ' ' + e.Message);
                        MessageDlg('Error al enviar e-mail: ' + e.Message, mtError, [mbok], 0);
                        if SMTP.Connected then SMTP.Disconnect;
                    end;
              end;
          end
          else
              MessageDlg('No fue posible conectar con el servidor de correo', mtError, [mbOK], 0);

gracias de antemano por su ayuda.

Garada 17-09-2020 11:56:56

Para GMail las opciones que uso son estas:

Código Delphi [-]
SSL.SSLOptions.Method := sslvTLSv1;
SSL.SSLOptions.Mode := sslmUnassigned;

SMTP.AuthType := satDefault;
SMTP.Host := 'smtp.gmail.com';
SMTP.Username := 'direccionemail@gmail.com';
SMTP.Password := 'laquesea';

SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseRequireTLS;
SMTP.Port := 587;

Y, como bien dices, en la configuración de seguridad de la cuenta de Google activar "Acceso a aplicaciones menos seguras".
Si está activada la identificación de doble factor pues lo de menos seguras no se permite pero puedes generar una "contraseña de aplicación".
Y en la configuración de GMail debes activar el servicio POP/MAPI

Si con todo esto no va, ¿dónde y qué error da?

ArtPortEsp 17-09-2020 16:52:45

Cita:

Empezado por Garada (Mensaje 538550)
Para GMail las opciones que uso son estas:

Código Delphi [-]
SSL.SSLOptions.Method := sslvTLSv1;
SSL.SSLOptions.Mode := sslmUnassigned;

SMTP.AuthType := satDefault;
SMTP.Host := 'smtp.gmail.com';
SMTP.Username := 'direccionemail@gmail.com';
SMTP.Password := 'laquesea';

SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseRequireTLS;
SMTP.Port := 587;

Y, como bien dices, en la configuración de seguridad de la cuenta de Google activar "Acceso a aplicaciones menos seguras".
Si está activada la identificación de doble factor pues lo de menos seguras no se permite pero puedes generar una "contraseña de aplicación".
Y en la configuración de GMail debes activar el servicio POP/MAPI

Si con todo esto no va, ¿dónde y qué error da?

Muchas gracias!... funciono con algunos clientes que no tienen activada la VERIFICACIÓN DE DOS PASOS, enel caso de que la tengan, como usas la contraseña de aplicación?

Garada 18-09-2020 08:53:07

Personalmente, no se me ha dado el caso de la contraseña de aplicación.

En teoría, generas la contraseña y la usas sustituyendo a la contraseña del cliente.

Estas son las instrucciones de Google.
https://support.google.com/accounts/answer/185833?hl=es
Dice que debes elegir una aplicación, si no aparece tu aplicación igual debes hacer primero un intento con la contraseña normal para que la registre.

La otra opción es usar OAUTH2, el sistema que prefiere Google. Aquí tienes un ejemplo de como usar con Indy, pero creo que necesitas versiones modernas de Delphi.
https://github.com/geoffsmith82/Gmai...ster/README.md


La franja horaria es GMT +2. Ahora son las 10:51:16.

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