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.

مقالات ذات صلة