Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Lazarus, Indy 10 y gmail. (https://www.clubdelphi.com/foros/showthread.php?t=83891)

linuz 11-08-2013 22:17:45

Lazarus, Indy 10 y gmail.
 
Buenas a todos,
sé que aquí se habla de Delphi, pero como existe tanta similitud con lázarus pues a ver si alguien puede ayudarme.
Llevo una semana intentando mandar emails con los componentes de Indy 10, el caso es que con un correo con cifrado SSL de pago me manda los emails, pero al pasarle los datos de gmail me da un error al enviar. El error es con STARTTLS, que no se puede iniciar. Tengo las dll's en la carpeta del ejecutable. He cambiado 20 mil cosas, he buscado por el foro, me he bajado el ejemplo de Roman de como enviar emails, y no hay forma.
Gracias de antemano.
Un saludo.
Os dejo el código de la función:

Código Delphi [-]
procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var
   Mensaje: TIdMessage;
   Adjunto: TIdAttachmentfile;
begin
  // Creamos el componente de conexión con el servidor
       with F1 do
begin
  SMTP := TIdSMTP.Create( nil );
  SMTP.Username := sUsuario;
  SMTP.Password := sClave;
  SMTP.Host := sHost;
  SMTP.Port := 587;
  //SMTP.UseTLS:= 'utNoTLSSupport' ;
     IdSSLOpenSSLHeaders.Load;
  IdSSLIOHandlerSocketOpenSSL1.Destination := 'smtp.gmail.com:587';
    IdSSLIOHandlerSocketOpenSSL1.host := 'smtp.gmail.com';
    IdSSLIOHandlerSocketOpenSSL1.port := 587;
    IdSSLIOHandlerSocketOpenSSL1.ssloptions.method := sslvSSLv3;
    IdSSLIOHandlerSocketOpenSSL1.ssloptions.mode := sslmUnassigned;
 
  end;
 // SMTP.IOHandler := f1.IdSSLIOHandlerSocketOpenSSL1;
 // SMTP.AuthType:= atDefault;
  // Creamos el contenido del mensaje
  Mensaje := TIdMessage.Create( nil );
  Mensaje.Clear;
  Mensaje.From.Name := sDestino;
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;
  // Si hay que meter un archivo adjunto lo creamos y lo asignamos al mensaje
  if sAdjunto <> '' then
  begin
    if FileExists( sAdjunto ) then
      Adjunto := TIdAttachmentfile.Create( Mensaje.MessageParts,sAdjunto );
  end
  else
    Adjunto := nil;
  // Conectamos con el servidor SMTP
  try
    if f1.SMTP.Connected then
    f1.SMTP.Disconnect;
    f1.SMTP.Connect;
  except
    raise Exception.Create( 'Error al conectar con el servidor.' );
  end;
  // Si ha conectado enviamos el mensaje y desconectamos
  if f1.SMTP.Connected then
  begin
    try
 
      f1.SMTP.Send( Mensaje );
    except
      raise Exception.Create( 'Error al enviar el mensaje.' );
    end;
    try
      f1.SMTP.Disconnect;
    except
      raise Exception.Create( 'Error al desconectar del servidor.' );
    end;
  end;
  // Liberamos los objetos creados
  if Adjunto <> nil then
    FreeAndNil( Adjunto );
  FreeAndNil( Mensaje );
  FreeAndNil( f1.SMTP );          
end;

Ñuño Martínez 14-08-2013 12:17:00

Ya ves que he editado tu mensaje, porque el código no salía correctamente formateado. No problemo.

Respecto a lo de Delphi y Lazarus, aquí también hablamos de este último, así como de Free Pascal, Oxygene, Smart Mobile Studio y cualquer otro compilador de Pascal o similares, así que tampoco problemo. :D

Y ahora, al turrón.

No he enviado nunca correos usando Delphi, pero yo probaría a enviarlo primero sin codificar y sin adjunto, a ver si el problema no es el SSL. Luego, SSL necesita estar bien instalado y configurado (al menos en Linux, que en Windows nunca lo he usado) y cuando lo he necesitado yo me ha costado bastante. O sea, que tener los archivos DLL ahí al lado muchas veces no es suficiente, sino que necesita un archivo de configuración con los parámetros precisos (que si firmas, que si permisos...). Si puedes, consulta con un sysadmin, que estos suelen saber bastante.

linuz 15-08-2013 14:30:49

Gracias por la respuesta ÑuÑo.
He quitado el cifrado y el adjunto, pero me sigue dando el mismo error.
Estos errores que "no" puedo controlar son los que me ponen nervioso. Estoy acabando un proyecto para una clínica y casi está listo, y el módulo de sms e emails son lo que me están dando problemas.
¿Hay alguna alternativa a Indy para mandar emails?

Gracias por todo!!!!

Un saludo. :)

rretamar 15-08-2013 19:14:09

Tengo implementado el envío por Gmail usando Indy. Esta tarde cuando esté en mi trabajo copio el código y lo pego aquí. Funciona sin problemas. Eso sí, junto con la aplicación hacen falta distribuir unas bibliotecas de cifrado SSL.

linuz 15-08-2013 19:37:07

Cita:

Empezado por rretamar (Mensaje 465637)
Tengo implementado el envío por Gmail usando Indy. Esta tarde cuando esté en mi trabajo copio el código y lo pego aquí. Funciona sin problemas. Eso sí, junto con la aplicación hacen falta distribuir unas bibliotecas de cifrado SSL.

Gracias rretamar, toda ayuda es bienvenida. :);)

Un saludo.

rretamar 16-08-2013 14:36:53

Te envío el código fuente de toda la aplicación (es un programa muy simple -y el código fuente es bastante "sucio"- que permite consultar el estado de una base de datos, mostrando una alarma si no se encontraron nuevos registros. La alarma se ve en el monitor y opcionalmente se envía un correo-e). Junto al ejecutable se deben distribuir dos bibliotecas para la encriptación SSL que podrás encontrar en el mismo directorio de las fuentes. El envío de correo-e lo hago desde el archivo PRINCIPAL.PAS

Para envío por Gmail uso los siguientes parámetros:

- Servidor SMTP: smtp.gmail.com
- Usuario: nombre@gmail.com
- Port: 465
- Usar TSL

En el código fuente podrás ver cómo hago el envío y en los formularios están las propiedades de los componentes.

http://www.sendspace.com/file/0fxx92

Espero que te sirva. Está escrito y compilado en Delphi 2007 (utilizando los componentes JEDI, lo que ahora veo como un error, ya que son muy dependientes de Windows), que actualmente no utilizo más, porque lo reemplacé por Lazarus.

linuz 16-08-2013 16:26:21

Cita:

Empezado por rretamar (Mensaje 465674)
Te envío el código fuente de toda la aplicación (es un programa muy simple -y el código fuente es bastante "sucio"- que permite consultar el estado de una base de datos, mostrando una alarma si no se encontraron nuevos registros. La alarma se ve en el monitor y opcionalmente se envía un correo-e). Junto al ejecutable se deben distribuir dos bibliotecas para la encriptación SSL que podrás encontrar en el mismo directorio de las fuentes. El envío de correo-e lo hago desde el archivo PRINCIPAL.PAS

Para envío por Gmail uso los siguientes parámetros:

- Servidor SMTP: smtp.gmail.com
- Usuario: nombre@gmail.com
- Port: 465
- Usar TSL

En el código fuente podrás ver cómo hago el envío y en los formularios están las propiedades de los componentes.

http://www.sendspace.com/file/0fxx92

Espero que te sirva. Está escrito y compilado en Delphi 2007 (utilizando los componentes JEDI, lo que ahora veo como un error, ya que son muy dependientes de Windows), que actualmente no utilizo más, porque lo reemplacé por Lazarus.

Gracias rretamar!!!!

Ahora consigo conectar, pero a la hora de enviar el mail se queda literalmente muerto.
Ya no sé si es por el ssl o por otra cosa :(
Aaaahh!!! Esto es desesperante!!! He quitado el antivirus por si acaso, he desactivado el firewall de Windows, he cargado el proyecto en otro equipo..... y no va.

Gracias por la ayuda. Si se os ocurre algo más os escucharé encantados.
Un saludo.

EDITO: Lo curioso es que si pongo un usuario que no existe o la contraseña no es correcta, ¡¡se conecta igualmente!!, debería de dar la excepción, ¿no?.

linuz 16-08-2013 18:38:05

Hola de nuevo,

¡¡¡ Ya lo he solucionado !!!

El problema estaba en el firewall de la empresa :mad::mad::mad::rolleyes::rolleyes::rolleyes:.
Se quedaban muertos ahí y lazarus se volvía loco.
Muchas gracias por la ayuda.
Espero seros de ayuda en algún momento.

Un saludo.


La franja horaria es GMT +2. Ahora son las 20:17:57.

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