Trao đường hầm CONNECT cho ứng dụng SMTP của Go
Dùng smtp.NewClient với một đường hầm đã thiết lập và tách tên máy chủ SMTP cùng bắt tay STARTTLS khỏi phần cấu hình proxy.
smtp.Dial mở một kết nối mới tới địa chỉ của nó. Sau khi có kết nối qua proxy HTTP CONNECT, hãy chuyển luồng sẵn có đó cho smtp.NewClient thay vì dùng nó.
Với máy chủ SMTP yêu cầu STARTTLS trên cổng gửi của nó, việc bàn giao có thể như sau:
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
}Các gói là net, net/smtp và crypto/tls. Bên gọi cung cấp một đường hầm đã kết nối tới máy chủ và cổng SMTP mong muốn, với quá trình trao đổi CONNECT của proxy đã hoàn tất. Chỉ mở TCP tới proxy là không đủ: phản hồi HTTP không phải lời chào SMTP.
mailHost là tên máy chủ của máy chủ SMTP, không kèm cổng. Giữ nguyên danh tính đó cho xác thực SMTP và kiểm tra chứng chỉ. Kết nối TLS tới proxy HTTPS bảo vệ một chặng khác của tuyến.
Ứng dụng được trả về đã sẵn sàng cho xác thực SMTP và giao dịch thư hiện có của ứng dụng. Đóng nó khi xong. Giới hạn quay số, CONNECT và các thao tác giao thức tiếp theo bằng chính sách thời hạn của ứng dụng.
Proxy phải cho phép CONNECT tới cổng thư đã chọn. Một số giới hạn nó cho các đích HTTPS trên cổng 443. Với SMTP dùng TLS ngầm, hãy thiết lập phiên TLS của đích trước khi gọi NewClient thay vì phát STARTTLS.