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 صادر کنید.

مقالات مرتبط