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.

מאמרים קשורים