Àwọn ọ̀nà ìsokọ́ méjèèjì ń gbé ìhìn iṣẹ́ kan náà lọ sí àkọsílẹ̀ relay kan náà, ìyàtọ̀ wà níbi tí TLS ti bẹ̀rẹ̀, kì í ṣe ohun tí a ń rán. Ọ̀kan ń ṣí ní ọ̀rọ̀ tòótọ́ tí ó sì ń gòkè nínú ìsopọ̀; èkejì ni a ti pa mọ́ láti báìtì àkọ́kọ́. Ìyàtọ̀ kan náà ni ó ń pinnu ohun tí ìlànà relay líle yóò gbà, ohun tí ẹ̀rọ àárín lè kíyèsí, àti irú ìhìn àṣìṣe tí ìwọ yóò lo ọ̀sán kan láti kà. Èyí ni bí mo ṣe ń yàn láàrin wọn nígbà tí ẹ̀rọ ìṣe kan nínú nẹ́tíwọ́ọ̀kì àdáni bá fi ìhìn lé iṣẹ́ ìfiránṣẹ́ inú lọ́wọ́.

Ibí tí ọ̀nà méjèèjì ti yàtọ̀ gan-an

Iṣẹ́ náà jẹ́ bákan náà nínú àwọn ìpò méjèèjì: jẹ́rìí gẹ́gẹ́ bí àkọsílẹ̀ tí a fọwọ́ sí, dárúkọ olùránṣẹ́ tí a gbà láàyè, kọ orúkọ àwọn olùgbà, kí o sì dúró de tí relay yóò gbé ẹ̀rù iṣẹ́ náà. Ohun tí ó ń yí padà ni ìtòlẹ́sẹẹsẹ àwọn iṣẹ́. Pọ́ọ̀tì 587 bẹ̀rẹ̀ gẹ́gẹ́ bí ìpàdé SMTP ní ọ̀rọ̀ tòótọ́, ó ń polongo STARTTLS nínú ìdáhùn EHLO, a sì ń gbé e gòkè kìkì bí oníbàárà bá béèrè. Pọ́ọ̀tì 465 ń retí ìfọwọ́bọ̀wé TLS kí a tó sọ àṣẹ SMTP kankan.

Ìfiránṣẹ́ àti relay jẹ́ iṣẹ́ ọ̀tọ̀ọ̀tọ̀, nítorí náà àwọn nọ́mbà pọ́ọ̀tì kì í ṣe àṣà tí a lè pààrọ̀. RFC 6409 ń ṣàpèjúwe ìfiránṣẹ́ ìhìn gẹ́gẹ́ bí iṣẹ́ tirẹ̀, RFC 8314 sì ń bo irú TLS àṣírí tí ọ̀pọ̀ relay òde òní ń pèsè lórí 465. Bí relay rẹ bá kọ ọ̀kan nínú méjèèjì, ìwé náà ju ìfẹ́kúfẹ̀ẹ́kankan tí o gbà lọ́wọ́ agbanisíṣẹ́ àtẹ̀yìnwá.

Ohun tí STARTTLS lórí 587 ń fún ọ

Ìgbéga ń ṣẹlẹ̀ nínú ìbáṣepọ̀ SMTP, nítorí náà relay lè polongo rẹ̀, oníbàárà sì lè kọ̀ láti tẹ̀síwájú láìsí i. Nínú Python, starttls() ń sọ ìyàsọ́tọ̀ jáde nígbà tí olùpèsè kò bá pèsè àfikún náà, èyí tí ó yí ìgbìyànjú ìsọ̀kalẹ̀ padà sí ìṣẹ̀dẹ́ tí ó hàn kedere dípò ìwọlé ọ̀rọ̀ tòótọ́ tí ó dákẹ́. Ìwà yẹn ni àríyànjiyàn pàtàkì fún ọ̀nà yìí, ó sì yẹ láti gbára lé e pẹ̀lú ìpinnu kì í ṣe pẹ̀lú àìròtẹ́lẹ̀.

Fèrèsé ìfihàn kéré ṣùgbọ́n ó jẹ́ gidi: ìpààrọ̀ EHLO àkọ́kọ́ jẹ́ kíkà, kò sì sí ohun tí ó ń gbé ẹ̀rí ní àkọ́kọ́ ṣáájú ìgbéga. Lórí ọ̀nà àdáni láàrin nẹ́tíwọ́ọ̀kì abẹ́lẹ̀ ẹ̀rọ ìṣe àti relay inú, fèrèsé yẹn máa ń jẹ́ ìtẹ́wọ́gbà. Lórí ọ̀nà tí ìwọ kò ṣàkóso, ìdí ni yẹn tí àwọn ẹgbẹ́ kan fi ń tẹnu mọ́ ọ̀nà kejì.

Ẹ̀rọ àdídẹ́wọ̀n tí ó yọ agbára STARTTLS kúrò ń mú ìfiránṣẹ́ tí ó kùnà jáde, kì í ṣe ìpadà sẹ́yìn. Ìyẹn ni èsì tí o fẹ́, ó sì tún jẹ́ ọ̀nà tí ó yára jù láti ṣàwárí pé ohun kan ń tún SMTP kọ lórí ọ̀nà.

Ohun tí TLS àṣírí lórí 465 ń yí padà

Kò sí ìpele ọ̀rọ̀ tòótọ́ rárá. Oníbàárà ń ṣe ìfọwọ́bọ̀wé TLS ní kété tí socket bá ṣí, ó ń jẹ́rìí ìwé ẹ̀rí náà pẹ̀lú ilé ìkópamọ́ra rẹ̀, àti lẹ́yìn náà ni ó ń pààrọ̀ EHLO, AUTH àti ìhìn náà. Kò sí ohun tí ó lè sọ ìpàdé náà kalẹ̀ nítorí kò sí ipò ọ̀rọ̀ tòótọ́ láti ṣe ìdúnàádúrà, èyí sì ń yọ gbogbo ẹ̀ka ìkùnà àdídẹ́wọ̀n kúrò.

Ohun tí a ń pààrọ̀ ni agbára àyẹ̀wò àrùn. Relay tí ó ń dáhùn lórí 465 pẹ̀lú SMTP ọ̀rọ̀ tòótọ́, tàbí olùdọ́gba ẹ̀rù tí ń parí TLS pẹ̀lú orúkọ ìwé ẹ̀rí tí kò tọ́, ń kùnà ní ìfọwọ́bọ̀wé, ó sì ń fún ọ ní àṣìṣe SSL dípò àṣìṣe mail. Nígbà tí ìyẹn bá ṣẹlẹ̀, ìṣòro wà lábẹ́ ẹ̀rọ ìṣe, kò sì sí iye ìkọ́ ìhìn tí yóò tún un ṣe.

Iṣẹ́ ìfiránṣẹ́ kan, ọ̀nà ìgbé lọ méjì

Kóòdù kì í fi bẹ́ẹ̀ yàtọ̀ láàrin àwọn ọ̀nà, nítorí náà yíyàn yẹ láti wá láti ìlànà relay kì í ṣe ìrọ̀rùn ilé-ìkàwé. Kọ́kọ́ gbé àwọn ètò jáde, lẹ́yìn náà ṣe script kan tí ó ń yan ọ̀nà ìgbé lọ láti pọ́ọ̀tì tí a ti ṣètò.

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() ń jẹ́rìí ẹ̀wọ̀n àti orúkọ agbàlejò, nítorí náà CA àdáni gbọ́dọ̀ wà nínú ilé ìkópamọ́ra, kì í ṣe kí a yẹ̀ é kúrò pẹ̀lú ipò tí a kò jẹ́rìí. send_message() ń dá ìwé-ìtumọ̀ àwọn olùgbà tí relay kọ̀ padà; ìwé-ìtumọ̀ òfo túmọ̀ sí pé ó gbà gbogbo wọn. Àkókò ìdúró ìṣẹ́jú àáyá mẹ́ẹ̀dógún ni ibẹ̀rẹ̀, kì í ṣe iye tí a ti ṣàtúnṣe fún nẹ́tíwọ́ọ̀kì rẹ.

Pa ọ̀rọ̀ ìpamọ́ mọ́ kúrò nínú àwòrán àti kúrò nínú àwọn àkọsílẹ̀. Àṣírí tí a fi sórí ní àkókò ìṣiṣẹ́ tí a sì kà sínú àyíká dára; fífi àyíká hàn nínú ìlà àkọsílẹ̀ kò dára, bẹ́ẹ̀ sì ni ojú ìṣàtúpalẹ̀ àṣìṣe ti ìpààrọ̀ AUTH kò dára.

Yan ní ìbámu pẹ̀lú ìlànà relay àti ọ̀nà, kì í ṣe àṣà

Àwọn ipò mẹ́ta ń pinnu rẹ̀. Ìkíní, ohun tí relay polongo gan-an: iṣẹ́ tí ó ń gbọ́rọ̀ lórí 587 pẹ̀lú STARTTLS nìkan kò lè dé 465, bí o ti fẹ́ TLS àṣírí tó. Ìkejì, bóyá ọ̀nà láàrin ẹ̀rọ ìṣe àti relay jẹ́ aláìléwu tó láti gba ìpààrọ̀ EHLO tí a lè kà. Ìkẹta, bóyá ohun kan wà ní àárín tí ń tún SMTP kọ tàbí ń ṣe proxy, nítorí ìyẹn ni ó ń pinnu bóyá ewu ìsọ̀kalẹ̀ jẹ́ ti ìmọ̀ràn tàbí ti gidi.

Nígbà tí relay bá pèsè méjèèjì, mo ń gbé 465 fún iṣẹ́ tí ń ṣiṣẹ́ láìsí àbójútó àti 587 fún èyí tí ènìyàn ń wo ìgbékalẹ̀ àkọ́kọ́, kìkì nítorí pé àwọn ìhìn ìkùnà ń tọ́ka sí àwọn ìpele ọ̀tọ̀ọ̀tọ̀. Ìfẹ́ yẹn jẹ́ tèmi, kì í sì ṣe ìlànà.

Ohunkóhun tí o bá yàn, kọ pọ́ọ̀tì náà, ohun èlò ìkópamọ́ra àti agbègbè olùránṣẹ́ pẹ̀lú ìgbékalẹ̀ náà. Lẹ́yìn náà rán ìhìn ìdánwò kan tí a fọwọ́ sí kí o sì jẹ́rìí pé relay gbà á, kí o sì pa èsì ìfiránṣẹ́ àti ìròyìn ìfijíṣẹ́ èyíkéyìí tí ó bá yọjú lẹ́yìn náà mọ́ gẹ́gẹ́ bí àkọsílẹ̀ ọ̀tọ̀ọ̀tọ̀. Ìfijíṣẹ́ tí ó ṣàṣeyọrí sí relay ni òpin ojúṣe ẹ̀rọ ìṣe, kì í ṣe ẹ̀rí pé ìhìn náà dé àpótí ìwọlé.

Àwọn àpilẹ̀kọ tó jọra