Dê à conexão SMTP do Indy um IOHandler de proxy
Ligue SOCKS ou HTTP CONNECT ao TIdSMTP com as propriedades IOHandler da versão correta do Indy, com configurações de correio e de proxy separadas.
No Indy, ligue o proxy ao IOHandler usado por TIdSMTP. Mantenha TIdSMTP.Host e Port apontados ao serviço de correio. O componente de proxy do IOHandler fornece o endereço do intermediário e realiza o handshake de proxy nessa mesma conexão.
A propriedade usada depende da versão do Indy: o Indy 9 expõe SocksInfo; o Indy 10 usa TransparentProxy. Verifique a biblioteca de componentes na aplicação em vez de escolher um exemplo apenas pelo nome da versão do Delphi.
Indy 10 com SOCKS5
Suponha que o formulário já tenha estes componentes:
Smtp: TIdSMTPMailSocket: TIdIOHandlerStackSocks: TIdSocksInfo
Conecte-os e configure-os antes de abrir a conexão SMTP:
Smtp.Host := 'smtp.example.net';
Smtp.Port := 587;
Smtp.IOHandler := MailSocket;
Socks.Host := 'proxy.example.net';
Socks.Port := 1080;
Socks.Version := svSocks5;
MailSocket.TransparentProxy := Socks;
Os valores de porta são exemplos. A porta SMTP deve corresponder ao serviço e ao modo TLS que pretende usar. A porta SOCKS pertence ao proxy.
Para um teste SMTP público permitido, em que um intermediário público é admitido, a lista de proxies SOCKS5 oferece endereços candidatos. Confirme que o candidato permite o host e a porta de correio reais, e use o ramo sem autenticação de proxy sem conservar credenciais de um proxy anterior.
TIdSocksInfo começa com svNoSocks, portanto apenas definir um nome de host de proxy não o ativa. Escolha a versão de SOCKS adequada. Se o proxy exigir autenticação SOCKS5 com nome de utilizador/palavra-passe, configure o método de autenticação e também as credenciais:
Socks.Authentication := saUsernamePassword;
Socks.Username := ProxyUser;
Socks.Password := ProxyPassword;
ProxyUser e ProxyPassword representam valores fornecidos pela aplicação. Essas propriedades autenticam-se junto do proxy. Configure a conta SMTP e o seu método de autenticação separadamente no cliente de correio.
Manter um IOHandler TLS existente
Um cliente de correio que usa STARTTLS ou TLS implícito precisa do seu IOHandler com capacidade SSL. Não substitua esse componente por um TIdIOHandlerStack simples apenas para acrescentar o proxy.
No Indy 10, a base do IOHandler SSL descende de TIdIOHandlerStack e herda o seu suporte a proxy. Para um IOHandler SSL compatível existente chamado MailTLS, a conexão passa a ser:
Smtp.IOHandler := MailTLS;
MailTLS.TransparentProxy := Socks;
A definição UseTLS do componente SMTP continua a selecionar o modo TLS do serviço de correio. Configure a confiança de certificados e a validação do nome de host na integração TLS para smtp.example.net, e não para o nome de host do proxy. Acrescentar um túnel não estabelece por si só a validação de certificados.
Usar um proxy HTTP CONNECT em vez disso
Para o Indy 10, use um componente TIdConnectThroughHttpProxy, disponível em IdConnectThroughHttpProxy. Supondo uma instância existente pertencente ao formulário chamada HttpTunnel:
HttpTunnel.Host := 'proxy.example.net';
HttpTunnel.Port := 8080;
HttpTunnel.Enabled := True;
MailSocket.TransparentProxy := HttpTunnel;
Se o SMTP usar MailTLS, atribua HttpTunnel à TransparentProxy desse manipulador. O destino de correio permanece em Smtp.
Este componente estabelece um túnel HTTP CONNECT e implementa autenticação básica de proxy através das suas propriedades Username e Password. Um proxy que exija outro mecanismo de autenticação precisa de uma implementação compatível; não presuma que estas duas propriedades fornecem todos os esquemas de autenticação HTTP.
O proxy também deve permitir CONNECT para a porta real do servidor de correio. A permissão para criar túneis para servidores web na 443 não implica permissão para alcançar um serviço de submissão na 587 ou um servidor SMTP na 25.
A conexão do Indy 9
O Indy 9 usa um TIdIOHandlerSocket e a sua propriedade SocksInfo. Com componentes pertencentes ao formulário chamados Socket9 e Socks9, a ligação equivalente é:
Smtp.IOHandler := Socket9;
Socket9.SocksInfo := Socks9;
Socks9.Host := 'proxy.example.net';
Socks9.Port := 1080;
Socks9.Version := svSocks5;
A sua implementação de SOCKS suporta as versões 4, 4a e 5. A disposição de TransparentProxy e componente HTTP CONNECT do Indy 10 não pode ser simplesmente colada nesta interface mais antiga.
Não há um início de sessão prévio de proxy separado a efetuar com outro cliente TCP. A autenticação do proxy, a configuração do túnel e a troca SMTP devem pertencer à conexão que o componente SMTP usa efetivamente. Quando essa ligação está correta, uma falha pode ser localizada na negociação do proxy, na saudação SMTP, no TLS ou na autenticação de correio, em vez de tratar cada recusa como uma palavra-passe de correio errada.