संपर्क, ऑडियंस और ब्रॉडकास्ट
पता पुस्तिका, ऑडियंस, ब्रॉडकास्ट और सप्रेशन सूची की हर कमांड, काम करते उदाहरणों के साथ।
ये आपस में कैसे जुड़ते हैं
जिन लोगों को आप लिखते हैं, उन्हें चार नेमस्पेस कवर करते हैं। संपर्क वर्कस्पेस की पता पुस्तिका हैं, ऑडियंस संपर्कों की नाम वाली सूचियाँ हैं, ब्रॉडकास्ट कुछ ऑडियंस में मौजूद हर व्यक्ति को एक संदेश भेजता है, और सप्रेशन सूची में वे पते होते हैं जिन पर वर्कस्पेस नहीं भेजेगा। हर कमांड एक SDK मेथड कॉल करती है, इसलिए SDK पेज उन्हीं कॉल को ज़्यादा विस्तार से बताते हैं।
- संपर्क की कोई ID नहीं होती। उसका पता ही वह कुंजी है जो हर
contactsकमांड लेती है, आगे-पीछे की ख़ाली जगह हटाकर और छोटे अक्षरों में, इसलिए[email protected]और[email protected]एक ही संपर्क हैं। ऑडियंस कीaud_ID होती है, ब्रॉडकास्ट कीbrd_ID, और सप्रेशन की वह ID जोsuppressions listप्रिंट करती है। - हर संपर्क जब तक मौजूद है, डिफ़ॉल्ट ऑडियंस में रहता है। उस ऑडियंस को न हटाया जा सकता है, न ख़ाली किया जा सकता है, न उसमें से किसी को निकाला जा सकता है, और उस पर
builtindefaultहोता है। - पता पुस्तिका वर्कस्पेस की होती है, इसलिए हर सदस्य और हर कुंजी उसी एक को पढ़ती और लिखती है।
- हर नेमस्पेस अपने एकवचन रूप से भी चलता है, जैसे
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 से अपलोड करें: 5 MB तक PNG, JPEG, WebP या GIF |
| 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> | हर संपर्क को निकाल दें और ऑडियंस को उसकी 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_ ID, इवेंट और वेबहुक के साथ।
| कमांड | यह क्या करता है |
|---|---|
| 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:write के साथ audiences import-contacts |
| 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देने से पहले ID जाँच लें।
पेजिंग
सूची देने वाली हर कमांड एक पेज पढ़ती है। जब और बाकी हों, तो प्रिंट किया गया कर्सर उन्हीं फ़िल्टर के साथ --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-at2026-10-01T09:00:00Zजैसा ISO 8601 समय, याPT2HयाP1Dजैसी ISO 8601 अवधि लेता है, 365 दिन आगे तक।send --atजो छोटी देरी लेता है, जैसे2h, वह यहाँ अस्वीकार होती है।- मर्ज फ़ील्ड
--subject,--htmlऔर--textमें काम करते हैं:{{firstName}},{{lastName}},{{name}},{{email}}और{{unsubscribeUrl}}, हर एक खड़ी लकीर के बाद एक फ़ॉलबैक मान के साथ, जैसे{{firstName|there}}। जिस बॉडी में{{unsubscribeUrl}}नहीं रखा गया, उसे एक लाइन का सदस्यता छोड़ने वाला फ़ुटर मिलता है। टेम्पलेट जैसा है वैसा भेजा जाता है, इसलिए लिंक टेम्पलेट में डालें। - कुछ भी लिखे जाने से पहले ब्रॉडकास्ट को प्लान की मासिक भेजने की सीमा से जाँचा जाता है, और हर कॉपी एक भेजना गिनी जाती है। जिसे कोटा पूरा न कर सके वह 429
send_quota_exceededके साथ अस्वीकार होता है, और पीछे कुछ नहीं छूटता। - जब कोई स्क्रिप्ट यह चरण दोबारा चला सकती हो, तो
broadcasts sendको अपनी--idempotency-keyदें। वही कुंजी नया भेजने के बजाय वह ब्रॉडकास्ट लौटाती है जो उसने बनाया था। - ब्रॉडकास्ट से सदस्यता छोड़ने वाला संपर्क
unsubscribedAtसेट होकर ऑडियंस में बना रहता है, और उस ऑडियंस को बाद के ब्रॉडकास्ट उसे छोड़ देते हैं।audiences list-contacts --statuses unsubscribedउनकी सूची देती है। - हार्ड बाउंस सप्रेशन सूची में बना रहता है।
suppressions removeउसे 409suppression_not_removableके साथ अस्वीकार करती है, और हर पंक्ति काremovableयह पहले से बता देता है।