دواړه د اړیکې طریقې ورته پیغام ورته د ریلې حساب ته رسوي، او توپیر په دې کې دی چې TLS چېرته پیلېږي، نه په دې کې چې څه لیږل کیږي۔ یو له سره متن کې خلاصیږي او د باندې دننه لوړیږي؛ بل له لومړي بایټ څخه کوډ شوی دی۔ همدا یو توپیر دا ټاکي چې سخت د ریلې تګلاره به څه ومني، منځنی وسیله څه وګوري، او کوم د تېروتنې پیغام به تاسو ټوله ماسپښین ولولئ۔ کله چې په شخصي شبکه کې یو اپلیکیشن د داخلي سپارنې خدمت ته پیغام سپاري، زه څنګه د دې دواړو ترمنځ غوره کوم، هغه دا دی۔

دواړه طریقې واقعاً چېرته بېلېږي

په دواړو حالتونو کې کار یو شان دی: د منل شوي حساب په توګه تصدیق کړئ، د اجازه لرونکي لیږونکي نوم واخلئ، ترلاسه کوونکي ولیکئ، او د ریلې د مسؤلیت منلو انتظار وکړئ۔ هغه څه چې بدلیږي د عملیاتو ترتیب دی۔ پورټ 587 د سره متن SMTP ناستې په توګه پیلېږي، په EHLO ځواب کې STARTTLS اعلانوي، او یوازې هغه وخت لوړیږي چې کلینټ غوښتنه وکړي۔ پورټ 465 د هر SMTP حکم له ویلو مخکې TLS لاس ورکول تمه کوي۔

سپارل او ريله بېل کارونه دي، نو د پورټ شمېرې د بدلولو وړ عادتونه نه دي۔ RFC 6409 د پیغام سپارل خپلواک خدمت په توګه تشریح کوي، او RFC 8314 هغه پټ-TLS بڼه رانغاړي چې ډېری عصري ریلې یې پر 465 وړاندې کوي۔ که ستاسو ريله له دواړو یو مستند کړي، هغه سند له تېر کارفرما څخه ترلاسه شوې هرې غوره توب ته مخکې دی۔

پر 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 د هغه خدمت لپاره چې لومړی ځای پرځای کول یې یو کس ګوري، یوازې ځکه چې د ناکامۍ پیغامونه بېلو طبقو ته اشاره کوي۔ هغه غوره توب زما دی او دا تګلاره نه ده۔

هر څه چې غوره کړئ، پورټ، د باور مواد او د لیږونکي ډومین د ځای پرځای کولو سره ثبت کړئ۔ بیا یو اجازه لرونکی ازموینه پیغام واستوئ او تصدیق کړئ چې ریلې هغه ومنله، د سپارنې پایله او هر وروستی سپارلو راپور د جلا ثبتونو په توګه وساتئ۔ ریلې ته بریالۍ سپارنه د اپلیکیشن مسؤلیت پای دی، نه دا ثبوت چې پیغام انباکس ته رسېدلی۔

اړوندې مقالې