smtp.Dial-ը նոր կապ է բացում իր հասցեին։ HTTP CONNECT proxy-ի միջոցով կապ ստանալուց հետո այդ գոյություն ունեցող հոսքը փոխանցեք 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 հոսթին և պորտին, proxy-ի CONNECT փոխանակումն ավարտված։ Միայն proxy-ին TCP բացելը բավարար չէ․ HTTP պատասխանը SMTP ողջույն չէ։

mailHost-ը SMTP սերվերի հոսթի անունն է՝ առանց պորտի։ Պահեք այդ ինքնությունը SMTP նույնականացման և սերտիֆիկատի ստուգման համար։ HTTPS proxy-ին TLS կապը պաշտպանում է երթուղու մեկ այլ հատված։

Վերադարձված հաճախորդը պատրաստ է հավելվածի գոյություն ունեցող SMTP նույնականացմանը և փոստային գործարքին։ Փակեք այն ավարտելուց հետո։ Սահմանափակեք հավաքումը, CONNECT-ը և հետագա արձանագրային գործողությունները հավելվածի ժամկետների քաղաքականությամբ։

Proxy-ն պետք է թույլատրի CONNECT ընտրված փոստային պորտին։ Ոմանք այն սահմանափակում են 443 պորտի HTTPS նպատակներով։ Իմպլիցիտ TLS-ով SMTP-ի համար նշանակման TLS սեսիան հաստատեք NewClient-ը կանչելուց առաջ՝ STARTTLS ուղարկելու փոխարեն։

Առնչվող հոդվածներ