smtp.Dial kendi adresine yeni bir bağlantı açar. Bir HTTP CONNECT proxy üzerinden bağlantı aldıktan sonra, bu mevcut akışı bunun yerine smtp.NewClient'a aktarın.

Gönderim bağlantı noktasında STARTTLS gerektiren bir SMTP sunucusu için devir şöyle olabilir:

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
}

Paketler net, net/smtp ve crypto/tls'dir. Çağıran, hedeflenen SMTP ana bilgisayarına ve bağlantı noktasına zaten bağlı bir tünel sağlar; proxy'nin CONNECT alışverişi tamamlanmıştır. Proxy'ye yalnızca TCP açmak yeterli değildir: bir HTTP yanıtı SMTP karşılaması değildir.

mailHost, SMTP sunucusunun ana bilgisayar adıdır; bağlantı noktası içermez. Bu kimliği SMTP kimlik doğrulaması ve sertifika doğrulaması için koruyun. Bir HTTPS proxy'ye TLS bağlantısı rotanın başka bir bacağını korur.

Döndürülen istemci, uygulamanın mevcut SMTP kimlik doğrulaması ve posta işlemi için hazırdır. İşiniz bitince kapatın. Arama, CONNECT ve sonraki protokol işlemlerini uygulamanın son tarih politikasıyla sınırlayın.

Proxy, seçilen posta bağlantı noktasına CONNECT'e izin vermelidir. Bazıları bunu 443 numaralı bağlantı noktasındaki HTTPS hedefleriyle sınırlar. Örtük TLS'li SMTP için STARTTLS vermek yerine NewClient'ı çağırmadan önce hedefin TLS oturumunu kurun.

İlgili makaleler