CONNECT လိုဏ်ခေါင်းကို Go ၏ SMTP client ထံ လွှဲပြောင်းပါ
တည်ဆောက်ပြီးသော လိုဏ်ခေါင်းဖြင့် smtp.NewClient ကို အသုံးပြုပြီး SMTP hostname နှင့် STARTTLS လက်ဆွဲနှုတ်ဆက်မှုကို proxy ဆက်တင်နှင့် သီးခြားထားပါ။
smtp.Dial သည် ၎င်း၏လိပ်စာသို့ ချိတ်ဆက်မှုအသစ်ကို ဖွင့်သည်။ HTTP CONNECT proxy မှတစ်ဆင့် ချိတ်ဆက်မှုရရှိပြီးနောက် ထိုရှိပြီးသား stream ကို အစားထိုးအနေဖြင့် smtp.NewClient သို့ လွှဲပေးပါ။
၎င်း၏ ပေးပို့သည့် port တွင် STARTTLS လိုအပ်သော SMTP ဆာဗာအတွက် လွှဲပြောင်းမှုသည် ဤသို့ဖြစ်နိုင်သည်-
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
}package များမှာ net၊ net/smtp နှင့် crypto/tls ဖြစ်သည်။ ခေါ်သူသည် ရည်ရွယ်ထားသော SMTP host နှင့် port သို့ ချိတ်ဆက်ပြီးသား tunnel ကို ပေးအပ်ပြီး proxy ၏ CONNECT ဖလှယ်မှု ပြီးစီးထားသည်။ proxy သို့ TCP ကို ဖွင့်ရုံဖြင့် မလုံလောက်ပါ- HTTP တုံ့ပြန်မှုသည် SMTP နှုတ်ဆက်ခြင်း မဟုတ်ပါ။
mailHost သည် SMTP ဆာဗာ၏ hostname ဖြစ်ပြီး port မပါဝင်ပါ။ SMTP စစ်မှန်ကြောင်းအထောက်အထားနှင့် လက်မှတ်စစ်ဆေးမှုအတွက် ထို identity ကို ထိန်းသိမ်းပါ။ HTTPS proxy သို့ TLS ချိတ်ဆက်မှုသည် လမ်းကြောင်း၏ အခြားအပိုင်းကို ကာကွယ်သည်။
ပြန်ပေးလိုက်သော client သည် application ၏ ရှိပြီးသား SMTP စစ်မှန်ကြောင်းအထောက်အထားနှင့် mail အရောင်းအဝယ်အတွက် အသင့်ဖြစ်သည်။ ပြီးဆုံးပါက ပိတ်ပါ။ dial လုပ်ခြင်း၊ CONNECT နှင့် နောက်ဆက်တွဲ protocol လုပ်ဆောင်ချက်များကို application ၏ သတ်မှတ်ချိန်မူဝါဒဖြင့် ကန့်သတ်ပါ။
proxy သည် ရွေးချယ်ထားသော mail port သို့ CONNECT ကို ခွင့်ပြုရမည်။ အချို့က ၎င်းကို port 443 ရှိ HTTPS ဦးတည်ရာများသို့ ကန့်သတ်ထားသည်။ implicit TLS ရှိသော SMTP အတွက် STARTTLS ထုတ်ပေးမည့်အစား NewClient မခေါ်မီ ဦးတည်ရာ၏ TLS session ကို တည်ဆောက်ပါ။