Дайте SMTP-з'єднанню Indy проксі-IOHandler
Підключіть SOCKS або HTTP CONNECT до TIdSMTP через властивості IOHandler потрібної версії Indy, з окремими налаштуваннями пошти та проксі.
В Indy прикріпіть проксі до IOHandler, який використовує TIdSMTP. Тримайте TIdSMTP.Host і Port спрямованими на поштову службу. Проксі-компонент IOHandler надає адресу посередника й виконує проксі-рукостискання на тому самому з'єднанні.
Використовувана властивість залежить від версії Indy: Indy 9 надає SocksInfo; Indy 10 використовує TransparentProxy. Перевіряйте бібліотеку компонентів у програмі, а не вибирайте приклад лише за назвою випуску Delphi.
Indy 10 із SOCKS5
Припустімо, форма вже має ці компоненти:
Smtp: TIdSMTPMailSocket: TIdIOHandlerStackSocks: TIdSocksInfo
Підключіть і налаштуйте їх перед відкриттям 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;
Значення портів — приклади. Порт SMTP має відповідати службі та режиму TLS, які ви плануєте використовувати. Порт SOCKS належить проксі.
Для дозволеного публічного тесту SMTP, де допускається публічний посередник, список проксі SOCKS5 пропонує адреси-кандидати. Переконайтеся, що кандидат дозволяє фактичний поштовий хост і порт, і використовуйте гілку без автентифікації на проксі, не зберігаючи облікові дані попереднього проксі.
TIdSocksInfo починається зі значення svNoSocks, тому саме лише задання імені хоста проксі його не активує. Виберіть відповідну версію SOCKS. Якщо проксі вимагає автентифікації SOCKS5 за іменем і паролем, налаштуйте і метод автентифікації, і облікові дані:
Socks.Authentication := saUsernamePassword;
Socks.Username := ProxyUser;
Socks.Password := ProxyPassword;
ProxyUser і ProxyPassword позначають значення, які надає програма. Ці властивості автентифікуються на проксі. Налаштуйте обліковий запис SMTP та його метод автентифікації окремо в поштовому клієнті.
Збереження наявного TLS IOHandler
Поштовому клієнту, що використовує STARTTLS або неявний TLS, потрібен його IOHandler із підтримкою SSL. Не замінюйте цей компонент звичайним TIdIOHandlerStack лише для додавання проксі.
У Indy 10 основа SSL IOHandler походить від TIdIOHandlerStack і успадковує його підтримку проксі. Для наявного сумісного SSL IOHandler з іменем MailTLS з'єднання має вигляд:
Smtp.IOHandler := MailTLS;
MailTLS.TransparentProxy := Socks;
Параметр UseTLS компонента SMTP і далі вибирає режим TLS поштової служби. Налаштуйте довіру до сертифіката й перевірку імені хоста в інтеграції TLS для smtp.example.net, а не для імені хоста проксі. Додавання тунелю саме по собі не встановлює перевірку сертифіката.
Використання проксі HTTP CONNECT замість цього
Для Indy 10 використовуйте компонент TIdConnectThroughHttpProxy, доступний з IdConnectThroughHttpProxy. Припускаючи, що існує наявний екземпляр, що належить формі, з іменем HttpTunnel:
HttpTunnel.Host := 'proxy.example.net';
HttpTunnel.Port := 8080;
HttpTunnel.Enabled := True;
MailSocket.TransparentProxy := HttpTunnel;
Якщо SMTP використовує MailTLS, призначте HttpTunnel властивості TransparentProxy цього обробника. Поштова ціль залишається на Smtp.
Цей компонент встановлює тунель HTTP CONNECT і реалізує базову автентифікацію на проксі через свої властивості Username і Password. Проксі, який вимагає іншого механізму автентифікації, потребує сумісної реалізації; не припускайте, що ці дві властивості забезпечують усі схеми автентифікації HTTP.
Проксі також має дозволяти CONNECT до фактичного порту поштового сервера. Дозвіл на тунель до вебсерверів на порту 443 не означає дозволу досягти служби надсилання на порту 587 або SMTP-сервера на порту 25.
З'єднання в Indy 9
Indy 9 використовує TIdIOHandlerSocket і його властивість SocksInfo. З компонентами, що належать формі, з іменами Socket9 і Socks9 еквівалентне підключення таке:
Smtp.IOHandler := Socket9;
Socket9.SocksInfo := Socks9;
Socks9.Host := 'proxy.example.net';
Socks9.Port := 1080;
Socks9.Version := svSocks5;
Його реалізація SOCKS підтримує версії 4, 4a і 5. Схему з TransparentProxy і компонента HTTP CONNECT в Indy 10 не можна просто вставити в цей старіший інтерфейс.
Окремого попереднього входу на проксі через інший TCP-клієнт немає. Автентифікація на проксі, налаштування тунелю й обмін SMTP мають належати з'єднанню, яке фактично використовує компонент SMTP. Коли це з'єднання правильне, збій можна локалізувати на узгодженні з проксі, вітанні SMTP, TLS або автентифікації пошти, замість того щоб вважати кожну відмову неправильним паролем пошти.