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 프록시 인증을 구현합니다. 다른 인증 방식을 요구하는 프록시에는 호환 구현이 필요합니다. 이 두 속성이 모든 HTTP 인증 방식을 제공한다고 가정하지 마십시오.
프록시는 메일 서버의 실제 포트로의 CONNECT도 허용해야 합니다. 443의 웹 서버로 터널링이 허용된다고 해서 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 또는 메일 인증에서 찾을 수 있으며, 모든 거부를 잘못된 메일 비밀번호로 볼 필요가 없습니다.