In Indy, collegate il proxy all'IOHandler usato da TIdSMTP. Mantenete TIdSMTP.Host e Port puntati al servizio di posta. Il componente proxy dell'IOHandler fornisce l'indirizzo dell'intermediario ed esegue l'handshake proxy sulla stessa connessione.

La proprietà da usare dipende dalla versione di Indy: Indy 9 espone SocksInfo; Indy 10 usa TransparentProxy. Controllate la libreria dei componenti nell'applicazione invece di scegliere un esempio solo in base al nome della release di Delphi.

Indy 10 con SOCKS5

Supponiamo che il form possieda già questi componenti:

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

Collegateli e configurateli prima di aprire la connessione 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;

I valori delle porte sono esempi. La porta SMTP deve corrispondere al servizio e alla modalità TLS che intendete usare. La porta SOCKS appartiene al proxy.

Per un test SMTP pubblico consentito in cui è ammesso un intermediario pubblico, la lista di proxy SOCKS5 offre indirizzi candidati. Verificate che il candidato consenta l'host e la porta di posta reali, e usate il ramo senza autenticazione proxy senza conservare credenziali di un proxy precedente.

TIdSocksInfo parte con svNoSocks, quindi impostare solo un nome host proxy non lo attiva. Scegliete la versione SOCKS adatta. Se il proxy richiede autenticazione SOCKS5 con nome utente/password, configurate sia il metodo di autenticazione sia le credenziali:

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

ProxyUser e ProxyPassword rappresentano valori forniti dall'applicazione. Queste proprietà si autenticano al proxy. Configurate l'account SMTP e il suo metodo di autenticazione separatamente nel client di posta.

Conservare un IOHandler TLS esistente

Un client di posta che usa STARTTLS o TLS implicito necessita del proprio IOHandler capace di SSL. Non sostituite quel componente con un semplice TIdIOHandlerStack solo per aggiungere il proxy.

In Indy 10 la base IOHandler SSL deriva da TIdIOHandlerStack e ne eredita il supporto proxy. Per un IOHandler SSL compatibile esistente chiamato MailTLS, la connessione diventa:

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

L'impostazione UseTLS del componente SMTP sceglie comunque la modalità TLS del servizio di posta. Configurate la fiducia nei certificati e la convalida del nome host nell'integrazione TLS per smtp.example.net, non per il nome host del proxy. Aggiungere un tunnel non stabilisce da solo la convalida dei certificati.

Usare invece un proxy HTTP CONNECT

Per Indy 10 usate un componente TIdConnectThroughHttpProxy, disponibile da IdConnectThroughHttpProxy. Supponendo un'istanza esistente di proprietà del form chiamata HttpTunnel:

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

Se SMTP usa MailTLS, assegnate HttpTunnel alla proprietà TransparentProxy di quel gestore. La destinazione di posta resta su Smtp.

Questo componente stabilisce un tunnel HTTP CONNECT e implementa l'autenticazione proxy Basic tramite le proprietà Username e Password. Un proxy che richiede un altro meccanismo di autenticazione necessita di un'implementazione compatibile; non date per scontato che queste due proprietà coprano tutti gli schemi di autenticazione HTTP.

Il proxy deve anche consentire CONNECT verso la porta reale del server di posta. L'autorizzazione a creare tunnel verso server web sulla 443 non implica quella a raggiungere un servizio di sottomissione sulla 587 o un server SMTP sulla 25.

La connessione Indy 9

Indy 9 usa un TIdIOHandlerSocket e la sua proprietà SocksInfo. Con componenti di proprietà del form chiamati Socket9 e Socks9, il cablaggio equivalente è:

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

La sua implementazione SOCKS supporta le versioni 4, 4a e 5. La disposizione TransparentProxy e componente HTTP CONNECT di Indy 10 non può essere incollata direttamente in questa interfaccia più vecchia.

Non c'è un accesso proxy preliminare separato da effettuare con un altro client TCP. L'autenticazione proxy, la configurazione del tunnel e lo scambio SMTP devono appartenere alla connessione che il componente SMTP usa davvero. Quando quel cablaggio è corretto, un guasto può essere localizzato nella negoziazione proxy, nel saluto SMTP, nel TLS o nell'autenticazione di posta, invece di trattare ogni rifiuto come una password di posta sbagliata.

Articoli correlati