ส่งอุโมงค์ CONNECT ให้ไคลเอนต์ SMTP ของ Go
ใช้ smtp.NewClient กับอุโมงค์ที่สร้างไว้แล้ว และแยกชื่อโฮสต์ SMTP กับการจับมือ STARTTLS ออกจากคอนฟิกพร็อกซี
smtp.Dial เปิดการเชื่อมต่อใหม่ไปยังที่อยู่ของมัน หลังจากได้การเชื่อมต่อผ่านพร็อกซี HTTP CONNECT แล้ว ให้ส่งสตรีมที่มีอยู่แล้วนั้นไปยัง smtp.NewClient แทน
สำหรับเซิร์ฟเวอร์ SMTP ที่ต้องใช้ STARTTLS บนพอร์ตส่งของมัน การส่งต่ออาจเป็นดังนี้:
func smtpOverTunnel(conn net.Conn, mailHost string) (*smtp.Client, error) {
client, err := smtp.NewClient(conn, mailHost)
if err != nil {
conn.Close()
return nil, err
}
err = client.StartTLS(&tls.Config{
ServerName: mailHost,
MinVersion: tls.VersionTLS12,
})
if err != nil {
client.Close()
return nil, err
}
return client, nil
}แพ็กเกจคือ net, net/smtp และ crypto/tls ผู้เรียกจัดหาอุโมงค์ที่เชื่อมต่อกับโฮสต์และพอร์ต SMTP เป้าหมายอยู่แล้ว โดย การแลกเปลี่ยน CONNECT ของพร็อกซีเสร็จสิ้นแล้ว การเปิด TCP ไปยังพร็อกซีเพียงอย่างเดียวไม่เพียงพอ: การตอบกลับ HTTP ไม่ใช่คำทักทาย SMTP
mailHost คือชื่อโฮสต์ของเซิร์ฟเวอร์ SMTP โดยไม่มีพอร์ต รักษาตัวตนนั้นไว้สำหรับการตรวจสอบสิทธิ์ SMTP และการตรวจสอบใบรับรอง การเชื่อมต่อ TLS ไปยังพร็อกซี HTTPS ปกป้องอีกช่วงหนึ่งของเส้นทาง
ไคลเอนต์ที่ส่งคืนพร้อมสำหรับการตรวจสอบสิทธิ์ SMTP และธุรกรรมอีเมลที่มีอยู่ของแอปพลิเคชัน ปิดเมื่อเสร็จสิ้น จำกัดการโทร, CONNECT และการดำเนินการโปรโตคอลถัดไปด้วยนโยบายกำหนดเวลาของแอปพลิเคชัน
พร็อกซีต้องอนุญาต CONNECT ไปยังพอร์ตอีเมลที่เลือก บางแห่งจำกัดไว้เฉพาะปลายทาง HTTPS บนพอร์ต 443 สำหรับ SMTP ที่ใช้ TLS โดยนัย ให้สร้างเซสชัน TLS ของปลายทางก่อนเรียก NewClient แทนการออก STARTTLS