PDA

Ver la Versión Completa : Lazarus, Indy 10 y gmail.


linuz
11-08-2013, 22:17:45
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:

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
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
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.