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.

Падобныя артыкулы