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.

Подобни статии