دامنهها و نشانیها
دامنهها را اضافه و تأیید کنید، رکوردهای DNS مورد نیازشان را بخوانید، نشانیهای روی آنها را مدیریت کنید و ببینید با چه نشانیهایی میتوانید بفرستید.
نمای کلی
دو فضای نام دامنههای شما را پوشش میدهند. openemail domains دامنههای متصل به فضای کاری را مدیریت میکند: افزودن و برداشتنشان، رکوردهای DNS که هر کدام لازم دارد، اینکه آیا میتواند دریافت کند و بفرستد، catch-all آن، دامنههای ردیابی و فایلهایش، و نشانیهای روی آن. openemail addresses به پرسشی محدودتر پاسخ میدهد: کلید یا ورودی که به کار میبرید با کدام نشانیها مجاز به فرستادن است.
- فرمان دامنه شناسهٔ دامنه را میگیرد، یک UUID از
domains listیاdomains create. نام میزبان به جای آن پذیرفته نمیشود، پسopenemail domains get acme.comیک 404 است و با کد5خارج میشود. - فرمان نشانی شناسهٔ دامنه و سپس شناسهٔ نشانی را میگیرد، یک UUID از
domains list-addressesیاdomains create-address. domainوaddressهم بهعنوان نام فضای نام کار میکنند. فعلهای دامنه به نامهای مستعار معمول پاسخ میدهند، مانندls،show،new،editوrm، وaddresses listهم همینطور. پنج فعلِ نشانیهای روی یک دامنه، مانندcreate-address، نام مستعاری ندارند.openemail <command> --helpهر آرگومان و پرچم را با نوعش، دامنهٔ مجوزی که فراخوانی لازم دارد، متد و مسیرش و آنچه برمیگردد فهرست میکند. برای همان صفحه بهصورت داده،--jsonرا اضافه کنید.
همهٔ فرمانها
| فرمان | چه میکند |
|---|---|
| openemail domains list | فهرست دامنههای فضای کاری، به ترتیب الفبا، با وضعیت دریافت، ارسال، ردیابی و فایلها |
| openemail domains get <id> | خواندن یک دامنه با نشانیهایش، همهٔ رکوردهای DNS که به کار میبرد و اینکه هر کدام پیدا شده یا نه، و خوانش DMARC آن |
| openemail domains create --domain <value> | افزودن یک دامنه. پاسخ همهٔ رکوردهای DNS برای انتشار را دارد که یک بار هم بررسی شدهاند |
| openemail domains verify <id> | بررسی بیدرنگ DNS دامنه و بازگرداندن دامنه همانطور که بررسی آن را گذاشت |
| openemail domains update <id> | روشن یا خاموش کردن catch-all، و تنظیم یا برداشتن دامنهٔ ردیابی و دامنهٔ فایلها |
| openemail domains delete <id> | برداشتن دامنه و همهٔ نشانیهای روی آن. از شما تأیید میخواهد |
| openemail domains list-addresses <id> | فهرست نشانیهای روی یک دامنه با شناسه، برچسب، وضعیت فعال بودن و زمان آخرین نامهٔ دریافتی هر کدام |
| openemail domains create-address <id> --local-part <value> | ساختن یک نشانی روی دامنه، فعال، با --label اختیاری |
| openemail domains get-address <id> <address-id> | خواندن یک نشانی روی یک دامنه |
| openemail domains update-address <id> <address-id> | تغییر نام نشانی با --label، یا خاموش و روشن کردنش با --no-enabled و --enabled |
| openemail domains delete-address <id> <address-id> | برداشتن یک نشانی از دامنهاش. از شما تأیید میخواهد |
| openemail addresses list | فهرست نشانیهایی که با این کلید یا ورود میتوانید با آنها بفرستید، و وضعیت دریافت و ارسال هر دامنه |
همهٔ پرچمها در راهنمای فرمانشان هستند، مثلاً openemail domains update --help یا openemail domains create-address --help.
دریافت و ارسال
یک دامنه دو واقعیت مستقل را گزارش میدهد. receiving.verified وقتی true میشود که DNS عمومی با رکوردهای MX و رکورد TXT _openemail-challenge آن پاسخ دهد، و از آن پس نامه دریافت میکند. sending.status وضعیت امضا است همانطور که آخرین بررسی دید: verified، pending، failed، no_identity یا unknown. sending.canSend میگوید آیا ارسالی از آن دامنه همین حالا پذیرفته میشود، و حکم منفیِ قدیمیتر از یک روز نامعلوم شمرده میشود، پس اسکریپت باید روی canSend شاخه بزند نه روی status. تا وقتی false است، ارسال از آن دامنه با 409 domain_not_sendable رد میشود.
domains createنخستین بررسی DNS را در طول فراخوانی اجرا میکند، پس هر درایه درrecordsاز پیش یکstatusدارد:found،missing، یا null وقتی هنوز بررسی نشده است. هر رکورد را دقیقاً همانطور که داده شده منتشر کنید، چون مقدارها مختص آن دامنهاند.domains verifyبیدرنگ بررسی میکند. تا 10 ثانیه پس از آخرین بررسی چیز تازهای بررسی نمیکند و دامنه را همانطور که هست برمیگرداند. روی دامنهٔ تأییدشده رکوردهای امضا را دوباره بررسی میکند، پسsendingتازه است.domains getروی دامنهٔ تأییدنشده وقتی آخرین بررسی بیش از 20 ثانیه قدمت داشته باشد دوباره بررسی میکند، پس پرسیدن پیاپیgetهم کار میکند و فقطdomains:readلازم دارد، در حالی کهverifyبهdomains:writeنیاز دارد.- رکوردی که همین لحظه منتشر شده ممکن است چند دقیقه طول بکشد تا در DNS عمومی دیده شود.
در ترمینال، get، create و verify در هر سطر یک فیلد چاپ میکنند، و بلوکهای تودرتو مانند receiving، sending و records بهصورت JSON فشرده. --json را اضافه کنید و آنها را با ابزاری مانند jq بخوانید، همانطور که نمونههای زیر میکنند.
catch-all، دامنههای ردیابی و فایلها
domains update سه تنظیم را تغییر میدهد که به هم وابسته نیستند. پرچمی که نگذارید دستنخورده میماند، و بدون هیچ پرچمی دامنه بدون تغییر برمیگردد.
| پرچم | چه چیزی را تغییر میدهد |
|---|---|
| --catch-all, --no-catch-all | روشن، نامه به هر نشانی روی دامنه را که کسی نساخته میپذیرد، و نشانی از نخستین پیامش در list-addresses دیده میشود. خاموش، نامه به هر نشانیای را که دستی ساخته نشده رد میکند، از جمله نشانیهایی که catch-all پیشتر گرفته بود. دامنهٔ تازه با حالت روشن آغاز میشود |
| --tracking-host <value> | زیردامنهای مانند links.acme.com برای پیوندهای ردیابیشده و پیکسل باز شدن. null آن را برمیدارد |
| --storage-host <value> | زیردامنهای مانند files.acme.com برای پیوندهای دانلود فایلهایی که از دامنه فرستاده میشوند. null آن را برمیدارد |
- میزبان تازه در همان فراخوانی ذخیره و بررسی میشود. یک رکورد CNAME با نام
record.nameو مقدارrecord.valueاز بلوکtrackingیاstorageپاسخ منتشر کنید، با هر پروکسیای خاموش. راهاندازی دوبارهٔ یک میزبان ممکن است مقدار دیگری به آن بدهد، پس همان مقداری را منتشر کنید که آخرین پاسخ گزارش میدهد. - تا وقتی بررسیای موفق نشود، میزبان
pendingاست و نامههای تازه با میزبان پیشفرض OpenEmail میروند. بهمحض موفقیت یک بررسی،activeمیشود. OpenEmail خودش به بررسی ادامه میدهد، و میزبان فعالی که سه بررسی پیاپی را رد کند، یا از آخرین بررسی موفقش 2 ساعت گذشته باشد،failedمیشود و نامههای تازه به میزبان پیشفرض برمیگردند. - میزبان را با
nullبردارید، مانند--tracking-host null. مقدار خالی مانند--tracking-host=در CLI خطای کاربرد است و با کد2خارج میشود. - میزبان تازه به دامنهٔ تأییدشده نیاز دارد، یا دستکم به انتشار رکورد TXT
_openemail-challengeآن. در غیر این صورت فراخوانی با 409domain_not_verifiedرد میشود. - پرچمها به ترتیب اعمال میشوند: catch-all، سپس دامنهٔ ردیابی، سپس دامنهٔ فایلها. پرچمِ بعدیای که رد شود ممکن است تغییرِ پیشین را ذخیرهشده باقی بگذارد، پس وقتی هر کدام باید مستقل باشد آنها را در فراخوانیهای جداگانه بفرستید.
نشانیهای روی یک دامنه
یک دامنه نشانیهایی را دارد که دستی یا از طریق API ساخته شدهاند، و آنهایی را که catch-all هنگام رسیدن نخستین نامهشان گرفته است. list-addresses هر دو نوع را نشان میدهد، از جمله غیرفعالها. خود catch-all یک ردیف نیست: receiving.catchAll روی دامنه است.
create-addressپرچم--local-partرا میگیرد، یعنی بخش پیش از @، و یک--labelاختیاری. لازم نیست دامنه هنوز تأیید شده باشد، اما نشانی تا آن زمان چیزی دریافت نمیکند.*بهتنهایی رد میشود، چون catch-all اینطور نوشته میشود.- ساختن نشانیای که از پیش وجود دارد، یا نشانیای که برداشته شده، خطا نیست. فعال برمیگردد، با برچسبی که فرستادید یا بیبرچسب، و شناسهاش را نگه میدارد. نشانیای که catch-all گرفته بود به نشانی دستی تبدیل میشود، پس پس از خاموش شدن catch-all هم دریافت میکند.
- با روشن بودن catch-all، نشانی تازه با تنظیمات مخصوص نشانیِ catch-all آغاز میشود، مانند امضا و ردیابی آن، به جز تنظیمات حریم خصوصی. اینها یک بار کپی میشوند و هماهنگ نگه داشته نمیشوند.
update-address --no-enabledدریافت نامه در آن نشانی را متوقف میکند، پس فرستندگان برگشت میگیرند، و از آن هم نمیتوان فرستاد. نامهها، تنظیمات و کسانی که به آن دسترسی دارند را نگه میدارد، و--enabledاز همان جایی که مانده بود ادامه میدهد.--labelنامش را تغییر میدهد و--label nullنام را برمیدارد.delete-addressفراتر میرود. نامه به آن نشانی حتی با catch-all روشن رد میشود، بازارسالش متوقف میشود، تنظیماتش حذف میشوند، کسانی که به آن دسترسی داشتند آن دسترسی را از دست میدهند، و ورود با گذرواژهاش ابطال میشود. نامههایی که پیشتر دریافت کرده در صندوق پستی میمانند. ساختن دوبارهاش همان شناسه را برمیگرداند، بدون تنظیمات یا دسترسیهای قدیمی.
با چه نشانیهایی میتوانید بفرستید
openemail addresses list به پرسشِ پشت یک 403 from_address_forbidden پاسخ میدهد: کلید یا ورودی که با آن فراخوانی میکنید مجاز است کدام نشانیها را در From بگذارد. به جای یک دامنهٔ مجوز خواندن به emails:send نیاز دارد، چون آنچه را یک ارسال میپذیرد شرح میدهد.
- در ترمینال دو جدول چاپ میکند: نشانیها، هر کدام با اینکه فعال است یا نه و اینکه میتوانید از آن بفرستید یا نه، سپس دامنهها، هر کدام با اینکه برای دریافت و ارسال تأیید شده یا نه، و catch-all آن.
unrestrictedوقتی true است که هیچ چیز اعتبارنامه را محدود نکند. آنگاه از هر local-part روی دامنههای فضای کاری میتوان فرستاد، حتی آنهایی که کسی نساخته است. در غیر این صورتcanSendفقط برای نشانی فعالی true است که اعتبارنامه آن را پوشش دهد، از طریق دامنهٔ کاملی که دارد یا فهرست نشانیهای خودش.canSendبرای نشانی غیرفعال، برای نشانیای که اعتبارنامه پوششش نمیدهد، و برای نشانیای که دامنهاش هنوز نمیتواند امضا کند false است.- فقط نشانیهای ساختهشده فهرست میشوند. اعتبارنامهای که یک دامنهٔ کامل دارد همچنان میتواند با هر local-part روی آن بفرستد، و از نشانیای در فهرستش که صندوق پستی پشتش نیست میتوان فرستاد بیآنکه اینجا دیده شود.
- با
--jsonبرای یک صفحه{ unrestricted, addresses, domains, hasMore, nextCursor }و با--allمقدار{ unrestricted, addresses, domains }را چاپ میکند، به جای سند{ items, hasMore, nextCursor }که فهرستهای دیگر چاپ میکنند. با--allدر یک لوله، یا با--ndjson، در هر سطر یک نشانی چاپ میکند.
status، open و ارائهدهندگان DNS
openemail status ورود شما، addresses list و domains list را همزمان میخواند و با هم چاپ میکند. جدول نشانیهای فرستندهاش هر نشانی را با اینکه میتواند بفرستد یا نه و فعال است یا نه نشان میدهد. جدول دامنههایش هر دامنه را با verified یا not verified برای دریافت، وضعیت ارسالش و catch-all آن نشان میدهد. 100 مورد نخست هر کدام را نشان میدهد و فرمان --all را برای بقیه نام میبرد.
- بخشی که اعتبارنامهٔ شما اجازهٔ خواندنش را ندارد، مانند دامنهها بدون
domains:readیا نشانیها بدونemails:send، «در دسترس نیست» را با دلیلش میگوید و بقیه همچنان چاپ میشود. - وقتی هنوز نشانیای نباشد،
openemail domains create --domain example.comرا پیشنهاد میکند. openemail status --jsonیک شیء باaccount،addresses،domainsوunavailableچاپ میکند، که در آنunavailableدلیل هر بخشی را که خوانده نشد میدهد.
اتصال یک ارائهدهندهٔ DNS، تا رکوردهای دامنهٔ تازه برایتان نوشته شوند، در 0.0.2 فقط در برنامهٔ وب انجام میشود. openemail open providers، یا open dns، آن صفحه را باز میکند. open domains دامنهها و رکوردهای DNS آنها را باز میکند و open addresses نشانیها را. بازارسال هم در برنامهٔ وب است و open forwarding <address> آن را برای یک نشانی باز میکند. --print به جای باز کردن مرورگر پیوند را چاپ میکند.
جایی که OpenEmail خودش DNS یک دامنه را نوشته است، domains delete آن رکوردها را پس میگیرد و هر کدام را که نتوانست در leftBehind فهرست میکند تا خودتان نزد ارائهدهندهٔ DNS بردارید. رکوردهایی که خودتان منتشر کردهاید هرگز دست نمیخورند، پس پس از رفتن دامنه آنها را هم بردارید.
نمونهها
openemail domains create --domain acme.com --json > acme.jsonjq -r '.records[] | [.type, .name, .value, (.priority // "")] | @tsv' acme.jsonopenemail domains verify "$(jq -r .id acme.json)"id=b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6funtil openemail domains get "$id" --json | jq -e .receiving.verified > /dev/null; do sleep 30doneopenemail domains get "$id" --json | jq '.sending | {status, canSend, error}'openemail domains list-addresses "$id" --allopenemail domains create-address "$id" --local-part invoices --label Invoicesopenemail domains update "$id" --no-catch-all --dry-runopenemail domains update "$id" --no-catch-allساختن دستی invoices آن را پس از خاموش شدن catch-all در حال دریافت نگه میدارد، در حالی که نامه به هر نشانی دیگری که catch-all گرفته بود رد میشود. اجرای آزمایشی PATCH و بدنهاش را بدون فرستادن چاپ میکند.
openemail domains update "$id" --tracking-host links.acme.com --json | jq '.tracking | {status, record, error}'openemail domains update "$id" --tracking-host nulladdress_id=$(openemail domains list-addresses "$id" --all | jq -r 'select(.address == "[email protected]") | .id')openemail domains update-address "$id" "$address_id" --no-enabledopenemail domains delete-address "$id" "$address_id" --yesخاموش کردن نشانی در گام نخست با --enabled برگشتپذیر است. حذف برگشتپذیر نیست و در اسکریپت به --yes نیاز دارد. با ورود از طریق مرورگر کد تأیید هویت هم میخواهد که --yes هرگز از آن نمیگذرد.
openemail domains list --all | jq -r 'select(.sending.canSend | not) | [.domain, .sending.status] | @tsv'openemail addresses list --all --json | jq -r '.addresses[] | select(.canSend) | .address'دامنههای مجوز، تأییدها و خطاها
| دامنهٔ مجوز | فرمانها |
|---|---|
| domains:read | domains list, get, list-addresses, get-address |
| domains:write | domains create, verify, update, delete, create-address, update-address, delete-address |
| emails:send | addresses list |
- ورود یا کلیدی که آن دامنهٔ مجوز را ندارد با کد خروج
4متوقف میشود، دامنهٔ مجوزِ ناموجود را نام میبرد و میگوید چطور آن را به دست آورید. domains deleteوdomains delete-addressاز شما تأیید میخواهند. پاسخ منفی با کد10خارج میشود و چیزی را تغییر نمیدهد. بدون نظارت و بدون--yes، پیش از فرستادن هر چیزی با کد خروج2متوقف میشوند.- با ورود از طریق مرورگر، این دو حذف کد تأیید هویت هم میخواهند، همانطور که برنامهٔ وب. بدون نظارت کسی نمیتواند آن را تایپ کند، پس فرمان با کد خروج
4متوقف میشود. نخستopenemail verifyرا اجرا کنید تا 60 دقیقهٔ بعد کدی لازم نباشد. از کلید API هرگز پرسیده نمیشود. --dry-runدرخواستی را که یک تغییر میفرستاد، با بدنهاش، چاپ میکند و بدون فرستادن یا خواستن تأیید با کد0خارج میشود.- یک فهرست یک صفحه میخواند:
--limitاز 1 تا 100 میگیرد و وقتی نباشد سرور 25 میفرستد، و--cursorمقدارnextCursorصفحهٔ پیشین را میگیرد.--allهمهٔ صفحهها را میخواند،--max <n>پس از همان تعداد مورد میایستد، و--ndjson، یا--allدر یک لوله، در هر سطر یک شیء JSON چاپ میکند. با--json،domains listوlist-addressesیک سند{ items, hasMore, nextCursor }چاپ میکنند. - کلید یا ورودی که به دامنهها یا نشانیهای مشخصی محدود است همچنان همهٔ دامنهها و نشانیها را میبیند. نمیتواند دامنهای اضافه کند، و هر تغییر دیگری نیاز دارد که کل آن دامنه میان دامنههایی باشد که دارد، وگرنه فراخوانی با 422
capability_unsupportedرد میشود. - هر رد با کدِ وضعیتش خارج میشود:
4برای 403، مانندdomain_allowance_reachedوقتی طرح اجازهٔ دامنهٔ بیشتری نمیدهد،5برای 404،6برای 409، مانندdomain_already_addedیاdomain_claimed، و7برای 422، مانندinvalid_tracking_hostیاworkspace_limit_reached. - آخرین دامنهٔ یک فضای کاری را نمیتوان از CLI برداشت. این یک 409
last_domainاست، چون برداشتنش کل صندوق پستی را حذف میکند و برنامهٔ وب نخست برای آن تأیید میگیرد. دامنهای که نشانیهای رزروشدهٔ حساب را دارد یک 409domain_holds_reserved_addressesاست. domains createو دو حذف پس از خرابی شبکه هرگز دوباره تلاش نمیشوند. یک 409domain_already_added، یا یک 404 در تلاش دوم خودتان پس از گم شدن پاسخ، یعنی اولی کار کرده است.verify،update،create-addressوupdate-addressخودکار دوباره تلاش میشوند، چون دو بار فرستادنشان همان نتیجه را میگذارد.