مخاطبان، فهرستهای مخاطب و ارسالهای گروهی
همهٔ فرمانهای دفترچهٔ نشانی، فهرستهای مخاطب، ارسالهای گروهی و فهرست توقیف، با نمونههای کاربردی.
چطور کنار هم قرار میگیرند
چهار فضای نام کسانی را که برایشان مینویسید پوشش میدهند. مخاطبان دفترچهٔ نشانی فضای کاریاند، فهرستهای مخاطب فهرستهای نامداری از مخاطباناند، ارسال گروهی یک پیام را برای همهٔ اعضای چند فهرست مخاطب میفرستد، و فهرست توقیف نشانیهایی را نگه میدارد که فضای کاری به آنها نامه نمیفرستد. هر فرمان یک متد SDK را فرا میخواند، پس صفحههای SDK همان فراخوانیها را با عمق بیشتری شرح میدهند.
- مخاطب شناسه ندارد. نشانیاش کلیدی است که هر فرمان
contactsمیگیرد، با فاصلههای اضافی حذفشده و حروف کوچک، پس[email protected]و[email protected]یک مخاطباند. فهرست مخاطب شناسهٔaud_دارد، ارسال گروهی شناسهٔbrd_، و توقیف همان شناسهای کهsuppressions listچاپ میکند. - هر مخاطب تا وقتی وجود دارد در فهرست مخاطب پیشفرض است. آن فهرست را نمیتوان حذف، خالی یا کوچک کرد، و
builtinدر آن برابرdefaultاست. - دفترچهٔ نشانی از آنِ فضای کاری است، پس همهٔ اعضا و همهٔ کلیدها همان یک دفترچه را میخوانند و در آن مینویسند.
- هر فضای نام به شکل مفردش هم پاسخ میدهد، مانند
openemail contact get، و نامهای مستعار معمول کار میکنند:ls،show،new،editوrm. درsuppressionsکه فعلهایشaddوremoveاست،newبهaddوrmبهremoveمیرسد.
openemail <namespace> <verb> --help هر پرچم را با نوعش، دامنههای مجوز، نقطهٔ پایانی و آنچه فرمان برمیگرداند نشان میدهد. برای همان صفحه بهصورت داده، --json را اضافه کنید.
مخاطبان
دفترچهٔ نشانی فضای کاری: کسانی که یک عضو از نامهنگار برنامه برایشان نوشته، بهعلاوهٔ هر کسی که دستی ذخیره شده است. نامهٔ رسیده کسی را اضافه نمیکند، ارسال از طریق API یا CLI هم همینطور.
| فرمان | چه میکند |
|---|---|
| openemail contacts list | یک صفحه از مخاطبان ذخیرهشده، به ترتیب آخرین نامه. --source مخاطبان manual یا auto را نگه میدارد و --q در نامها و نشانیها جستوجو میکند |
| openemail contacts get <email> | یک مخاطب، با همهٔ فهرستهای مخاطبی که در آنهاست |
| openemail contacts create --email <value> | ذخیرهٔ یک مخاطب تازه، با --name، --notes و --audience-ids. نشانیای که از پیش در دفترچه باشد با 409 contact_exists رد میشود |
| openemail contacts update <email> | تغییر --name یا --notes، که null هر کدام را پاک میکند. خود نشانی را نمیتوان تغییر داد |
| openemail contacts delete <email> | حذف مخاطب با یادداشتها، عکس و عضویتهایش، و پنهان کردن نشانی تا نامهنگار دوباره ثبتش نکند |
| openemail contacts set-audiences <email> --audience-ids <a,b> | فهرستهای مخاطبی که مخاطب در آنهاست را دقیقاً همین فهرست کنید. فهرست مخاطب پیشفرض همیشه نگه داشته میشود |
| openemail contacts list-people | همهٔ کسانی که در صفحهٔ مخاطبان هستند: مخاطبان ذخیرهشده و، با threads:read، هر نشانیای که در نامهها دیده شده، با شمار رشتهها. --sort، --q، --email و --blocked آن را محدود میکنند |
| openemail contacts save <email> | ذخیرهٔ یک نشانی، نگه داشتن نشانیای که از یک ارسال ثبت شده، یا بازگرداندن نشانی حذفشده. هرگز خطا نمیدهد، وضعیت نشانی هر چه باشد |
| openemail contacts delete-many <emails...> | حذف و پنهان کردن 1 تا 200 نشانی در یک فراخوانی |
| openemail contacts set-photo <email> <data> | بارگذاری عکس از یک فایل، یا از stdin با -: PNG، JPEG، WebP یا GIF تا 5 MB |
| openemail contacts remove-photo <email> | برداشتن عکس و حذف تصویر ذخیرهشده |
| openemail contacts block <email> | گذاشتن نشانی در فهرست مسدودی فضای کاری، تا نامههای آن رد شوند. برچسب بعلاوه کنار گذاشته میشود |
| openemail contacts unblock <email> | برداشتن همهٔ قاعدههای فهرست مسدودی که نشانی را مسدود میکنند، از جمله قاعدهٔ کل دامنه |
| openemail contacts list-threads <email> | رشتههایی که آن نشانی نوشته یا برایش نوشته شده، در همهٔ پوشهها. --q درون آنها جستوجو میکند |
| openemail contacts activity <email> | نامههای دریافتی از آن نشانی و فرستادهشده به آن در یک بازه، 90 روز مگر اینکه --minutes چیز دیگری بگوید، با رشتههایی که منتظر پاسخاند و میانهٔ زمان پاسخ در هر دو سو |
فهرستهای مخاطب
فهرستهای نامداری از مخاطبان، تا 100 فهرست در هر فضای کاری. نشانی باید پیش از پیوستن به یکی از آنها مخاطب باشد، مگر از طریق import-contacts که نشانیهای تازه را در همان حین ذخیره میکند.
| فرمان | چه میکند |
|---|---|
| openemail audiences list | یک صفحه از فهرستهای مخاطب، اول فهرست پیشفرض و بقیه تازهترین در ابتدا، هر کدام با contactCount خودش |
| openemail audiences growth | رشد فهرستهای مخاطب در یک بازه، 30 روز مگر اینکه --days یا --minutes چیز دیگری بگوید: پیوستنها و لغو اشتراکها در هر بازه، و جمعها |
| openemail audiences get <id> | یک فهرست مخاطب، با contactCount تازه |
| openemail audiences create --name <value> | ساختن یک فهرست مخاطب خالی، با --description اختیاری. نامها یکتا نیستند |
| openemail audiences update <id> | تغییر --name یا --description. به عضویت دست زده نمیشود |
| openemail audiences delete <id> | حذف فهرست مخاطب و نگه داشتن مخاطبانش. فهرست پیشفرض را نمیتوان حذف کرد |
| openemail audiences empty <id> | بیرون بردن همهٔ مخاطبان و نگه داشتن فهرست مخاطب، با شناسه، نام و توضیحش |
| openemail audiences list-contacts <id> | یک صفحه از مخاطبان فهرست، با زمان پیوستن هر کدام و اینکه اشتراکش را لغو کرده یا نه. --sort، --q، --source و --statuses آن را محدود میکنند |
| openemail audiences add-contact <id> --email <value> | گذاشتن یک مخاطب موجود در فهرست. افزودن کسی که از پیش در آن هست چیزی را تغییر نمیدهد |
| openemail audiences remove-contact <id> <email> | بیرون بردن یک مخاطب. مخاطبی که در فهرست نیست 404 است |
| openemail audiences add-contacts <id> --emails <a,b> | گذاشتن تا 200 مخاطب موجود در آن، و گزارش نشانیهایی که مخاطب نیستند در missing |
| openemail audiences remove-contacts <id> --emails <a,b> | بیرون بردن تا 200 مخاطب، و گزارش آنهایی که در آن نبودند |
| openemail audiences import-contacts <id> --contacts <json|@file|-> | درونبری تا 500 ردیف { email, name }، با ذخیرهٔ نشانیهایی که هنوز مخاطب نیستند |
ارسالهای گروهی
یک پیام برای همهٔ اعضای حداکثر 10 فهرست مخاطب، که برای هر نفر نسخهای جداگانه فرستاده میشود، با فیلدهای ادغامِ پرشده و یک پیوند لغو اشتراک. هر نسخه یک ایمیل معمولی است با شناسهٔ msg_، رویدادها و وبهوکهای خودش.
| فرمان | چه میکند |
|---|---|
| openemail broadcasts preview --audience-ids <a,b> | شمردن کسانی که یک ارسال گروهی به این فهرستها به آنها میرسد، و کسانی که به دلیل لغو اشتراک یا توقیف کنار گذاشته میشوند. چیزی نمیفرستد |
| openemail broadcasts send --audience-ids <a,b> --from <value> | فرستادن با --subject و --html یا --text، یا یک --template ذخیرهشده، همین حالا یا در --scheduled-at |
| openemail broadcasts list | یک صفحه از ارسالهای گروهی، تازهترین در ابتدا، با شمارشهای زنده. --audience-id آنهایی را نگه میدارد که به آن فهرست فرستاده شدهاند |
| openemail broadcasts get <id> | یک ارسال گروهی، با وضعیت و شمارشهای زندهاش: فرمانی که هنگام فرستادن باید پیاپی بپرسید |
| openemail broadcasts stats <id> | جمع تحویلشده، برگشتی، بازشده، کلیکشده و لغو اشتراک، و یک سری برای هر بازهٔ --grain، یک ساعت مگر اینکه چیز دیگری بگویید |
| openemail broadcasts list-recipients <id> | هر نسخه برای چه کسی رفت و چه بر سرش آمد. --filter یک گروه را نگه میدارد، مانند bounced یا not_opened |
| openemail broadcasts get-recipient <id> <email-id> | نسخهٔ یک نفر، با موضوع، HTML و متن دقیقاً همانطور که دریافت کرده است |
| openemail broadcasts cancel <id> | متوقف کردن ارسال گروهیای که زمانبندیشده، در صف یا هنوز در حال فرستادن است. نسخههایی که رفتهاند را نمیتوان پس گرفت |
توقیفها
نشانیهایی که این فضای کاری به آنها نامه نمیفرستد: برگشتهای سخت و شکایتها، که همان لحظه ثبت میشوند، و هر نشانیای که دستی اضافه کنید. ارسال به یکی از آنها برای آن گیرنده پیش از بیرون رفتن هر چیزی رد میشود.
| فرمان | چه میکند |
|---|---|
| openemail suppressions list | یک صفحه از فهرست، تازهترین در ابتدا. --reason موارد bounce، complaint یا manual را نگه میدارد و --q جستوجو میکند |
| openemail suppressions get <id> | یک ردیف: نشانی، دلیل، جزئیاتی که برگشت یا شکایت داشت، و اینکه آیا میتوان آن را برداشت |
| openemail suppressions add --email <value> | توقف فرستادن به یک نشانی. افزودن نشانیای که از پیش هست ردیفی را که دارد برمیگرداند |
| openemail suppressions remove <id> | اجازهٔ دوباره برای نامه به آن نشانی. برگشت سخت را نمیتوان برداشت |
فهرست توقیف و فهرست مسدودی دو فهرست متفاوتاند. suppressions add نامههای رفتنی به یک نشانی را متوقف میکند و contacts block نامههای آمده از آن را رد میکند.
دامنههای مجوز
بیشتر فرمانها به دامنهٔ مجوز خواندن یا نوشتن فضای نامشان نیاز دارند. چندتایی دامنهٔ دیگری لازم دارند، چون چیز دیگری را میخوانند یا تغییر میدهند:
| دامنهٔ مجوز | فرمانها |
|---|---|
| contacts:read | contacts list، get و list-people |
| contacts:write | contacts create، update، delete، save، delete-many، set-photo و remove-photo، و audiences import-contacts در کنار audiences:write |
| audiences:read | audiences list، growth، get و list-contacts، و broadcasts preview، تا کلیدی که نمیتواند بفرستد هم بتواند شمار را نشان دهد |
| audiences:write | هر فرمان دیگر audiences، و contacts set-audiences. contacts create --audience-ids آن را در کنار contacts:write لازم دارد |
| threads:read | contacts list-threads و activity، و نشانیهایی که در list-people از نامهها دیده شدهاند |
| settings:read | suppressions list و get |
| settings:write | suppressions add و remove، و contacts block و unblock |
| emails:read | broadcasts list، get، stats، list-recipients و get-recipient |
| emails:send | broadcasts send که audiences:read را هم لازم دارد، و broadcasts cancel |
- کلیدی که به نشانیها یا دامنههای مشخصی محدود است همان دفترچهٔ نشانیای را میخواند و در آن مینویسد که هر کلید دیگری. فقط ارسالهای گروهیای را میبیند که از نشانی یا دامنهای که دارد فرستاده شدهاند، از
list-peopleفقط مخاطبان ذخیرهشده را میگیرد، وcontacts list-threads،activity،blockوunblock، و نیزsuppressions addوremoveآن را با 422capability_unsupportedرد میکنند. - ورود با مرورگرِ عضوی که فقط به برخی نشانیها دسترسی دارد در همهٔ فرمانهای
contacts،audiencesوbroadcastsبا 422capability_unsupportedرد میشود.suppressions addورود با مرورگرِ هر کسی جز مالک فضای کاری را رد میکند.
نمونههای کاربردی
یک فهرست مخاطب را از یک فایل بسازید، سپس بشمارید که یک ارسال گروهی به آن به چه کسانی میرسد. import-contacts نشانیهایی را که هنوز مخاطب نیستند ذخیره میکند، و اجرای دوبارهاش هیچ چیز را دو بار نمیسازد یا اضافه نمیکند.
[ { "email": "[email protected]", "name": "Ada Lovelace" }, { "email": "[email protected]", "name": "Grace Hopper" }, { "email": "[email protected]" }]AUDIENCE=$(openemail audiences create --name 'Product updates' --json | jq -r .id)openemail audiences import-contacts "$AUDIENCE" --contacts @contacts.jsonopenemail broadcasts preview --audience-ids "$AUDIENCE"یک ارسال گروهی را با --dry-run بررسی کنید، که درخواست را چاپ میکند و چیزی نمیفرستد، سپس آن را بفرستید. ارسال گروهی بیدرنگ ساخته و در پسزمینه فرستاده میشود، پس برای دنبال کردنش get را پیاپی بپرسید. این بدنه {{unsubscribeUrl}} را جایی نمیگذارد، پس هر نسخه یک پانویس یکخطی لغو اشتراک میگیرد.
{ "audienceIds": ["aud_4c1b8e2a7d9f05c36b4e8a71"], "from": "Acme <[email protected]>", "subject": "{{firstName|Hello}}, the September release is out", "html": "<p>Hi {{firstName|there}},</p><p>Here is what changed this month.</p>", "scheduledAt": "2026-10-01T09:00:00Z"}openemail broadcasts send --data @broadcast.json --dry-runBROADCAST=$(openemail broadcasts send --data @broadcast.json --yes --json | jq -r .id)openemail broadcasts get "$BROADCAST"openemail broadcasts stats "$BROADCAST" --grain dayببینید یک ارسال گروهی به چه کسانی نرسید. --ndjson در هر سطر یک گیرنده چاپ میکند و --all --json یک سند با همهٔ صفحهها.
openemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter bounced --ndjson | jq -r .emailopenemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter not_opened --all --json | jq ".items | length"openemail suppressions list --reason bounce --all --max 50اعضای مشترک یک فهرست مخاطب را در فهرستی دیگر کپی کنید. jq جریان را به بدنهای که add-contacts میگیرد تبدیل میکند و --data - آن را از stdin میخواند. --max 200 آن را به 200 نشانیای محدود میکند که یک فراخوانی میپذیرد.
openemail audiences list-contacts aud_9f2c4b7e1a0d63d84c5f2e7b --statuses subscribed --max 200 --ndjson \ | jq -s '{ emails: map(.email) }' \ | openemail audiences add-contacts aud_1c4e7a9b2d0f36e85a7c1b4d --data -همهٔ مخاطبانی را که نامهنگار در یک دامنه ثبت کرده حذف کنید. delete-many در هر فراخوانی تا 200 نشانی میگیرد، پس xargs -n 200 فهرست بلندتر را تقسیم میکند. دستهها را نخست با --dry-run بررسی کنید، چون بازگشتی در کار نیست.
openemail contacts list --source auto --all --ndjson \ | jq -r 'select(.email | endswith("@old-vendor.example")) | .email' > leaving.txtxargs -n 200 openemail contacts delete-many --dry-run < leaving.txtxargs -n 200 openemail contacts delete-many --yes < leaving.txtفرستادن به یک نشانی را متوقف کنید، دوباره به یکی اجازه دهید و یک فرستنده را مسدود کنید. removable میگوید suppressions remove کدام ردیفها را برمیدارد.
openemail suppressions add --email [email protected]openemail suppressions list --q [email protected] --json | jq -r '.items[] | select(.removable) | .id'openemail suppressions remove 7b1e2c3d-4f5a-4b6c-8d7e-9f0a1b2c3d4e --yesopenemail contacts block [email protected]تأییدها و کدهای تأیید هویت
این فرمانها پیش از اجرا در ترمینال از شما تأیید میخواهند:
| فضای نام | تأیید میخواهد |
|---|---|
| contacts | delete، delete-many، remove-photo و unblock |
| audiences | delete، empty، remove-contact و remove-contacts |
| broadcasts | send و cancel |
| suppressions | remove |
--yesبه جای شما تأیید میکند. بدون نظارت، با--jsonیا--no-input، در CI یا بدون ترمینال، فرمانی که میپرسید باRefusing to run unattended. Pass --yes to confirm.و کد خروج2متوقف میشود.--dry-runدرخواستی را که فرمان میفرستاد چاپ میکند و بدون پرسیدن و بدون تغییر هیچ چیز با کد0خارج میشود.- با ورود از طریق مرورگر،
audiences deleteنخست کد تأیید هویت میخواهد، همانطور که برنامهٔ وب.--yesهرگز از آن نمیگذرد و بدون نظارت فرمان با کد خروج4متوقف میشود. از پیشopenemail verifyرا اجرا کنید، یا از کلید API استفاده کنید که هرگز از آن پرسیده نمیشود. audiences emptyهرگز کد تأیید هویت نمیخواهد، پس پیش از دادن--yesشناسه را بررسی کنید.
صفحهبندی
هر فرمانی که فهرست میکند یک صفحه میخواند. وقتی موارد بیشتری مانده باشد، نشانگری را که چاپ کرده با همان فیلترها به --cursor بدهید، یا همه را بخوانید:
--allهمهٔ صفحهها را میخواند و موارد را جریانی میفرستد: در ترمینال یک جدول، و وقتی به لوله داده شود یا با--ndjsonدر هر سطر یک شیء JSON.--max <n>پس از همان تعداد مورد میایستد و--allرا هم در بر دارد.--jsonیک سند{ items, hasMore, nextCursor }چاپ میکند، با--allهم.- نشانگرِ بدشکل یا کهنه 400
invalid_cursorمیدهد. بدون آن از نو شروع کنید.
| فرمان | اندازهٔ صفحه |
|---|---|
| openemail contacts list | 1 تا 200، و 50 مگر اینکه --limit چیز دیگری بگوید |
| openemail contacts list-people | 1 تا 100، و 25 مگر اینکه --limit چیز دیگری بگوید |
| openemail contacts list-threads | 1 تا 100، و 25 مگر اینکه --limit چیز دیگری بگوید |
| openemail audiences list | 1 تا 100، و 25 مگر اینکه --limit چیز دیگری بگوید |
| openemail audiences list-contacts | 1 تا 200، و 50 مگر اینکه --limit چیز دیگری بگوید |
| openemail broadcasts list | 1 تا 100، و 25 مگر اینکه --limit چیز دیگری بگوید |
| openemail broadcasts list-recipients | 1 تا 200، و 50 مگر اینکه --limit چیز دیگری بگوید |
| openemail suppressions list | 1 تا 100، و 25 مگر اینکه --limit چیز دیگری بگوید |
خوب است بدانید
contacts createنشانیای را که از پیش در دفترچه هست با 409contact_existsرد میکند، پس تلاش دوباره هرگز نامی را که کسی ویرایش کرده بازنویسی نمیکند.contacts saveهرگز رد نمیکند: نشانی را ذخیره میکند، نگه میدارد یا برمیگرداند، وضعیتش هر چه باشد.contacts deleteنشانیای را هم که فقط در نامهها دیده شده میپذیرد، که آن شخص را ازlist-peopleبیرون میبرد. نامهها میمانند. بازگشتی در کار نیست: ذخیرهٔ دوبارهٔ نشانی مخاطبی بینام، بییادداشت و بدون هیچ فهرستی جز فهرست پیشفرض میسازد.- نشانی هویت مخاطب است، پس
contacts updateنمیتواند آن را تغییر دهد. جابهجایی مخاطب یکdeleteو یکcreateاست. contacts set-photoتصویر را از یک فایل، یا از stdin با-میخواند.--content-typeرا بدهید، مانندimage/jpeg: بدون آن تصویر ممکن است بهصورتapplication/octet-streamبرود که سرور آن را با 422invalid_imageرد میکند.broadcasts send --scheduled-atزمانی به قالب ISO 8601 مانند2026-10-01T09:00:00Z، یا مدتی به قالب ISO 8601 مانندPT2HیاP1D، تا 365 روز بعد میپذیرد. تأخیرهای کوتاهی کهsend --atمیپذیرد، مانند2h، اینجا رد میشوند.- فیلدهای ادغام در
--subject،--htmlو--textکار میکنند:{{firstName}}،{{lastName}}،{{name}}،{{email}}و{{unsubscribeUrl}}، هر کدام با مقدار جایگزینی پس از یک خط عمودی، مانند{{firstName|there}}. بدنهای که{{unsubscribeUrl}}را جایی نگذارد یک پانویس یکخطی لغو اشتراک میگیرد. قالب همانطور که هست فرستاده میشود، پس پیوند را در قالب بگذارید. - ارسال گروهی پیش از نوشتن هر چیزی با ارسالهای ماهانهٔ طرح سنجیده میشود، و هر نسخه یک ارسال شمرده میشود. ارسالی که سهمیه کفافش را ندهد با 429
send_quota_exceededرد میشود و چیزی از آن باقی نمیماند. - وقتی ممکن است اسکریپتی آن گام را دوباره اجرا کند،
--idempotency-keyخودتان را بهbroadcasts sendبدهید. همان کلید به جای فرستادن ارسال گروهی تازه، با همان ارسالی که ساخته پاسخ میدهد. - مخاطبی که اشتراکش را در یک ارسال گروهی لغو کند با
unsubscribedAtتنظیمشده در فهرست میماند، و ارسالهای گروهی بعدی به آن فهرست از او میگذرند.audiences list-contacts --statuses unsubscribedآنها را فهرست میکند. - برگشت سخت در فهرست توقیف میماند.
suppressions removeآن را با 409suppression_not_removableرد میکند وremovableدر هر ردیف این را از پیش میگوید.