smtp.Dial өөрийн хаяг руу шинэ холболт нээдэг. HTTP CONNECT проксигоор холболт авсны дараа тэр байгаа урсгалыг оронд нь smtp.NewClient-д дамжуулна.

Илгээх порт дээрээ STARTTLS шаарддаг SMTP серверийн хувьд шилжүүлэлт дараах байдалтай байж болно:

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 баталгаажуулалт болон гэрчилгээ шалгахад хадгална. HTTPS прокси руу TLS холболт нь маршрутын өөр хэсгийг хамгаална.

Буцаасан клиент нь програмын одоогийн SMTP баталгаажуулалт болон шуудангийн гүйлгээнд бэлэн байна. Дуусмагц хаа. Залгах, CONNECT болон дараагийн протоколын үйлдлүүдийг програмын хугацааны бодлогоор хязгаарла.

Прокси нь сонгосон шуудангийн порт руу CONNECT зөвшөөрөх ёстой. Зарим нь үүнийг 443 порт дээрх HTTPS очих газарт хязгаарладаг. Далд TLS-тэй SMTP-ийн хувьд STARTTLS гаргахын оронд NewClient дуудахаас өмнө очих газрын TLS сессийг үүсгэ.

Холбоотой нийтлэлүүд