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

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