ใน 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 และวิธีการพิสูจน์ตัวตนแยกต่างหากในไคลเอนต์อีเมล

การคง IOHandler TLS ที่มีอยู่

ไคลเอนต์อีเมลที่ใช้ STARTTLS หรือ TLS แบบโดยนัยต้องมี IOHandler ที่รองรับ SSL อย่าแทนที่คอมโพเนนต์นั้นด้วย TIdIOHandlerStack ธรรมดาเพียงเพื่อเพิ่มพร็อกซี

ใน Indy 10 ฐานของ IOHandler SSL สืบทอดมาจาก TIdIOHandlerStack และได้รับการสนับสนุนพร็อกซีสืบทอดมาด้วย สำหรับ IOHandler SSL ที่เข้ากันได้ซึ่งมีอยู่แล้วชื่อ 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 หรือการพิสูจน์ตัวตนอีเมล แทนที่จะถือว่าทุกการปฏิเสธเป็นรหัสผ่านอีเมลผิด

บทความที่เกี่ยวข้อง