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 প্রমাণীকরণ ও সার্টিফিকেট যাচাইয়ের জন্য সেই পরিচয় ধরে রাখুন। HTTPS প্রক্সির সাথে TLS সংযোগ রুটের ভিন্ন একটি অংশ সুরক্ষিত করে।

ফেরত দেওয়া ক্লায়েন্টটি অ্যাপ্লিকেশনের বিদ্যমান SMTP প্রমাণীকরণ ও মেইল লেনদেনের জন্য প্রস্তুত। শেষ হলে এটি বন্ধ করুন। ডায়ালিং, CONNECT এবং পরবর্তী প্রোটোকল ক্রিয়াকলাপ অ্যাপ্লিকেশনের সময়সীমা নীতিতে সীমাবদ্ধ করুন।

প্রক্সিকে নির্বাচিত মেইল পোর্টে CONNECT অনুমোদন করতে হবে। কেউ কেউ এটি 443 পোর্টের HTTPS গন্তব্যে সীমিত রাখে। অন্তর্নিহিত TLS SMTP-এর জন্য, STARTTLS জারি না করে NewClient কল করার আগে গন্তব্যের TLS সেশন প্রতিষ্ঠা করুন।

সম্পর্কিত নিবন্ধ