Przekaż tunel CONNECT klientowi SMTP Go
Użyj smtp.NewClient z już ustanowionym tunelem i trzymaj nazwę hosta SMTP oraz uścisk dłoni STARTTLS oddzielnie od konfiguracji proxy.
smtp.Dial otwiera nowe połączenie do swojego adresu. Po uzyskaniu połączenia przez proxy HTTP CONNECT przekaż ten istniejący strumień do smtp.NewClient.
Dla serwera SMTP, który wymaga STARTTLS na porcie wysyłania, przekazanie może wyglądać tak:
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
}Pakiety to net, net/smtp i crypto/tls. Wywołujący dostarcza tunel już połączony z docelowym hostem i portem SMTP, z zakończoną wymianą CONNECT proxy. Samo otwarcie TCP do proxy nie wystarcza: odpowiedź HTTP nie jest powitaniem SMTP.
mailHost to nazwa hosta serwera SMTP, bez portu. Zachowaj tę tożsamość do uwierzytelniania SMTP i weryfikacji certyfikatu. Połączenie TLS z proxy HTTPS chroni inny odcinek trasy.
Zwrócony klient jest gotowy do istniejącego uwierzytelniania SMTP i transakcji pocztowej aplikacji. Zamknij go po zakończeniu. Ogranicz wybieranie, CONNECT i kolejne operacje protokołu polityką terminów aplikacji.
Proxy musi zezwalać na CONNECT do wybranego portu pocztowego. Niektóre ograniczają go do celów HTTPS na porcie 443. W przypadku SMTP z niejawnym TLS ustanów sesję TLS celu przed wywołaniem NewClient, zamiast wydawać STARTTLS.