2010-01-27 12 views
6

Estoy tratando de enviar un correo electrónico utilizando la cuenta de Gmail (Delphi 7, Indy 10) con los siguientes valores:Indy 10 - IdSMTP.Send() se bloquea cuando el envío de mensajes de Gmail cuenta

TIdSmtp:

Port = 587; 
UseTLS := utUseExplicitTLS; 

TIdSSLIOHandlerSocketOpenSSL:

SSLOptions.Method := sslvTLSv1; 

todo parece estar bien establecido. Me sale esta respuesta:

Resolving hostname smtp.gmail.com. 
Connecting to 74.125.77.109. 
SSL status: "before/connect initialization" 
SSL status: "before/connect initialization" 
SSL status: "SSLv3 write client hello A" 
SSL status: "SSLv3 read server hello A" 
SSL status: "SSLv3 read server certificate A" 
SSL status: "SSLv3 read server done A" 
SSL status: "SSLv3 write client key exchange A" 
SSL status: "SSLv3 write change cipher spec A" 
SSL status: "SSLv3 write finished A" 
SSL status: "SSLv3 flush data" 
SSL status: "SSLv3 read finished A" 
SSL status: "SSL negotiation finished successfully" 
SSL status: "SSL negotiation finished successfully" 
Cipher: name = RC4-MD5; description = RC4-MD5     SSLv3 Kx=RSA  Au=RSA Enc=RC4(128) Mac=MD5 
; bits = 128; version = TLSv1/SSLv3; 

Y luego se cuelga y no termina. El correo electrónico no se envía. ¿Cual puede ser el problema?

Respuesta

3

El problema era simple. No fui lo suficientemente paciente y la aplicación no se colgó, hubo un tiempo de espera prolongado. El tiempo de espera fue el resultado de una configuración incorrecta.

1

En primer lugar, ¿ha verificado que el código está funcionando con otros servidores de correo electrónico?

Hace algún tiempo, alguien mencionó que tenían problemas con ciertos servidores que aceptaban solicitudes http con el componente TIdHTTP de Indy. La razón fue que tenían Indy incluido como parte del agente de usuario:

 Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)'; 

Cuando retiraron Indy Biblioteca funcionó. Evidentemente, se han creado algunos servicios web malignos con Indy, por lo que algunos sitios rechazarán las conexiones de las aplicaciones creadas con él.

No estoy seguro de si el componente que está utilizando tiene algún tipo de propiedad UserAgent. Pero si lo hace, anule cualquier referencia a Indy.

+1

UserAgent es para solicitudes HTTP, no SMTP – glob

+0

** glob ** tiene la razón; Concluí diciendo "No estoy seguro de si el componente que está utilizando tiene algún tipo de propiedad UserAgent" –

4

sí, he visto muchos problemas con indy10 y tls (generalmente gmail).

primero asegúrese de que tiene las últimas librerías SSL from here

que he visto puestos y errores intermitentes que se han resuelto en la versión sangrado borde de Indy (es decir. Una versión no estable). veo http://www.indyproject.org/sockets/download/svn.DE.aspx

para Gmail, generalmente uso implicityTLS en el puerto 465 ..

idSmtp := TIdSMTP.Create(nil); 
    try 
    idSmtp.IOHandler := nil; 
    idSmtp.ManagedIOHandler := true; 

    // try to use SSL 
    try 
     TIdSSLContext.Create.Free; 
     idSmtp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSmtp); 
     if (smtpSettings.port = 465) then 
     idSmtp.UseTLS := utUseImplicitTLS 
     else 
     idSmtp.UseTLS := utUseExplicitTLS; 
    except 
     idSmtp.IOHandler.Free; 
     idSmtp.IOHandler := nil; 
    end; 

    if (idSmtp.IOHandler = nil) then 
    begin 
     idSmtp.IOHandler := TIdIOHandler.MakeDefaultIOHandler(idSmtp); 
     idSmtp.UseTLS := utNoTLSSupport; 
    end; 

    // send message, etc 

    finally 
    idSmtp.Free; 
    end; 
+0

¡Excelente! Tu publicación me ayudó. Mi aplicación también se congeló durante smtp.send. Creo que la clave fue la opción utUseImplicitTLS, pero tampoco entiendo lo que hace este TIdSSLContex.Create.Free. – Tamm

+0

TIdSSLContext.Create.Free crea un objeto y lo libera inmediatamente. Está ahí para activar una excepción si el objeto TIdSSLContext no se puede crear. – glob

1

Al probar Indy, debe asegurarse de que "Stop on Delphi Exceptions" esté marcado (Herramientas, Opciones de depurador, Excepciones de idioma).

Algunas rutinas, específicamente idSMTP.Send, 'come' (u oculta) excepciones que dan como resultado un cuelgue.

Cuestiones relacionadas