ईमेल भेजना और ट्रैक करना
`emails` कमांड से मेल भेजें, बैच में भेजें, अनुवाद करें, शेड्यूल करें और रद्द करें, फिर `tracking` से उसकी डिलीवरी, ओपन और क्लिक पर नज़र रखें।
अवलोकन
emails नेमस्पेस कमांड के रूप में भेजने वाला API है, SDK में openemail.emails के हर मेथड के लिए एक कमांड। हर कमांड एक एंडपॉइंट को कॉल करती है और जो वह लौटाता है उसे प्रिंट करती है। tracking नेमस्पेस आपकी भेजी मेल पर हुए ओपन और क्लिक पढ़ता है। openemail emails की जगह openemail email भी काम करता है।
यहाँ की हर कमांड को साइन-इन चाहिए, ब्राउज़र से या API कुंजी से, और दो में से एक स्कोप: भेजने, अनुवाद करने, रद्द करने और दोबारा शेड्यूल करने के लिए emails:send, और सिर्फ़ पढ़ने वाली हर चीज़ के लिए emails:read।
कौन-सी भेजने वाली कमांड इस्तेमाल करें
openemail send मेल पेज पर बताई गई हाथ से लिखी कमांड है, और यह emails send के ज़रिए भेजती है। यह टर्मिनल पर बैठे व्यक्ति के लिए बनी है: जब आप --from छोड़ देते हैं तो यह भेजने वाला पता चुनती है, बॉडी को फ़ाइल, stdin या आपके एडिटर से पढ़ती है, फ़ाइलों को पाथ से अटैच करती है, और कुछ भी जाने से पहले पुष्टि के लिए सारांश दिखाती है। openemail emails send अनुरोध की बॉडी को फ़्लैग के रूप में लेती है, हर फ़ील्ड के लिए एक, और कुछ नहीं पूछती, जो उस स्क्रिप्ट के लिए ठीक है जिसे ठीक-ठीक पता है कि वह क्या भेज रही है।
| send | emails send |
|---|---|
| --from <address> | --to की तरह ज़रूरी, जब तक --data में न हो। send इसे छोड़ सकती है और आपके लिए पता चुन लेती है |
| -f, --body-file <path> | बॉडी के लिए कोई फ़ाइल फ़्लैग नहीं है। --html "$(cat body.html)" दें, या पूरा अनुरोध --data @email.json में |
| -a, --attach <path> | --attachments, फ़ाइलों का JSON ऐरे, हर एक filename और base64 content के साथ, या फ़ाइलें सेक्शन में पहले से मौजूद फ़ाइल के fileId के साथ |
| --at <when> | --scheduled-at <when>, कोई ISO 8601 समय या PT1H या P2D जैसी अवधि। send 10m, 2h और 1d जैसी छोटी देरी भी लेती है |
| --undo <seconds> | --cancellable-for-seconds <n>, 0 से 900 तक |
| --translate <language> | --translate '{"to":"de"}', जो from, includeOriginal और subject भी लेता है |
| --template <id> --props <json> | --template '{"id":"welcome","props":{"name":"Ada"}}', जो एक version भी तय कर सकता है |
| --draft <id> | --draft-id <id> |
| --thread <id> | --thread-id <id> |
| --tag <key=value> | --tags <key=value>, कई बार, या एक JSON ऑब्जेक्ट |
सिर्फ़ emails send में ये हैं: एक भेजने के लिए ओपन या क्लिक ट्रैकिंग बंद करने वाला --tracking, --signature, कस्टम हेडर के लिए --headers, फ़ाइलें अटैच करने और उनका लिंक देने में से चुनने के लिए --attachment-delivery, और पूरी बॉडी JSON के रूप में देने के लिए --data, इनलाइन, @path से फ़ाइल से या - से stdin से।
दोनों अलग तरह से ख़त्म होती हैं। जब ईमेल failed लौटता है तो send कोड 1 के साथ बाहर निकलती है। emails send जब भी API जवाब दे, कोड 0 के साथ बाहर निकलती है, इसलिए उसके प्रिंट किए आउटपुट में status जाँचें।
emails की हर कमांड
send, send-batch, translate, cancel और reschedule को emails:send चाहिए। list, get, list-events और get-tracking को emails:read चाहिए। ईमेल ID msg_ के बाद 24 hex अक्षर होती है, जैसी भेजने पर लौटती है।
| कमांड | यह क्या करता है |
|---|---|
| openemail emails send --from <value> --to <a,b> | एक ईमेल अभी भेजें, --cancellable-for-seconds से उसे पूर्ववत करने की अवधि तक रोकें, या --scheduled-at से शेड्यूल करें। बॉडी --html, --text या दोनों, एक सहेजा --template, या एक सहेजा --draft-id होती है |
| openemail emails send-batch <emails> | एक अनुरोध में 100 तक स्वतंत्र ईमेल भेजें, फ़ाइल में, इनलाइन, या - से stdin पर दिए JSON ऐरे से। हर आइटम emails send की बॉडी जैसा होता है और अपने आप में सफल या विफल होता है |
| openemail emails translate --to <value> | देखें कि अनुवाद के साथ भेजने पर --subject, --html या --text के लिए क्या पहुँचेगा। कुछ भी सहेजा या भेजा नहीं जाता, और यह एक AI कार्रवाई ख़र्च करता है |
| openemail emails list | भेजे गए ईमेल का एक पेज, नए पहले, --status, --from या --broadcast-id से छाँटा हुआ |
| openemail emails get <id> | एक भेजा गया ईमेल, हर प्राप्तकर्ता की अपनी स्थिति, एरर और डिलीवरी समय के साथ, और ट्रैक हुआ हो तो पूरी ट्रैकिंग रिपोर्ट |
| openemail emails list-events <id> | एक भेजने का इवेंट क्रम, पुराने पहले: स्वीकार, शेड्यूल, भेजा गया, डिलीवर, बाउंस, शिकायत, ओपन, क्लिक और बाकी |
| openemail emails get-tracking <id> | एक भेजने की एंगेजमेंट रिपोर्ट: उसके कुल आँकड़े, हर ट्रैक की गई कॉपी की एक एंट्री, और हर बदला गया लिंक उसके क्लिक के साथ |
| openemail emails cancel <id> | कतार में लगे या शेड्यूल किए ईमेल को जाने से पहले रोकें। यह पुष्टि माँगती है |
| openemail emails reschedule <id> <scheduled-at> | कतार में लगे या शेड्यूल किए ईमेल को किसी ISO 8601 समय पर, या PT30M जैसी अवधि पर ले जाएँ, एक सेकंड से 365 दिन आगे तक |
tracking की हर कमांड
पाँचों को emails:read चाहिए। tracking get, list-opens और list-clicks संदेश की दोनों में से कोई भी ID लेती हैं: भेजने पर लौटी msg_ ID, या tracking list और वेबहुक पेलोड में आने वाली tmsg_ ट्रैकिंग ID।
| कमांड | यह क्या करता है |
|---|---|
| openemail tracking list | किसी अवधि में भेजे गए ट्रैक किए संदेशों का एक पेज, नए पहले, हर एक अपनी पूरी रिपोर्ट के साथ। --opened और --clicked इसे छाँटते हैं, और --no-opened सिर्फ़ वे रखता है जिन्हें किसी ने नहीं खोला। अवधि 30 दिन होती है, जब तक --days या --minutes कुछ और न कहें |
| openemail tracking get-stats | एंगेजमेंट पैनल के पीछे के आँकड़े: ट्रैक, ओपन और क्लिक हुए संदेश, ओपन और क्लिक दरें, --grain बकेट में एक टाइम सीरीज़, और शीर्ष लिंक, मेल क्लाइंट और देश |
| openemail tracking get <id> | एक संदेश की एंगेजमेंट रिपोर्ट, वही दस्तावेज़ जो emails get-tracking लौटाती है |
| openemail tracking list-opens <id> | किसी संदेश की ओपन गिनती के पीछे के अलग-अलग ओपन, नए पहले, हर एक पर human, proxy या machine का निशान। --include-machine वे हिट भी जोड़ता है जो गिने नहीं गए |
| openemail tracking list-clicks <id> | किसी संदेश के लिंक पर हुए अलग-अलग क्लिक, नए पहले, हर एक के मूल url के साथ। --include-machine लिंक स्कैनर और समेटे गए दोहराव भी जोड़ता है |
tracking list और get-stats मेलबॉक्स के भेजे हर ट्रैक किए संदेश को कवर करती हैं, जिसमें वेब ऐप में लिखी मेल और MCP टूल या असिस्टेंट की भेजी मेल भी शामिल है, जबकि emails list में API के बनाए भेजने के रिकॉर्ड होते हैं। जिस रिपोर्ट का कोई भेजने का रिकॉर्ड नहीं, उसमें sendId null होता है।
उदाहरण
अपनी ख़ुद की idempotency कुंजी के साथ स्क्रिप्ट से भेजें। उसी --idempotency-key के साथ फिर चलाने पर दूसरा ईमेल भेजने के बजाय पहला ईमेल replayed: true के साथ प्रिंट होता है।
openemail emails send \ --from 'Acme Billing <[email protected]>' \ --to [email protected] \ --subject 'Your September invoice' \ --html '<p>The invoice is attached. Tell me if anything on it looks wrong.</p>' \ --attachments '[{"fileId":"file_6bb640f5b99e47deb758f1f5"}]' \ --tracking '{"opens":false}' \ --idempotency-key invoice:inv_2026_09_4192 \ --json | jq -r '.id + " " + .status'भेजने से पहले किसी व्यक्ति से अनुवाद पढ़वाएँ। मंज़ूर हुए शब्दों को --translate के बिना, सादे --subject और --html के रूप में भेजें, वरना उसका दूसरी बार अनुवाद होगा। अनुवादित html में आपका मूल पाठ पहले से उसके नीचे होता है, जब तक आप --no-include-original न दें।
openemail emails translate --to de \ --subject 'Your September invoice' \ --html "$(cat invoice.html)" \ --json > preview.jsonjq -r .html preview.jsonopenemail emails send --from [email protected] --to [email protected] \ --subject "$(jq -r .subject preview.json)" \ --html "$(jq -r .html preview.json)"फ़ाइल से बैच भेजें। जब भी बैच प्रोसेस हो जाए, कुछ आइटम विफल होने पर भी, कमांड कोड 0 के साथ बाहर निकलती है, इसलिए failed और हर आइटम का status पढ़ें। उसी कुंजी के साथ फिर चलाने पर जो आइटम जा चुके हैं वे दोहराए जाते हैं और सिर्फ़ बाकी भेजे जाते हैं, बशर्ते ऐरे का क्रम वही रहे।
[ { "from": "[email protected]", "to": "[email protected]", "subject": "Receipt 4192", "text": "Thanks for your order." }, { "from": "[email protected]", "to": "[email protected]", "subject": "Receipt 4193", "text": "Thanks for your order." }]openemail emails send-batch receipts.json --idempotency-key receipts:2026-09-27 --json > result.jsonjq '{ sent, failed }' result.jsonjq -r '.items[] | select(.status == "error") | "\(.index) \(.error.code)"' result.jsonएक ईमेल शेड्यूल करें, उसका समय बदलें, और उसे रद्द करें। --yes उस पुष्टि का जवाब देता है जो cancel माँगती है, जो स्क्रिप्ट नहीं दे सकती।
ID=$(openemail send --from [email protected] --to [email protected] --subject "Standup notes" \ --body-file notes.md --at 2026-10-01T09:00:00Z --json | jq -r .id)openemail emails reschedule "$ID" 2026-10-01T13:00:00Zopenemail emails get "$ID" --json | jq -r '.status + " " + .scheduledAt'openemail emails cancel "$ID" --yesविफल भेजे गए ईमेल ढूँढें और उनमें से एक के साथ क्या हुआ, पढ़ें। --json के बिना पाइप करने पर --all हर लाइन में एक JSON ऑब्जेक्ट प्रिंट करता है।
openemail emails list --status failed,partial --from [email protected] --all | jq -r .idopenemail emails get msg_3f9a1c07d2b84e6a9c5b1f20openemail emails list-events msg_3f9a1c07d2b84e6a9c5b1f20 --all --json | jq -r '.items[] | .createdAt + " " + .type'UTC+2 की आधी रात पर बँटने वाले दिनों में एक हफ़्ते का एंगेजमेंट पढ़ें, जिसे किसी ने नहीं खोला उसकी सूची बनाएँ, और एक संदेश के हर लिंक पर क्लिक गिनें।
openemail tracking get-stats --days 7 --offset-minutes 120 --json | jq '{ tracked, openRate, clickRate }'openemail tracking list --no-opened --days 7 --all | jq -r .subjectopenemail tracking list-clicks msg_3f9a1c07d2b84e6a9c5b1f20 --all | jq -r .url | sort | uniq -cस्कोप, कोड और पुष्टि
- ब्राउज़र साइन-इन मंज़ूरी पेज पर स्कोप माँगता है, और
openemail login --scopes emails:send,emails:readदोनों को पहले से चुन देता है। जिस कमांड का स्कोप नहीं है, वह एग्ज़िट कोड4औरinsufficient_scopeके साथ रुकती है, और स्कोप का नाम बताती है। - 5 MB से ज़्यादा फ़ाइलों वाला
send --attachपहले उन्हें फ़ाइलें सेक्शन में अपलोड करता है, जिसके लिएfiles:writeभी चाहिए। - इनमें से कोई भी कमांड सत्यापन कोड नहीं माँगती, इसलिए ब्राउज़र साइन-इन इन्हें वैसे ही चलाता है जैसे API कुंजी।
emails cancelरद्द करने से पहले पूछती है, और--yesआपकी ओर से जवाब देता है। बिना निगरानी के और--yesके बिना यहRefusing to run unattended. Pass --yes to confirm.और एग्ज़िट कोड2के साथ रुकती है।emails send,send-batchऔरrescheduleकभी नहीं पूछतीं।sendसारांश दिखाती है और सिर्फ़ टर्मिनल में पूछती है, और--yesइसे भी छोड़ देता है।--dry-runवह अनुरोध प्रिंट करता है जो कमांड भेजती, कुछ नहीं भेजता और कोड0के साथ बाहर निकलता है।emails translateपर यह कोई AI कार्रवाई ख़र्च नहीं करता, औरemails cancelपर कुछ नहीं पूछता।
नतीजों के पेज
emails list, emails list-events, tracking list, list-opens और list-clicks एक पेज पढ़ती हैं। --limit उसका आकार तय करता है, दोनों emails सूचियों के लिए 1 से 100, डिफ़ॉल्ट 25, और तीनों tracking सूचियों के लिए 1 से 200, डिफ़ॉल्ट 50। --cursor किसी पेज के प्रिंट किए कर्सर से आगे बढ़ता है।
--allहर पेज पढ़ता है और आइटम स्ट्रीम करता है: टर्मिनल पर एक टेबल, और पाइप करने पर या--ndjsonके साथ हर लाइन में एक JSON ऑब्जेक्ट।--max <n>उतने आइटम के बाद रुकता है, और इसमें--allअपने आप शामिल है।--jsonएक ही{ items, hasMore, nextCursor }दस्तावेज़ प्रिंट करता है,--allके साथ भी।- पेजिंग ऑफ़सेट से नहीं, कर्सर से होती है, इसलिए पेज करते समय भेजी गई मेल से कोई पंक्ति कभी खिसकती या दोहराती नहीं।
जानने लायक बातें
- हर रन अपनी idempotency कुंजी बनाता है, जो उस रन के भीतर की दोबारा कोशिशों को कवर करती है। भेजने को दो बार चलाने से दो बार भेजा जाता है, जब तक दोनों रन एक ही
--idempotency-keyन दें। एक ही कुंजी अलग बॉडी के साथidempotency_key_reuseऔर एग्ज़िट कोड7के साथ अस्वीकार होती है। - सिर्फ़
queuedऔरscheduledमेल रद्द की या आगे-पीछे की जा सकती है। बिना पूर्ववत अवधि वाला तुरंत भेजना अनुरोध के भीतर ही चला जाता है, इसलिए जब तक आपके पास उसकी ID आती है, आम तौर पर बहुत देर हो चुकी होती है, और कॉलemail_not_cancellableऔर एग्ज़िट कोड6के साथ ख़त्म होती है। - रद्द हुआ ईमेल रद्द ही रहता है। दोबारा शेड्यूल करने से सिर्फ़ समय बदलता है, और अवधि देने पर उसे सर्वर को अनुरोध मिलने के समय से गिना जाता है, इसलिए पाठ बदलने के लिए रद्द करें और फिर से भेजें।
- जो अनुवाद बन न सके वह पूरे भेजने को अस्वीकार कर देता है, और बिना अनुवाद के कुछ नहीं जाता। अनुवाद वाले बैच में
translateवाले ज़्यादा से ज़्यादा 10 संदेश होते हैं। - भेजने का कोटा ख़त्म होने पर महीने की पहली तारीख़ तक भेजना
send_quota_exceededके साथ रुकता है, और AI कोटा ख़त्म होने पर UTC की आधी रात तक अनुवादai_quota_exceededके साथ रुकता है, दोनों एग्ज़िट कोड8के साथ। oe_test_कुंजी से भेजी गई मेल कभी डिलीवर नहीं होती। वहsentदिखाती है,transporttestपर सेट होता है, और वह कभी ट्रैक नहीं होती।- जिस संदेश में न कोई पिक्सेल था न कोई बदला गया लिंक, उसके लिए
emails get-trackingऔरtracking get404 लौटाती हैं, एग्ज़िट कोड5, क्योंकि ट्रैक न होना और न खोला जाना एक बात नहीं है। ट्रैकिंग उस सेटिंग का पालन करती है जिसके साथ संदेश भेजा गया था, इसलिए बाद में इसे चालू करने से पहले की मेल पर असर नहीं होता। - हर गिनती न्यूनतम है। जिस पाठक का मेल क्लाइंट इमेज ब्लॉक करता है, वह कभी ओपन के रूप में नहीं गिना जाता, और क्लिक ओपन से ज़्यादा पक्का सबूत है कि मेल पढ़ी गई।
list-opensऔरlist-clicksबिना किसी ट्रैकिंग वालीmsg_ID के लिए 404 लौटाती हैं, परtmsg_ID को जैसी दी गई वैसी ही लेती हैं, इसलिए अनजानी ID पर ख़ाली सूची लौटती है।- कुछ पतों तक सीमित कुंजी सिर्फ़ उन्हीं पतों से भेजी गई मेल देखती है, और पूरे डोमेन वाली कुंजी उसके हर पते को कवर करती है।
हर फ़्लैग
यह पेज सबसे अहम फ़्लैग बताता है। openemail <command> --help किसी कमांड के हर आर्ग्युमेंट और फ़्लैग की सूची देता है, उसके टाइप, ज़रूरी स्कोप, मेथड और पाथ, लौटाए जाने वाले नतीजे और API रेफ़रेंस के नोट्स के साथ। वही मदद एक JSON दस्तावेज़ के रूप में पाने के लिए --json जोड़ें।
openemail emails --helpopenemail emails send --helpopenemail tracking list-opens --help --json