smtp.Dial ünvanına yeni bağlantı açır. HTTP CONNECT proksisi ilə bağlantı əldə etdikdən sonra həmin mövcud axını yerinə smtp.NewClient-ə ötürün.

Göndərmə portunda STARTTLS tələb edən SMTP serveri üçün ötürmə belə ola bilər:

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
}

Paketlər net, net/smtp və crypto/tls-dir. Çağıran, hədəf SMTP hostuna və portuna artıq qoşulmuş tunel təqdim edir, proksinin CONNECT mübadiləsi tamamlanmış. Proksiyə sadəcə TCP açmaq kifayət deyil: HTTP cavabı SMTP salamı deyil.

mailHost SMTP serverinin host adıdır, portsuz. Bu kimliyi SMTP autentifikasiyası və sertifikat yoxlaması üçün saxlayın. HTTPS proksisinə TLS bağlantısı marşrutun fərqli ayağını qoruyur.

Qaytarılan müştəri tətbiqin mövcud SMTP autentifikasiyası və poçt əməliyyatı üçün hazırdır. Bitirdikdən sonra bağlayın. Yığım, CONNECT və sonrakı protokol əməliyyatlarını tətbiqin son müddət siyasəti ilə məhdudlaşdırın.

Proksi seçilmiş poçt portuna CONNECT-ə icazə verməlidir. Bəziləri bunu 443 portunda HTTPS hədəfləri ilə məhdudlaşdırır. Gizli TLS SMTP üçün STARTTLS vermək əvəzinə NewClient çağırmazdan əvvəl hədəfin TLS sessiyasını qurun.

Əlaqəli məqalələr