Python SMTP-innsending: STARTTLS á 587 eða TLS á 465?
STARTTLS á 587 og óbeint TLS á 465 flytja bæði Python-innsendingu, en aðeins annað hentar endurvarpanum þínum. Berðu saman handabandið og bilunarmynsturin.
Báðar tengiaðferðir flytja sama skeytið á sama endurvarpsreikning, og munurinn liggur í því hvar TLS hefst, ekki í því hvað er sent. Önnur opnast í ljósum texta og uppfærist innan sambandsins; hin er dulrituð frá fyrsta bæti. Þessi eini munur ræður því hvað strangar endurvarpsreglur samþykkja, hvað millitæki getur séð og hvaða villuskilaboð þú munt eyða síðdegi í að lesa. Hér er hvernig ég vel á milli þeirra þegar forrit í einkaneti afhendir skeyti til innri innsendingarþjónustu.
Hvar aðferðirnar tvær skilja reyndar
Verkefnið er eins í báðum tilvikum: auðkenna sem samþykktan reikning, nefna leyfðan sendanda, telja upp viðtakendur og bíða eftir að endurvarpið taki ábyrgð. Það sem breytist er röð aðgerða. Gátt 587 byrjar sem SMTP-lot í ljósum texta, auglýsir STARTTLS í EHLO-svarinu og uppfærist aðeins ef biðlarinn biður um það. Gátt 465 væntir TLS-handabands áður en nokkur SMTP-skipun er sögð.
Innsending og endurvarp eru ólík störf, þess vegna eru gáttanúmerin ekki skiptanlegar venjur. RFC 6409 lýsir innsendingu skeyta sem eigin þjónustu, og RFC 8314 nær yfir afbrigði óbeins TLS sem flest nútíma endurvörp bjóða á 465. Ef endurvarpið þitt skjalfestir annað tveggja, gengur sú skjölun framar hvaða vali sem þú öðlaðist hjá fyrri vinnuveitanda.
Hvað STARTTLS á 587 gefur þér
Uppfærslan á sér stað innan SMTP-samtalsins, þannig að endurvarpið getur auglýst hana og biðlarinn getur neitað að halda áfram án hennar. Í Python kastar starttls() undantekningu þegar þjónninn býður ekki viðbótina, sem breytir tilraun til niðurfærslu í sýnilega bilun í stað hljóðlausrar innskráningar í ljósum texta. Þessi hegðun er aðalröksemdin fyrir aðferðinni, og það er þess virði að treysta henni viljandi en ekki fyrir tilviljun.
Útsetningargluggin er lítill en raunverulegur: fyrsta EHLO-skiptin eru læsileg, og ekkert fyrir uppfærsluna ber skilríki. Á einkaleið milli undirnets forrits og innra endurvarps er sá gluggi yfirleitt ásættanlegur. Á leið sem þú stjórnar ekki er það ástæðan fyrir því að sum teymi krefjast hinnar aðferðarinnar.
Tæki sem fjarlægir STARTTLS-getuna framleiðir misheppnaða innsendingu, ekki afturhvarf. Það er útkoman sem þú vilt, og það er líka fljótlegasta leiðin til að uppgötva að eitthvað er að endurskrifa SMTP á leiðinni.
Hvað óbeint TLS á 465 breytir
Enginn ljós-texta-fasi er til staðar. Biðlarinn framkvæmir TLS-handaband um leið og sambandið opnast, staðfestir vottorðið gegn traustageymslu sinni og skiptist aðeins þá á EHLO, AUTH og skeytinu. Ekkert getur niðurfært lotuna því engin ljós-texta-staða er til að semja út frá, og það fjarlægir heilan flokk bilana við hlerun.
Skiptin eru greiningarhæfni. Endurvarp sem svarar á 465 með ljósum SMTP, eða hleðslujafnari sem lýkur TLS með röngu vottorðsnafni, bregst við handabandinu og gefur þér SSL-villu í stað póstvillu. Þegar það gerist er vandamálið undir forritinu, og engin skeytasmíð bætir það.
Ein innsendingaraðgerð, tveir flutningsmátar
Kóðinn er varla ólíkur milli aðferðanna, þess vegna ætti valið að byggjast á endurvarpsreglum en ekki þægindum safnsins. Flyttu stillingarnar út fyrst og keyrðu síðan eitt skript sem velur flutningsmátinn eftir stilltri gátt.
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() staðfestir keðjuna og hýsingarheitið, svo einkarekin CA verður að setja í traustageymsluna í stað þess að fara fram hjá henni með óstaðfestu samhengi. send_message() skilar orðabók yfir viðtakendur sem endurvarpið hafnaði; tóm orðabók þýðir að það samþykkti alla. Tímamörkin fimmtán sekúndur eru upphafspunktur, ekki stillt gildi fyrir netið þitt.
Haltu lykilorðinu utan myndarinnar og utan annála. Leyndarmál sem er fest við keyrslu og lesið inn í umhverfið er í lagi; að bergmála umhverfinu í annálalínu er það ekki, og villuleitarspor AUTH-skiptanna ekki heldur.
Veldu eftir endurvarpsreglum og leið, ekki venju
Þrjú skilyrði ráða því. Í fyrsta lagi hvað endurvarpið auglýsir í raun: þjónusta sem hlustar aðeins á 587 með STARTTLS er ekki aðgengileg á 465, hversu mikið sem þú vilt óbeint TLS. Í öðru lagi hvort leiðin milli forritsins og endurvarpsins sé nógu traust til að samþykkja læsileg EHLO-skipti. Í þriðja lagi hvort eitthvað í miðjunni endurskrifi eða milliþjóni SMTP, því það ræður því hvort niðurfærsluáhættan er fræðileg eða raunveruleg.
Þegar endurvarpið býður bæði tek ég 465 fyrir þjónustu sem gengur án eftirlits og 587 fyrir þá þar sem maður fylgist með fyrstu uppsetningunni, einfaldlega vegna þess að bilunarskilaboðin vísa á ólík lög. Það val er mitt og það er ekki stefna.
Hvað sem þú velur, skráðu gáttina, traustefnið og lén sendandans með uppsetningunni. Sendu síðan eitt heimilað prófunarskeyti og staðfestu að endurvarpið hafi samþykkt það, og haltu innsendingarniðurstöðunni og hverri síðari afhendingarskýrslu sem aðskildum færslum. Árangursrík afhending til endurvarpsins er endir ábyrgðar forritsins, ekki sönnun þess að skeytið hafi náð pósthólfi.