מסרו את מנהרת ה-CONNECT ללקוח ה-SMTP של Go
השתמשו ב-smtp.NewClient עם מנהרה שכבר הוקמה, והשאירו את שם המארח של SMTP ואת לחיצת היד STARTTLS בנפרד מהגדרת ה-proxy.
smtp.Dial פותח חיבור חדש לכתובת שלו. לאחר קבלת חיבור דרך proxy של 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 של ה-proxy הושלמה. פתיחת TCP אל ה-proxy בלבד אינה מספיקה: תגובת HTTP אינה ברכת SMTP.
mailHost הוא שם המארח של שרת ה-SMTP, ללא פורט. שמרו על הזהות הזו לאימות SMTP ולאימות תעודות. חיבור TLS ל-proxy של HTTPS מגן על קטע אחר של המסלול.
הלקוח המוחזר מוכן לאימות ה-SMTP ולעסקת הדואר הקיימים של היישום. סגרו אותו כשתסיימו. הגבילו חיוג, CONNECT ופעולות פרוטוקול לאחר מכן במדיניות המועדים של היישום.
ה-proxy חייב לאפשר CONNECT לפורט הדואר שנבחר. חלקם מגבילים אותו ליעדי HTTPS בפורט 443. עבור SMTP עם TLS משתמע, הקימו את הפעלת ה-TLS של היעד לפני קריאה ל-NewClient במקום להוציא STARTTLS.