Indy 10 - Idsmtp.send () está pendurado ao enviar mensagens da conta do Gmail
Pergunta
Estou tentando enviar um e-mail usando a conta do Gmail (Delphi 7, Indy 10) com estas configurações:
Tidsmtp:
Port = 587;
UseTLS := utUseExplicitTLS;
TidsslioHandlersockonssl:
SSLOptions.Method := sslvTLSv1;
Tudo parece estar bem definido. Eu recebo esta resposta:
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;
E então pendura e não termina. E-mail não é enviado. Qual pode ser o problema?
Solução 2
O problema era simples. Eu não fui paciente o suficiente e a aplicação não pendurou, houve um tempo limite longo. O tempo limite foi resultado de configurações erradas.
Outras dicas
Sim, eu já vi muitos problemas com o Indy10 e o TLS (geralmente o Gmail).
Primeiro, verifique se você tem as mais recentes bibliotecas SSL daqui
Vi barracas e erros intermitentes que foram resolvidos na versão de borda sangrenta do Indy (ou seja, uma versão não estável). Vejo http://www.indyproject.org/sockets/download/svn.de.aspx
Para o Gmail, geralmente uso implícito na porta 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;
Primeiro, você verificou que o código está trabalhando com outros servidores de e -mail?
Há algum tempo, alguém mencionou que estava tendo problemas com certos servidores que aceitam solicitações HTTP com o componente Indy Tidhttp. O motivo era que eles incluíram Indy como parte do usuáriogent:
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
Quando eles removeram Biblioteca Indy funcionou. Evidentemente, houve alguns serviços da Web malignos criados com a Indy, para que alguns sites recusem conexões de aplicativos criados com ele.
Não tenho certeza se o componente que você está usando possui algum tipo de propriedade do usuário. Mas, se isso acontecer, anule alguma referência a Indy.
Ao testar a Indy, você deve ter certeza de que “Pare nas exceções Delphi” é verificado (ferramentas, opções de depurador, exceções de idiomas).
Algumas rotinas, especificamente idsmtp.send, 'come' (ou oculta) exceções, resultando em um desligamento.