Indy の SMTP 接続にプロキシ IOHandler を与える
正しい Indy バージョンの IOHandler プロパティで SOCKS または HTTP CONNECT を TIdSMTP に接続し、メールとプロキシの設定を分けて管理します。
Indy では、TIdSMTP が使う IOHandler にプロキシを接続します。TIdSMTP.Host と Port はメールサービスに向けたままにします。IOHandler のプロキシコンポーネントが仲介者のアドレスを提供し、同じ接続上でプロキシのハンドシェイクを行います。
使うプロパティは Indy のバージョンによって異なります。Indy 9 は SocksInfo を公開し、Indy 10 は TransparentProxy を使います。Delphi のリリース名だけで例を選ばず、アプリケーションのコンポーネントライブラリを確認してください。
SOCKS5 を使う Indy 10
フォームがすでに次のコンポーネントを持っているとします。
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 を使うメールクライアントには、SSL 対応の IOHandler が必要です。プロキシを追加するためだけに、そのコンポーネントを素の TIdIOHandlerStack に置き換えないでください。
Indy 10 では、SSL IOHandler の基底は TIdIOHandlerStack から派生しており、そのプロキシサポートを継承します。MailTLS という名前の既存の互換 SSL IOHandler では、接続は次のようになります。
Smtp.IOHandler := MailTLS;
MailTLS.TransparentProxy := Socks;
SMTP コンポーネントの UseTLS 設定は、依然としてメールサービスの TLS モードを選びます。証明書の信頼とホスト名の検証は smtp.example.net に対する TLS 統合側で設定し、プロキシのホスト名に対して設定しません。トンネルを追加しても、それ自体で証明書検証が確立されるわけではありません。
代わりに 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 プロパティで Basic プロキシ認証を実装します。別の認証方式を要求するプロキシには対応する実装が必要です。この 2 つのプロパティがすべての HTTP 認証方式を提供すると考えないでください。
プロキシはメールサーバーの実際のポートへの CONNECT も許可する必要があります。443 の Web サーバーへのトンネルが許可されていても、587 の送信サービスや 25 の SMTP サーバーに到達できるとは限りません。
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 をサポートします。Indy 10 の TransparentProxy と HTTP CONNECT コンポーネントの構成を、この古いインターフェイスにそのまま貼り付けることはできません。
別の TCP クライアントで行う事前のプロキシログインはありません。プロキシ認証、トンネル設定、SMTP のやり取りは、SMTP コンポーネントが実際に使う接続に属している必要があります。その接続が正しければ、失敗はプロキシのネゴシエーション、SMTP の挨拶、TLS、メール認証のどこかで特定でき、拒否をすべて間違ったメールパスワードとみなす必要はありません。