सूची और get
`emails.list`, `emails.list_all`, `emails.iterate`, `emails.get` और `emails.list_events`।
emails.list
filters = {status: ["queued", "scheduled"], from: "[email protected]"} first = client.emails.list(**filters, limit: 50)second = client.emails.list(**filters, limit: 50, cursor: first.next_cursor) if first.next_cursor p first.items.size, second&.items&.sizeएक पेज items, has_more? और next_cursor वाला OpenEmail::Page होता है। उसके बाद वाले पेज के लिए next_cursor को उन्हीं फ़िल्टरों के साथ cursor: के रूप में वापस भेजें।
emails.iterate और emails.list_all
client.emails.iterate(status: "failed") do |email| warn "#{email[:id]} #{email[:lastError]}"end failures = client.emails.list_all(status: "failed", from: "[email protected]")puts failures.sizeदोनों आपके लिए next_cursor का पीछा करते हैं। iterate कोई पेज तभी लाता है जब चलना उस तक पहुँचे, इसलिए block में break, या block के बिना लौटे Enumerator पर first या find, रिक्वेस्ट रोक देता है, जबकि list_all एक Array लौटाने से पहले हर पेज पर चलता है, इसलिए उसे ऐसा फ़िल्टर दें जो ख़त्म हो। दोनों ही तरह keyset पेजिंग है, इसलिए बीच में आया संदेश इससे कोई पंक्ति नहीं छुड़वा सकता, जैसा offset के साथ होता।
emails.get और emails.list_events
email = client.emails.get("msg_3f9a1c07d2b84e6a9c5b1f20")puts email[:status]p email[:recipients] events = client.emails.list_all_events("msg_3f9a1c07d2b84e6a9c5b1f20")events.each { |event| puts "#{event[:type]} #{event[:createdAt]}" }get अकेली कॉल है जो recipients लौटाती है, हर पते के लिए एक Hash, अपने status, error और deliveredAt के साथ। पचास संदेशों की सूची जिसमें हर एक अपने प्राप्तकर्ता लिए हो, ऐसी रिपोर्ट का पेज है जो किसी ने माँगी ही नहीं।
list_events एक send के इवेंट का सिलसिला पढ़ता है, सबसे पुराना पहले: email.accepted, email.queued, email.sent, email.delivered, email.bounced, email.opened और बाक़ी, हर एक एक data Hash के साथ जिसका आकार उसके type पर निर्भर करता है। list_all_events और iterate_events आपके लिए पूरे सिलसिले पर चलते हैं। वेबहुक इन्हीं इवेंट का एक हिस्सा घटते समय पहुँचाते हैं, इसलिए जब कोई वेबहुक छूट जाए तो यहीं देखें।
पैरामीटर
statusString or Array<String>- एक status या कई (`queued`, `scheduled`, `sending`, `sent`, `partial`, `bounced`, `cancelled`, `failed`), जो दिए गए किसी भी एक से मेल खाता है। `bounced` का मतलब है कि संदेश जिन प्राप्तकर्ताओं को गया उन सभी के लिए bounce हुआ, जबकि जो संदेश कुछ के लिए bounce हुआ और बाक़ी तक पहुँचा वह `partial` पढ़ता है। gem Array को कॉमा से अलग एक मान के रूप में भेजता है क्योंकि सर्वर कॉमा पर बाँटता है, और सेट से बाहर का मान अज्ञात वाले का नाम लेता 422 है।
broadcast_idString- सिर्फ़ एक ब्रॉडकास्ट की कॉपियाँ, `broadcasts.send` से मिली `brd_` id। ब्रॉडकास्ट जिस भी व्यक्ति तक पहुँचता है उसे अपना अलग संदेश मिलता है, इसलिए यह बताता है कि यह किन्हें गया और हर कॉपी के साथ क्या हुआ। `broadcasts.list_recipients` इन्हीं लोगों को उनके opens, clicks और unsubscribes के साथ सूचीबद्ध करता है।
fromString- भेजने वाले पते पर सटीक मिलान, जैसा वह दर्ज हुआ था, यानी छोटे अक्षरों में सादा `addr@host`। पंक्ति हर display name हटाकर लिखी जाती है, इसलिए `Acme <[email protected]>` जैसा angle-addr किसी से मेल नहीं खाता। तुलना से पहले आपका मान छोटे अक्षरों में बदला जाता है, और यह बराबरी है, prefix या डोमेन मिलान नहीं।
scheduled_fromTime, DateTime or String- सिर्फ़ वे संदेश जो इस क्षण या बाद के लिए शेड्यूल हैं। `scheduled_to:` और `status: ["scheduled", "queued"]` के साथ यह बताता है कि किसी समय-सीमा में क्या जाने का इंतज़ार कर रहा है, जैसा ऐप का कैलेंडर करता है। जिस संदेश में `scheduledAt` नहीं है उसे छोड़ दिया जाता है। Time, DateTime या offset के साथ ISO 8601 क्षण पास करें: Ruby Date सादी तारीख़ के रूप में भेजी जाती है, जिसे ये दोनों फ़िल्टर अस्वीकार करते हैं।
scheduled_toTime, DateTime or String- सिर्फ़ वे संदेश जो इस क्षण या पहले के लिए शेड्यूल हैं। `scheduled_to:` के बाद का `scheduled_from:` 422 `invalid_parameter` है।
limitInteger- इस पेज की पंक्तियाँ, 1 से 100, डिफ़ॉल्ट 25। उस सीमा से बाहर का मान सीमा में काटे जाने के बजाय 422 के रूप में अस्वीकार होता है। `list_all` और `iterate` पर यह उनके लाए हर पेज का आकार है।
cursorString- जिस संदेश id (`msg_…`) से पेजिंग करनी है। offset नहीं, keyset: पंक्तियाँ उस संदेश के `createdAt` से सख़्ती से पुरानी लौटती हैं, इसलिए पेज के बीच आए sends कोई पंक्ति आपसे आगे नहीं धकेल सकते। जो id इस वर्कस्पेस के किसी संदेश का नाम नहीं लेती वह 400 `invalid_cursor` है।
api_keyString- क्लाइंट की कुंजी के बजाय इस कुंजी से सूची लेता है।
कुछ पतों तक सीमित कुंजी सिर्फ़ उन पतों से भेजे गए संदेश पढ़ती है जिन्हें वह कवर करती है, और पेज उस फ़िल्टर के बाद काटा जाता है, इसलिए आख़िरी को छोड़ हर पेज में फिर भी limit पंक्तियाँ होती हैं। जो from: कुंजी कवर नहीं करती वह 403 के बजाय एक ख़ाली आख़िरी पेज लौटाता है।
जवाब: OpenEmail::Page
itemsArray<Hash>- संदेशों का एक पेज, `createdAt` के अनुसार सबसे नए पहले, API के `data` लिफ़ाफ़े से निकाला हुआ। list की पंक्तियाँ प्रति-पता `recipients` विवरण कभी नहीं ढोतीं। वह `get` पर है।
has_more?Boolean- क्या इस पेज के आगे भी और पंक्तियाँ फ़िल्टर से मेल खाती हैं। इसका उत्तर दूसरी count query से नहीं, बल्कि `limit` से एक पंक्ति ज़्यादा लाकर दिया जाता है।
next_cursorString or nil- वह id जिसे `cursor:` के रूप में वापस भेजना है, और आख़िरी पेज पर nil। जब यह nil हो या `has_more?` false हो तो `iterate` और `list_all` रुक जाते हैं, क्योंकि जो पेज और होने का दावा करे पर कोई cursor न बताए वह हमेशा लूप में घूमता रहता।
हर आइटम
objectString- इस सूची की पंक्ति पर हमेशा `email`।
idString- इस API की अपनी id, `msg_…`। बाक़ी हर emails कॉल यही लेती है, और cursor भी इसी का नाम लेता है।
statusString- संदेश अपने जीवन में कहाँ है। `partial` failed का कोई रूप नहीं बल्कि अपने आप में एक स्थिति है: कुछ प्राप्तकर्ताओं के पास वह पहुँच चुका है और उसे वापस नहीं लिया जा सकता, इसलिए दोबारा कोशिश करना ग़लत है। `bounced` का अर्थ है कि भेजे जाने के बाद वह हर प्राप्तकर्ता से बाउंस हो गया, इसलिए वह किसी के पास नहीं है, और `get` में हर प्राप्तकर्ता इसका कारण बताता है।
modeString- `live` या `test`, उसी कुंजी से लिया गया जिसने भेजा। test send यहाँ दर्ज होता है और कभी प्रेषित नहीं होता।
fromString- वह पता जिसके तहत send की अनुमति मिली, सादे और छोटे अक्षरों में सहेजा गया, इसलिए `from` पर दिया गया display name नेटवर्क पर तो जाता है पर यहाँ नहीं रखा जाता। Hash के बजाय सादी String, क्योंकि यही वह पहचान है जिसे अनुमति मिली: कुंजी के send scope से बाहर का पता, जो न उसके डोमेन पर है न उस पर नाम से दर्ज है, 403 के साथ अस्वीकार होता है, और कभी चुपचाप किसी अनुमत पते से नहीं बदला जाता।
subjectString or nil- विषय, जैसा सहेजा गया। बिना विषय के दर्ज संदेश पर nil।
messageIdString or nil- RFC 5322 Message-ID, हमारी id नहीं। MIME बनने तक nil, और भेजने वाली सेवा बाहर जाते समय इसे दोबारा लिखती है, इसलिए बाद का कोई bounce या DSN अलग id लिए आता है और इसकी जगह `id` से मिलाया जाता है।
threadIdString or nil- वह थ्रेड जिसका यह संदेश हिस्सा है, जहाँ कोई दिया या निर्धारित किया गया हो। वरना nil।
transportString or nil- बाइट्स कैसे निकले। भेजे जाने तक nil। सहेजे गए रिकॉर्ड में ऐसे transport के नाम भी हो सकते हैं जो अब इस्तेमाल में नहीं हैं, इसलिए जिस मान को आप नहीं जानते उसे error नहीं, जानकारी मानें।
attemptsInteger- संदेश के कितने dispatch प्रयास हो चुके हैं; पहले प्रयास से पहले 0।
lastErrorString or nil- भेजने की सबसे हाल की error, किसी व्यक्ति के लिए लिखी गई। जब तक कुछ विफल न हुआ हो तब तक nil।
scheduledAtString or nil- संदेश कब निकलना है, ISO 8601 क्षण के रूप में। सिर्फ़ बिना रद्द-विंडो वाले तुरंत send पर nil: विंडो एक छोटी देरी के सिवा कुछ नहीं, इसलिए `cancellableForSeconds` भी इसे भर देता है, उस पंक्ति पर जिसका `status` `scheduled` के बजाय `queued` है।
cancellableUntilString or nil- वह क्षण जब संदेश को निकलना है, किसी भी टाले गए send पर `scheduledAt` जैसा ही मान, और न टाले गए पर nil। यह दिखाने के लिए एक timestamp है, सर्वर की जाँच नहीं: `cancel` `status` पर शाखा बनाता है, और संदेश को तभी रोकता है जब वह अभी भी `queued` या `scheduled` हो।
sentAtString or nil- यह कब गया। भेजना पूरा होने तक nil, इसीलिए शाखा इस पर नहीं, `status` पर बनानी है।
tagsHash- send पर दिए गए लेबल, वापस लौटाए जाते हैं और इनकी कभी व्याख्या नहीं होती। हमेशा एक Hash, कुछ सेट न हो तो ख़ाली, कभी nil नहीं, और सिर्फ़ लौटाए जाते हैं: यह सूची `status`, `from`, `broadcast_id` और शेड्यूल विंडो पर फ़िल्टर करती है, इसलिए टैग संदेश से पढ़ने की चीज़ है, उसे ढूँढने का तरीका नहीं।
broadcastIdString or nil- वह `brd_` ब्रॉडकास्ट जिसकी यह संदेश एक कॉपी है, या अपने आप भेजे गए संदेश के लिए nil।
sourceString- किस सतह ने send माँगा: `composer`, `api`, `mcp`, `ai` या `queue`। `api` यही क्लाइंट है।
createdAtString- send का रिकॉर्ड कब लिखा गया, जो dispatch से पहले होता है। यही वह फ़ील्ड है जिससे सूची क्रम में लगती है और जिससे cursor तुलना करता है।
trackingHash- engagement का सारांश, सिर्फ़ उस पंक्ति पर मौजूद जिसका संदेश ट्रैक हुआ, वरना अनुपस्थित। “क्या यह ट्रैक हुआ” का जवाब इसका न होना है, जबकि `openCount` का 0 होना “किसी ने नहीं खोला” पढ़ा जाता।
translationHash- list की पंक्ति पर कभी मौजूद नहीं: अनुवाद का रिकॉर्ड संग्रहित रिक्वेस्ट में रहता है, जिसे list जानबूझकर नहीं लाती। यहाँ इसकी अनुपस्थिति इस बारे में कुछ नहीं कहती कि संदेश अनूदित हुआ था या नहीं। `get` से पूछें।
किसी आइटम की ट्रैकिंग
opensBoolean- क्या यह संदेश pixel के साथ गया। यह वही है जो इस संदेश पर लागू हुआ, न कि वह जो खाता-सेटिंग अब कहती है।
clicksBoolean- क्या इस संदेश के लिंक दोबारा लिखे गए। जब बॉडी में दोबारा लिखने को कोई लिंक न हो तो false, क्योंकि तब कुछ बदला ही नहीं।
openedBoolean- क्या कोई गिना गया open दर्ज हुआ, जो `openCount` के 0 से ऊपर होने से निकाला जाता है।
clickedBoolean- क्या कोई गिना गया click दर्ज हुआ, जो `clickCount` के 0 से ऊपर होने से निकाला जाता है।
openCountInteger- वे opens जिनके बारे में माना जाता है कि वे किसी व्यक्ति के कारण हुए, संदेश की हर प्रति पर जोड़कर। स्कैनर और privacy proxies दर्ज तो होते हैं पर बाहर रखे जाते हैं, और तीस सेकंड के भीतर की दोहराई गई fetch एक में समा जाती हैं।
clickCountInteger- गिने गए clicks, सभी प्रतियों पर जोड़कर। इनका दोहराव प्रति संदेश नहीं बल्कि प्रति लिंक हटाया जाता है, क्योंकि कुछ सेकंड के अंतर पर दो लिंक खोलना दो कर्म हैं, दोहराव नहीं।
firstOpenAtString or nil- कॉपियों में सबसे पहला गिना गया open, और जब तक कोई न हो तब तक nil। मशीनी hits इसे कभी नहीं खिसकाते।