Indy 10 - IdSMTP.Send () se bloque lors de l'envoi de messages de compte GMail
Question
Je suis en train d'envoyer un e-mail en utilisant le compte gmail (Delphi 7, Indy 10) avec ces paramètres:
TIdSmtp:
Port = 587;
UseTLS := utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL:
SSLOptions.Method := sslvTLSv1;
Tout semble être mis ok. Je reçois cette réponse:
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;
Et puis il se bloque et ne se termine pas. E-mail n'est pas envoyé. Que peut-être le problème?
La solution 2
Le problème était simple. Je n'étais pas assez patient et l'application ne suspendez pas, il y avait longtemps délai d'attente. Le délai d'attente était résultat de mauvais réglages.
Autres conseils
Oui, je l'ai vu beaucoup de problèmes avec Indy10 et tls (généralement gmail).
d'abord vous assurer que vous avez les dernières bibliothèques ssl d'ici
J'ai vu des stalles intermittentes et des erreurs qui ont été résolus dans la version de pointe de la indy (ie. Un dégagement non stable). voir http://www.indyproject.org/sockets/download/svn.DE .aspx
pour gmail, j'utilise généralement implicityTLS sur le port 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;
Tout d'abord, avez-vous vérifié le code fonctionne avec d'autres serveurs de messagerie?
Il y a quelque temps quelqu'un a dit qu'ils avaient des problèmes avec certains serveurs acceptant des requêtes http avec le composant Indy TIdHTTP. La raison en était qu'ils avaient Indy inclus dans le cadre du useragent:
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
Quand ils ont enlevé Indy Library il a travaillé. De toute évidence, il y a eu quelques services Web malins créés avec Indy, de sorte que certains sites refuseront les connexions à partir d'applications créées avec.
Je ne sais pas si le composant que vous utilisez a toute sorte de propriété UserAgent. Mais si elle le fait, null sur toutes les références à Indy.
Lors du test Indy, vous devez être sûr que « Stop sur les exceptions Delphi » est cochée (Outils, Options, Debugger Exceptions linguistiques).
Certaines routines, en particulier idSMTP.Send, « » (ou eats cache) exceptions résultant dans un raccrochent.