smtp.Dial ay nagbubukas ng bagong koneksyon sa address nito. Pagkatapos makakuha ng koneksyon sa pamamagitan ng HTTP CONNECT proxy, ipasa ang umiiral nang stream na iyon sa smtp.NewClient sa halip.

Para sa SMTP server na nangangailangan ng STARTTLS sa port ng pagsusumite nito, ang paghahatid ay maaaring ganito:

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
}

Ang mga pakete ay net, net/smtp at crypto/tls. Ang tumatawag ay nagbibigay ng tunnel na nakakonekta na sa nilalayong SMTP host at port, kung saan tapos na ang CONNECT exchange ng proxy. Hindi sapat ang pagbukas lamang ng TCP sa proxy: ang HTTP response ay hindi SMTP greeting.

mailHost ay ang hostname ng SMTP server, walang port. Panatilihin ang pagkakakilanlang iyon para sa SMTP authentication at certificate verification. Ang TLS koneksyon sa isang HTTPS proxy ay nagpoprotekta sa ibang bahagi ng ruta.

Ang ibinalik na kliyente ay handa para sa umiiral nang SMTP authentication at mail transaction ng application. Isara ito kapag tapos na. Limitahan ang pag-dial, CONNECT at mga kasunod na protocol operation gamit ang deadline policy ng application.

Dapat pahintulutan ng proxy ang CONNECT sa piniling mail port. Ang ilan ay nililimitahan ito sa mga HTTPS destinasyon sa port 443. Para sa SMTP na may implicit TLS, itatag ang TLS session ng destinasyon bago tawagin ang NewClient sa halip na maglabas ng STARTTLS.

Kaugnay na mga artikulo