Iż-żewġ modi ta' konnessjoni jġorru l-istess messaġġ lejn l-istess kont tar-relay, u d-differenza hija fejn jibda TLS, mhux x'in jintbagħat. Wieħed jiftaħ b'test ċar u jiġi aġġornat fil-medda; l-ieħor huwa kriptat mill-ewwel byte. Dik id-differenza waħda tiddetermina x'se taċċetta politika tar-relay stretta, x'jista' josserva apparat intermedjarju, u liema messaġġ ta' żball se tqatta' nofs ta' jum taqrah. Hawn kif nagħżel bejniethom meta applikazzjoni f'netwerk privat tgħaddi messaġġ lil servizz ta' sottomissjoni intern.

Fejn iż-żewġ modi tassew jiddivverġu

Il-kompitu huwa identiku fiż-żewġ każi: tawtentika bħala kont approvat, semmi mittent permess, elenka d-destinatarji, u stenna li r-relay jassumi r-responsabbiltà. Dak li jinbidel huwa l-ordni tal-operazzjonijiet. Il-port 587 jibda bħala sessjoni SMTP b'test ċar, jirreklama STARTTLS fit-tweġiba EHLO, u jiġi aġġornat biss jekk il-klijent jitlob dan. Il-port 465 jistenna handshake TLS qabel ma tingħad xi kmand SMTP.

Is-sottomissjoni u r-relay huma xogħlijiet differenti, u għalhekk in-numri tal-port mhumiex drawwiet li jistgħu jiġu skambjati. RFC 6409 jiddeskrivi s-sottomissjoni tal-messaġġi bħala servizz għalih, u RFC 8314 ikopri l-varjant TLS impliċitu li l-biċċa l-kbira tar-relays moderni jesponu fuq 465. Jekk ir-relay tiegħek jiddokumenta wieħed miż-żewġ, dak id-dokument jieħu preċedenza fuq kwalunkwe preferenza li ksibt mingħand impjegatur preċedenti.

X'jagħtik STARTTLS fuq 587

L-aġġornament iseħħ ġewwa l-konversazzjoni SMTP, għalhekk ir-relay jista' jirreklamah u l-klijent jista' jirrifjuta li jkompli mingħajru. Fi Python, starttls() iqajjem eċċezzjoni meta s-server ma joffrix dik l-estensjoni, u dan ibiddel tentattiv ta' degradazzjoni fi falliment viżibbli minflok login sieket b'test ċar. Dan l-imġiba huwa l-argument ewlieni tal-mod, u jiswa li tiddependi fuqu b'mod deliberat u mhux b'inċident.

It-tieqa ta' espożizzjoni hija żgħira iżda reali: l-iskambju EHLO inizjali jinqara, u xejn qabel l-aġġornament ma jġorr kredenzjali. Fuq passaġġ privat bejn subnetwork tal-applikazzjoni u relay intern, dik it-tieqa normalment tkun aċċettabbli. Fuq passaġġ li ma tikkontrollax, dan huwa eżattament ir-raġuni għaliex xi timijiet jinsistu fuq il-mod l-ieħor.

Apparat ta' interċettazzjoni li jneħħi l-kapaċità STARTTLS jipproduċi sottomissjoni falluta, mhux rikors lura. Dan huwa r-riżultat li trid, u huwa wkoll l-eħfef mod biex tiskopri li xi ħaġa qed terġa' tikteb SMTP fuq il-passaġġ.

X'jinbidel bit-TLS impliċitu fuq 465

M'hemm l-ebda fażi ta' test ċar xejn. Il-klijent jagħmel handshake TLS hekk kif jinfetaħ is-socket, jivvalida ċ-ċertifikat kontra l-maħżen tal-fiduċja tiegħu, u biss imbagħad jiskambja EHLO, AUTH u l-messaġġ. Xejn ma jista' jnaqqas is-sessjoni għax m'hemmx stat ta' test ċar biex wieħed jinnegozja minnu, u dan ineħħi klassi sħiħa ta' fallimenti ta' interċettazzjoni.

Il-bdil hija d-dijanjostiċità. Relay li jwieġeb fuq 465 b'SMTP ta' test ċar, jew bilanċjatur tat-tagħbija li itemm it-TLS bl-isem taċ-ċertifikat żbaljat, ifalli fil-handshake u jagħtik żball SSL minflok żball tal-posta. Meta dan jiġri, il-problema tinsab taħt l-applikazzjoni, u l-ebda ammont ta' kostruzzjoni tal-messaġġ ma se jsewwih.

Funzjoni waħda ta' sottomissjoni, żewġ trasporti

Il-kodiċi bilkemm ivarja bejn il-modi, u għalhekk l-għażla għandha ssir mill-politika tar-relay u mhux mill-konvenjenza tal-librerija. Esporta l-ambjenti l-ewwel, imbagħad ħaddem skritt wieħed li jagħżel it-trasport mill-port konfigurat.

export SMTP_HOST=smtp.relay.internal
export SMTP_PORT=587
export SMTP_USER=svc-notify
export [email protected]
export [email protected]
export SMTP_PASSWORD="$(cat /run/secrets/smtp_password)"
import os, smtplib, ssl
from email.message import EmailMessage

ctx = ssl.create_default_context()
msg = EmailMessage()
msg["From"] = os.environ["MAIL_FROM"]
msg["To"] = os.environ["MAIL_TEST_TO"]
msg["Subject"] = "relay submission test"
msg.set_content("One authorized test message from the app.")

host = os.environ["SMTP_HOST"]
port = int(os.environ.get("SMTP_PORT", "587"))

if port == 465:
    client = smtplib.SMTP_SSL(host, port, context=ctx, timeout=15)
else:
    client = smtplib.SMTP(host, port, timeout=15)
    client.ehlo()
    client.starttls(context=ctx)
    client.ehlo()

with client:
    client.login(os.environ["SMTP_USER"], os.environ["SMTP_PASSWORD"])
    refused = client.send_message(msg)

print("refused:", refused)

create_default_context() jivverifika l-katina u l-isem tal-host, għalhekk CA privata trid tiġi installata fil-maħżen tal-fiduċja minflok ma tiġi evitata b'kuntest mhux ivverifikat. send_message() jirritorna dizzjunarju tad-destinatarji li r-relay irrifjuta; dizzjunarju vojt ifisser li aċċetta lil kulħadd. Il-timeout ta' ħmistax-il sekonda huwa punt tat-tluq, mhux valur irranġat għan-netwerk tiegħek.

Żomm il-password barra mill-immaġni u barra mil-logs. Sigriet immuntat waqt ir-runtime u moqri fl-ambjent huwa sew; li l-ambjent jiġi rifless f'linja tal-log mhuwiex, u lanqas traċċa ta' debug tal-iskambju AUTH.

Agħżel skont il-politika tar-relay u l-passaġġ, mhux skont id-drawwa

Tliet kundizzjonijiet jiddeċiduh. L-ewwel, x'jirreklama r-relay tassew: servizz li jisma' biss fuq 587 b'STARTTLS ma jistax jintlaħaq fuq 465, kemm tħobb it-TLS impliċitu. It-tieni, jekk il-passaġġ bejn l-applikazzjoni u r-relay huwiex affidabbli biżżejjed biex jaċċetta skambju EHLO li jinqara. It-tielet, jekk xi ħaġa fin-nofs terġax tikteb jew tipproxja SMTP, għax dan jiddetermina jekk ir-riskju ta' degradazzjoni huwiex teoretiku jew reali.

Meta r-relay joffri t-tnejn, nieħu 465 għal servizz li jaħdem bla sorveljanza u 587 għal dak fejn persuna qed tara l-ewwel varar, sempliċement għax il-messaġġi ta' falliment jindikaw saffi differenti. Dik il-preferenza hija tiegħi u mhijiex politika.

Tajjeb liema tgħażel, irreġistra l-port, il-materjal tal-fiduċja u d-dominju tal-mittent flimkien mal-varar. Imbagħad ibgħat messaġġ tat-test awtorizzat wieħed u kkonferma li r-relay aċċettah, filwaqt li żżomm ir-riżultat tas-sottomissjoni u kwalunkwe rapport ta' kunsinna aktar tard bħala rekords separati. Kunsinna b'suċċess lir-relay hija t-tmiem tar-responsabbiltà tal-applikazzjoni, mhux prova li l-messaġġ wasal sa inbox.

Artikli relatati