En Indy, adjunte el proxy al IOHandler que usa TIdSMTP. Mantenga TIdSMTP.Host y Port apuntando al servicio de correo. El componente de proxy del IOHandler proporciona la dirección del intermediario y realiza el handshake del proxy en esa misma conexión.

La propiedad que use depende de la versión de Indy: Indy 9 expone SocksInfo; Indy 10 usa TransparentProxy. Revise la biblioteca de componentes de la aplicación en lugar de elegir un ejemplo solo por el nombre de la versión de Delphi.

Indy 10 con SOCKS5

Suponga que el formulario ya tiene estos componentes:

  • Smtp: TIdSMTP
  • MailSocket: TIdIOHandlerStack
  • Socks: TIdSocksInfo

Conéctelos y configúrelos antes de abrir la conexión 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;

Los valores de puerto son ejemplos. El puerto SMTP debe coincidir con el servicio y el modo TLS que piensa usar. El puerto SOCKS pertenece al proxy.

Para una prueba SMTP pública permitida en la que se admite un intermediario público, la lista de proxies SOCKS5 ofrece direcciones candidatas. Confirme que el candidato permite el host y el puerto de correo reales, y use la rama sin autenticación de proxy sin conservar credenciales de un proxy anterior.

TIdSocksInfo comienza con svNoSocks, así que solo definir un nombre de host de proxy no lo habilita. Elija la versión de SOCKS adecuada. Si el proxy requiere autenticación SOCKS5 con usuario y contraseña, configure el método de autenticación además de las credenciales:

Socks.Authentication := saUsernamePassword;
Socks.Username := ProxyUser;
Socks.Password := ProxyPassword;

ProxyUser y ProxyPassword representan valores que proporciona la aplicación. Estas propiedades se autentican con el proxy. Configure la cuenta SMTP y su método de autenticación por separado en el cliente de correo.

Conservar un IOHandler TLS existente

Un cliente de correo que usa STARTTLS o TLS implícito necesita su IOHandler con capacidad SSL. No reemplace ese componente por un TIdIOHandlerStack simple solo para añadir el proxy.

En Indy 10, la base del IOHandler SSL desciende de TIdIOHandlerStack y hereda su compatibilidad con proxy. Para un IOHandler SSL compatible existente llamado MailTLS, la conexión queda así:

Smtp.IOHandler := MailTLS;
MailTLS.TransparentProxy := Socks;

El ajuste UseTLS del componente SMTP sigue seleccionando el modo TLS del servicio de correo. Configure la confianza de certificados y la validación del nombre de host en la integración TLS para smtp.example.net, no para el nombre de host del proxy. Añadir un túnel no establece por sí mismo la validación de certificados.

Usar un proxy HTTP CONNECT en su lugar

Para Indy 10, use un componente TIdConnectThroughHttpProxy, disponible en IdConnectThroughHttpProxy. Suponiendo una instancia existente propiedad del formulario llamada HttpTunnel:

HttpTunnel.Host := 'proxy.example.net';
HttpTunnel.Port := 8080;
HttpTunnel.Enabled := True;
MailSocket.TransparentProxy := HttpTunnel;

Si SMTP usa MailTLS, asigne HttpTunnel a la TransparentProxy de ese controlador en su lugar. El destino de correo permanece en Smtp.

Este componente establece un túnel HTTP CONNECT e implementa autenticación básica de proxy mediante sus propiedades Username y Password. Un proxy que exija otro mecanismo de autenticación necesita una implementación compatible; no suponga que estas dos propiedades cubren todos los esquemas de autenticación HTTP.

El proxy también debe permitir CONNECT al puerto real del servidor de correo. El permiso para tunelizar hacia servidores web en el 443 no implica permiso para llegar a un servicio de envío en el 587 o a un servidor SMTP en el 25.

La conexión de Indy 9

Indy 9 usa un TIdIOHandlerSocket y su propiedad SocksInfo. Con componentes propiedad del formulario llamados Socket9 y Socks9, el cableado equivalente es:

Smtp.IOHandler := Socket9;
Socket9.SocksInfo := Socks9;
Socks9.Host := 'proxy.example.net';
Socks9.Port := 1080;
Socks9.Version := svSocks5;

Su implementación de SOCKS admite las versiones 4, 4a y 5. La disposición de TransparentProxy y del componente HTTP CONNECT de Indy 10 no puede pegarse sin más en esta interfaz más antigua.

No hay un inicio de sesión previo de proxy separado que realizar con otro cliente TCP. La autenticación del proxy, la configuración del túnel y el intercambio SMTP deben pertenecer a la conexión que el componente SMTP usa realmente. Cuando ese cableado es correcto, un fallo puede localizarse en la negociación del proxy, el saludo SMTP, TLS o la autenticación de correo, en lugar de tratar cada rechazo como una contraseña de correo incorrecta.

Artículos relacionados