גיב איבער דעם 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־אויטענטיפֿיקאַציע און סערטיפֿיקאַט־פּרופֿונג. אַ TLS־פֿאַרבינדונג צו אַ HTTPS־פּראָקסי באַשיצט אַן אַנדער פֿוס פֿון דער רוטע.
דער צוריקגעגעבענער קליענט איז גרייט פֿאַר דער עקזיסטירנדער SMTP־אויטענטיפֿיקאַציע און פּאָסט־טראַנזאַקציע פֿון דער אַפּליקאַציע. פֿאַרמאַכט אים ווען איר ענדיקט. באַגרענעצט רופֿן, CONNECT און ווײַטערדיקע פּראָטאָקאָל־אָפּעראַציעס מיט דער דעדלײַן־פּאָליטיק פֿון דער אַפּליקאַציע.
די פּראָקסי מוז דערלאָזן CONNECT צום אויסגעקליבענעם פּאָסט־פּאָרט. עטלעכע באַגרענעצן דאָס צו HTTPS־צילן אויף פּאָרט 443. פֿאַר SMTP מיט אימפּליציט TLS, שטעלט אויף די TLS־סעסיע פֿון דעם ציל פֿאַר איר רופֿט NewClient אַנשטאָט אַרויסצוגעבן STARTTLS.