Dans Indy, rattachez le proxy à l'IOHandler utilisé par TIdSMTP. Laissez TIdSMTP.Host et Port pointés vers le service de messagerie. Le composant proxy de l'IOHandler fournit l'adresse de l'intermédiaire et effectue la poignée de main du proxy sur cette même connexion.

La propriété à utiliser dépend de la version d'Indy : Indy 9 expose SocksInfo ; Indy 10 utilise TransparentProxy. Vérifiez la bibliothèque de composants dans l'application plutôt que de choisir un exemple d'après le seul nom de la version de Delphi.

Indy 10 avec SOCKS5

Supposons que la fiche possède déjà ces composants :

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

Reliez-les et configurez-les avant d'ouvrir la connexion 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;

Les valeurs de port sont des exemples. Le port SMTP doit correspondre au service et au mode TLS que vous comptez utiliser. Le port SOCKS appartient au proxy.

Pour un test SMTP public autorisé où un intermédiaire public est permis, la liste de proxys SOCKS5 propose des adresses candidates. Vérifiez que le candidat autorise l'hôte et le port de messagerie réels, et utilisez la branche sans authentification proxy sans conserver d'identifiants d'un proxy antérieur.

TIdSocksInfo commence par svNoSocks, donc définir seulement un nom d'hôte de proxy ne l'active pas. Choisissez la version SOCKS appropriée. Si le proxy exige une authentification SOCKS5 par nom d'utilisateur/mot de passe, configurez la méthode d'authentification ainsi que les identifiants :

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

ProxyUser et ProxyPassword représentent des valeurs fournies par l'application. Ces propriétés s'authentifient auprès du proxy. Configurez le compte SMTP et sa méthode d'authentification séparément dans le client de messagerie.

Conserver un IOHandler TLS existant

Un client de messagerie qui utilise STARTTLS ou TLS implicite a besoin de son IOHandler compatible SSL. Ne remplacez pas ce composant par un simple TIdIOHandlerStack uniquement pour ajouter le proxy.

Dans Indy 10, la base IOHandler SSL descend de TIdIOHandlerStack et hérite de sa prise en charge du proxy. Pour un IOHandler SSL compatible existant nommé MailTLS, la connexion devient :

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

Le réglage UseTLS du composant SMTP choisit toujours le mode TLS du service de messagerie. Configurez la confiance des certificats et la validation du nom d'hôte dans l'intégration TLS pour smtp.example.net, et non pour le nom d'hôte du proxy. Ajouter un tunnel n'établit pas en soi la validation des certificats.

Utiliser plutôt un proxy HTTP CONNECT

Pour Indy 10, utilisez un composant TIdConnectThroughHttpProxy, disponible dans IdConnectThroughHttpProxy. En supposant une instance existante appartenant à la fiche nommée HttpTunnel :

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

Si SMTP utilise MailTLS, affectez HttpTunnel à la propriété TransparentProxy de ce gestionnaire à la place. La cible de messagerie reste sur Smtp.

Ce composant établit un tunnel HTTP CONNECT et implémente l'authentification proxy Basic via ses propriétés Username et Password. Un proxy exigeant un autre mécanisme d'authentification nécessite une implémentation compatible ; ne supposez pas que ces deux propriétés couvrent tous les schémas d'authentification HTTP.

Le proxy doit aussi autoriser CONNECT vers le port réel du serveur de messagerie. L'autorisation de tunneliser vers des serveurs web sur 443 n'implique pas celle d'atteindre un service de soumission sur 587 ou un serveur SMTP sur 25.

La connexion Indy 9

Indy 9 utilise un TIdIOHandlerSocket et sa propriété SocksInfo. Avec des composants appartenant à la fiche nommés Socket9 et Socks9, le câblage équivalent est :

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

Son implémentation SOCKS prend en charge les versions 4, 4a et 5. La disposition TransparentProxy et composant HTTP CONNECT d'Indy 10 ne peut pas être simplement collée dans cette interface plus ancienne.

Il n'y a pas de connexion proxy préalable distincte à effectuer avec un autre client TCP. L'authentification proxy, la mise en place du tunnel et l'échange SMTP doivent appartenir à la connexion que le composant SMTP utilise réellement. Une fois ce câblage correct, une défaillance peut être localisée au niveau de la négociation proxy, du salut SMTP, de TLS ou de l'authentification de messagerie, au lieu de traiter chaque refus comme un mauvais mot de passe.

Articles similaires