В Indy прикрепите прокси к IOHandler, который использует TIdSMTP. Оставляйте TIdSMTP.Host и Port направленными на почтовую службу. Прокси-компонент IOHandler предоставляет адрес посредника и выполняет прокси-рукопожатие на том же соединении.

Используемое свойство зависит от версии Indy: Indy 9 предоставляет SocksInfo; Indy 10 использует TransparentProxy. Проверяйте библиотеку компонентов в приложении, а не выбирайте пример только по названию выпуска Delphi.

Indy 10 с SOCKS5

Предположим, форма уже содержит эти компоненты:

  • Smtp: TIdSMTP
  • MailSocket: TIdIOHandlerStack
  • Socks: 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 или аутентификации почты, вместо того чтобы считать каждый отказ неверным паролем почты.

Похожие статьи