Trong Indy, gắn proxy vào IOHandler mà TIdSMTP sử dụng. Giữ TIdSMTP.Host và Port hướng tới dịch vụ thư. Thành phần proxy của IOHandler cung cấp địa chỉ của trung gian và thực hiện bắt tay proxy trên chính kết nối đó.

Thuộc tính bạn dùng phụ thuộc vào phiên bản Indy: Indy 9 cung cấp SocksInfo; Indy 10 dùng TransparentProxy. Hãy kiểm tra thư viện thành phần trong ứng dụng thay vì chọn ví dụ chỉ dựa vào tên bản phát hành Delphi.

Indy 10 với SOCKS5

Giả sử biểu mẫu đã có các thành phần sau:

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

Kết nối và cấu hình chúng trước khi mở kết nối 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;

Các giá trị cổng chỉ là ví dụ. Cổng SMTP phải khớp với dịch vụ và chế độ TLS mà bạn định dùng. Cổng SOCKS thuộc về proxy.

Đối với một bài kiểm tra SMTP công khai được phép khi trung gian công khai được chấp nhận, danh sách proxy SOCKS5 cung cấp các địa chỉ ứng viên. Xác nhận rằng ứng viên cho phép máy chủ và cổng thư thực tế, và dùng nhánh không xác thực proxy mà không giữ thông tin đăng nhập của proxy trước đó.

TIdSocksInfo bắt đầu với svNoSocks, nên chỉ đặt tên máy chủ proxy không kích hoạt nó. Chọn phiên bản SOCKS phù hợp. Nếu proxy yêu cầu xác thực SOCKS5 bằng tên người dùng/mật khẩu, hãy cấu hình cả phương thức xác thực lẫn thông tin đăng nhập:

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

ProxyUser và ProxyPassword đại diện cho các giá trị do ứng dụng cung cấp. Những thuộc tính này xác thực với proxy. Cấu hình tài khoản SMTP và phương thức xác thực của nó riêng trong ứng dụng thư.

Giữ lại IOHandler TLS hiện có

Ứng dụng thư dùng STARTTLS hoặc TLS ngầm cần IOHandler có khả năng SSL của nó. Không thay thành phần đó bằng TIdIOHandlerStack thường chỉ để thêm proxy.

Trong Indy 10, nền tảng IOHandler SSL bắt nguồn từ TIdIOHandlerStack và thừa hưởng hỗ trợ proxy của nó. Với một IOHandler SSL tương thích hiện có tên MailTLS, kết nối trở thành:

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

Cấu hình UseTLS của thành phần SMTP vẫn chọn chế độ TLS của dịch vụ thư. Cấu hình tin cậy chứng chỉ và xác thực tên máy chủ trong tích hợp TLS cho smtp.example.net, không phải cho tên máy chủ proxy. Việc thêm đường hầm không tự nó thiết lập xác thực chứng chỉ.

Dùng proxy HTTP CONNECT thay thế

Với Indy 10, dùng thành phần TIdConnectThroughHttpProxy, có sẵn từ IdConnectThroughHttpProxy. Giả sử có một phiên bản thuộc biểu mẫu tên HttpTunnel:

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

Nếu SMTP dùng MailTLS, hãy gán HttpTunnel cho TransparentProxy của trình xử lý đó. Đích thư vẫn ở Smtp.

Thành phần này thiết lập một đường hầm HTTP CONNECT và triển khai xác thực proxy Cơ bản qua các thuộc tính Username và Password. Proxy yêu cầu cơ chế xác thực khác cần một triển khai tương thích; đừng cho rằng hai thuộc tính này cung cấp mọi lược đồ xác thực HTTP.

Proxy cũng phải cho phép CONNECT tới cổng thực của máy chủ thư. Quyền tạo đường hầm tới máy chủ web trên 443 không có nghĩa là quyền tới dịch vụ gửi trên 587 hay máy chủ SMTP trên 25.

Kết nối Indy 9

Indy 9 dùng TIdIOHandlerSocket và thuộc tính SocksInfo của nó. Với các thành phần thuộc biểu mẫu tên Socket9 và Socks9, cách nối tương đương là:

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

Triển khai SOCKS của nó hỗ trợ phiên bản 4, 4a và 5. Không thể dán thẳng bố cục TransparentProxy và thành phần HTTP CONNECT của Indy 10 vào giao diện cũ này.

Không có bước đăng nhập proxy sơ bộ riêng phải thực hiện bằng một ứng dụng TCP khác. Xác thực proxy, thiết lập đường hầm và trao đổi SMTP phải thuộc về kết nối mà thành phần SMTP thực sự dùng. Khi cách nối đó đúng, lỗi có thể được định vị ở thương lượng proxy, lời chào SMTP, TLS hoặc xác thực thư, thay vì coi mọi lần từ chối là sai mật khẩu thư.

Bài viết liên quan