CONNECT ٹنل Go کے SMTP کلائنٹ کے حوالے کریں
پہلے سے قائم ٹنل کے ساتھ smtp.NewClient استعمال کریں اور SMTP ہوسٹ نام اور STARTTLS ہینڈ شیک کو پراکسی سیٹ اپ سے الگ رکھیں۔
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 تصدیق اور سرٹیفکیٹ کی جانچ کے لیے وہ شناخت برقرار رکھیں۔ HTTPS پراکسی سے TLS کنکشن راستے کے دوسرے حصے کی حفاظت کرتا ہے۔
واپس دیا گیا کلائنٹ ایپلیکیشن کی موجودہ SMTP تصدیق اور میل لین دین کے لیے تیار ہے۔ ختم ہونے پر اسے بند کریں۔ ڈائلنگ، CONNECT اور بعد کے پروٹوکول عملیات کو ایپلیکیشن کی آخری تاریخ کی پالیسی سے محدود کریں۔
پراکسی کو منتخب میل پورٹ پر CONNECT کی اجازت دینی چاہیے۔ کچھ اسے پورٹ 443 پر HTTPS منازل تک محدود رکھتے ہیں۔ مضمر TLS والے SMTP کے لیے، STARTTLS جاری کرنے کے بجائے NewClient کال کرنے سے پہلے منزل کا TLS سیشن قائم کریں۔