Python SMTP ரிலே சமர்ப்பிப்பு: 587 இல் STARTTLS அல்லது 465 இல் TLS?
587 இல் STARTTLS மற்றும் 465 இல் மறைமுக TLS இரண்டும் Python சமர்ப்பிப்பைக் கொண்டு செல்கின்றன, ஆனால் உங்கள் ரிலேக்கு ஒன்று மட்டுமே பொருந்தும். கைக்குலுக்கல் மற்றும் தோல்வி முறைகளை ஒப்பிடுங்கள்.
இரண்டு இணைப்பு முறைகளும் ஒரே செய்தியை ஒரே ரிலே கணக்கிற்குக் கொண்டு செல்கின்றன, வேறுபாடு TLS எங்கு தொடங்குகிறது என்பதில், என்ன அனுப்பப்படுகிறது என்பதில் அல்ல. ஒன்று தெளிவான உரையில் திறந்து இணைப்பிற்குள் மேம்படுத்தப்படுகிறது; மற்றொன்று முதல் பைட்டிலிருந்தே மறையாக்கப்பட்டுள்ளது. அந்த ஒரே வேறுபாடுதான் கடுமையான ரிலே கொள்கை எதை ஏற்கும், இடைநிலை சாதனம் எதைக் கவனிக்க முடியும், எந்தப் பிழைச் செய்தியை நீங்கள் அரை நாள் படித்துக்கொண்டிருப்பீர்கள் என்பதைத் தீர்மானிக்கிறது. தனியார் வலையமைப்பில் உள்ள பயன்பாடு உள் சமர்ப்பிப்பு சேவைக்கு செய்தியை ஒப்படைக்கும்போது நான் இவற்றுக்கிடையே எவ்வாறு தேர்வு செய்கிறேன் என்பது இங்கே.
இரண்டு முறைகளும் உண்மையில் எங்கு பிரிகின்றன
இரண்டு நிலைகளிலும் பணி ஒன்றுதான்: அங்கீகரிக்கப்பட்ட கணக்காக அடையாளம் காட்டுங்கள், அனுமதிக்கப்பட்ட அனுப்புநரைக் குறிப்பிடுங்கள், பெறுநர்களைப் பட்டியலிடுங்கள், ரிலே பொறுப்பை ஏற்கும் வரை காத்திருங்கள். மாறுவது செயல்பாடுகளின் வரிசை. போர்ட் 587 தெளிவான உரை SMTP அமர்வாகத் தொடங்குகிறது, EHLO பதிலில் STARTTLS ஐ அறிவிக்கிறது, கிளையண்ட் கேட்டால் மட்டுமே மேம்படுத்தப்படுகிறது. போர்ட் 465 எந்த SMTP கட்டளையும் சொல்லப்படுவதற்கு முன் TLS கைக்குலுக்கலை எதிர்பார்க்கிறது.
சமர்ப்பிப்பும் ரிலேயும் வெவ்வேறு வேலைகள், எனவே போர்ட் எண்கள் பரிமாறிக்கொள்ளக்கூடிய பழக்கங்கள் அல்ல. RFC 6409 செய்தி சமர்ப்பிப்பைத் தனிச் சேவையாக விவரிக்கிறது, RFC 8314 பெரும்பாலான நவீன ரிலேக்கள் 465 இல் வழங்கும் மறைமுக-TLS வகையை உள்ளடக்குகிறது. உங்கள் ரிலே இரண்டில் ஒன்றை ஆவணப்படுத்தினால், அந்த ஆவணம் முன்னாள் வேலைவாய்ப்பாளரிடமிருந்து பெற்ற எந்த விருப்பத்தையும் விட மேலானது.
587 இல் STARTTLS உங்களுக்கு என்ன தருகிறது
மேம்படுத்தல் SMTP உரையாடலுக்குள் நடக்கிறது, எனவே ரிலே அதை அறிவிக்க முடியும், கிளையண்ட் அது இல்லாமல் தொடர மறுக்க முடியும். Python இல், சேவையகம் அந்த நீட்டிப்பை வழங்காதபோது starttls() விதிவிலக்கை எறிகிறது, இது தரமிறக்க முயற்சியை அமைதியான தெளிவான-உரை உள்நுழைவுக்குப் பதிலாகத் தெரியும் தோல்வியாக மாற்றுகிறது. அந்த நடத்தையே இந்த முறையின் முக்கிய வாதம், அதைத் தற்செயலாக அல்ல, வேண்டுமென்றே நம்புவது மதிப்புள்ளது.
வெளிப்படும் சாளரம் சிறியது ஆனால் உண்மையானது: ஆரம்ப EHLO பரிமாற்றம் படிக்கக்கூடியது, மேம்படுத்தலுக்கு முன் எதுவும் சான்றுகளைக் கொண்டு செல்லாது. பயன்பாட்டு துணைநெட்வொர்க்கிற்கும் உள் ரிலேக்கும் இடையிலான தனியார் பாதையில் அந்தச் சாளரம் பொதுவாக ஏற்கத்தக்கது. நீங்கள் கட்டுப்படுத்தாத பாதையில், சில குழுக்கள் மற்ற முறையில் வலியுறுத்துவதற்கான காரணம் அதுவே.
STARTTLS திறனை நீக்கும் இடைமறிப்புச் சாதனம் தோல்வியடைந்த சமர்ப்பிப்பை உருவாக்குகிறது, பின்வாங்கலை அல்ல. அதுவே நீங்கள் விரும்பும் முடிவு, பாதையில் ஏதோ SMTP ஐ மீண்டும் எழுதுகிறது என்பதைக் கண்டறியும் வேகமான வழியும் அதுவே.
465 இல் மறைமுக TLS என்ன மாற்றுகிறது
தெளிவான உரை கட்டமே இல்லை. சாக்கெட் திறந்தவுடன் கிளையண்ட் TLS கைக்குலுக்கலைச் செய்கிறது, தனது நம்பிக்கைக் கிடங்கிற்கு எதிராகச் சான்றிதழைச் சரிபார்க்கிறது, அதன் பின்னரே EHLO, AUTH மற்றும் செய்தியைப் பரிமாறுகிறது. பேச்சுவார்த்தைக்கு எந்தத் தெளிவான-உரை நிலையும் இல்லாததால் எதுவும் அமர்வைத் தரமிறக்க முடியாது, அது இடைமறிப்புத் தோல்விகளின் ஒரு முழு வகுப்பையும் நீக்குகிறது.
இந்தப் பரிமாற்றம் நோயறிதல் திறன். 465 இல் தெளிவான-உரை SMTP உடன் பதிலளிக்கும் ரிலே, அல்லது தவறான சான்றிதழ் பெயருடன் TLS ஐ முடிக்கும் சுமை சமநிலைப்படுத்தி, கைக்குலுக்கலில் தோல்வியடைந்து மின்னஞ்சல் பிழைக்குப் பதிலாக SSL பிழையைத் தருகிறது. அது நிகழும்போது, சிக்கல் பயன்பாட்டிற்குக் கீழே உள்ளது, எவ்வளவு செய்தி கட்டப்பட்டாலும் அது சரிசெய்யாது.
ஒரு சமர்ப்பிப்பு செயல்பாடு, இரண்டு இடமாற்றங்கள்
குறியீடு இரு முறைகளுக்கிடையே அரிதாகவே வேறுபடுகிறது, எனவே தேர்வு நூலக வசதியிலிருந்து அல்ல, ரிலே கொள்கையிலிருந்து செய்யப்பட வேண்டும். முதலில் அமைப்புகளை ஏற்றுமதி செய்யுங்கள், பின்னர் உள்ளமைக்கப்பட்ட போர்ட்டிலிருந்து இடமாற்றத்தைத் தேர்ந்தெடுக்கும் ஒரு ஸ்கிரிப்டை இயக்குங்கள்.
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() சங்கிலியையும் புரவலன் பெயரையும் சரிபார்க்கிறது, எனவே தனியார் CA நம்பிக்கைக் கிடங்கில் நிறுவப்பட வேண்டும், சரிபார்க்கப்படாத சூழலுடன் தவிர்க்கக்கூடாது. send_message() ரிலே நிராகரித்த பெறுநர்களின் அகராதியைத் திருப்பித் தருகிறது; காலி அகராதி என்பது அது அனைவரையும் ஏற்றுக்கொண்டது என்பதாகும். பதினைந்து வினாடி நேரவரம்பு ஒரு தொடக்கப் புள்ளி, உங்கள் வலையமைப்பிற்காகத் துண்டிக்கப்பட்ட மதிப்பு அல்ல.
கடவுச்சொல்லை படத்திற்கு வெளியேயும் பதிவுகளுக்கு வெளியேயும் வைத்திருங்கள். இயக்க நேரத்தில் ஏற்றப்பட்டு சூழலுக்குப் படிக்கப்படும் ரகசியம் சரி; சூழலைப் பதிவு வரியில் எதிரொலிப்பது சரியல்ல, AUTH பரிமாற்றத்தின் பிழைத்திருத்தத் தடமும் அல்ல.
பழக்கத்தால் அல்ல, ரிலே கொள்கை மற்றும் பாதையால் தேர்ந்தெடுங்கள்
மூன்று நிபந்தனைகள் இதைத் தீர்மானிக்கின்றன. முதலில், ரிலே உண்மையில் என்ன அறிவிக்கிறது: 587 இல் STARTTLS உடன் மட்டும் கேட்கும் சேவையை 465 இல் அடைய முடியாது, நீங்கள் எவ்வளவு மறைமுக TLS விரும்பினாலும். இரண்டாவது, பயன்பாட்டிற்கும் ரிலேக்கும் இடையிலான பாதை படிக்கக்கூடிய EHLO பரிமாற்றத்தை ஏற்கும் அளவுக்கு நம்பகமானதா என்பது. மூன்றாவது, நடுவில் ஏதோ SMTP ஐ மீண்டும் எழுதுகிறதா அல்லது பதிலாளியாகச் செய்கிறதா என்பது, ஏனெனில் தரமிறக்க ஆபத்து கோட்பாட்டளவா அல்லது உண்மையானதா என்பதை அது தீர்மானிக்கிறது.
ரிலே இரண்டையும் வழங்கும்போது, கண்காணிப்பின்றி இயங்கும் சேவைக்கு 465 ஐ எடுத்துக்கொள்கிறேன், முதல் பிரயோகத்தை ஒரு நபர் பார்க்கும் சேவைக்கு 587 ஐ எடுத்துக்கொள்கிறேன், தோல்விச் செய்திகள் வெவ்வேறு அடுக்குகளைச் சுட்டுவதால் மட்டுமே. அந்த விருப்பம் என்னுடையது, அது கொள்கை அல்ல.
எதைத் தேர்ந்தெடுத்தாலும், போர்ட், நம்பிக்கைப் பொருள் மற்றும் அனுப்புநர் களத்தைப் பிரயோகத்துடன் பதிவு செய்யுங்கள். பின்னர் ஒரு அங்கீகரிக்கப்பட்ட சோதனைச் செய்தியை அனுப்பி ரிலே அதை ஏற்றுக்கொண்டதை உறுதிப்படுத்துங்கள், சமர்ப்பிப்பு முடிவையும் பின்னர் வரும் எந்த விநியோக அறிக்கையையும் தனித்தனிப் பதிவுகளாக வைத்திருங்கள். ரிலேக்கு வெற்றிகரமான ஒப்படைப்பு பயன்பாட்டின் பொறுப்பின் முடிவு, செய்தி உள்வரும் பெட்டியை அடைந்தது என்பதற்கான சான்று அல்ல.