Open और click tracking
`emails.get_tracking` और पूरा `tracking` संसाधन।
एक संदेश
from openemail import openemail report = openemail.emails.get_tracking('msg_…') print(report['openCount'], 'opens from', len(report['recipients']), 'recipients')for link in report['links']: print(link['url'], link['clickCount'])जो संदेश कभी ट्रैक ही नहीं हुआ, वह ख़ाली रिपोर्ट नहीं बल्कि ऐसी OpenEmailApiError raise करता है जिसका is_not_found true है। "हमने कुछ दर्ज नहीं किया" और "इसे किसी ने नहीं खोला" अलग-अलग उत्तर हैं और उन्हें एक ही रिस्पॉन्स साझा नहीं करना चाहिए।
पूरे मेलबॉक्स में
import time from openemail import openemail openemail.tracking.list(opened=False, days=7, limit=100)openemail.tracking.get_stats(days=30, offset_minutes=time.localtime().tm_gmtoff // 60)openemail.tracking.get('msg_…')openemail.tracking.list_opens('msg_…', include_machine=True)openemail.tracking.list_clicks('msg_…')list, list_opens और list_clicks एक पेज लौटाते हैं, {'items': [...], 'hasMore': ..., 'nextCursor': ...}, और list_all, iterate, list_all_opens, iterate_opens, list_all_clicks और iterate_clicks आपके लिए हर पेज से गुज़रते हैं। get, list_opens और list_clicks या तो msg_… send id लेते हैं या ट्रैकिंग रिकॉर्ड की अपनी tmsg_…।
यह emails पर फ़ील्ड होने के बजाय अपने आप में एक संसाधन है, और इसका कारण है दायरा: emails send रिकॉर्ड सूचीबद्ध करता है, जो केवल उसी मेल के लिए मौजूद होते हैं जिसे इस API ने संभाला। composer, MCP tools और assistant, ये सब उसके बिना भेजते हैं, इसलिए emails पर बनी रिपोर्ट मेलबॉक्स के बारे में नहीं, आपके API ट्रैफ़िक के बारे में रिपोर्ट होती।
आंकड़ों को ईमानदारी से पढ़ना
| जोड़ी | इसका क्या अर्थ है |
|---|---|
| opens / clicks | जो लागू हुआ: संदेश pixel या दोबारा लिखे गए लिंक के साथ गया या नहीं। |
| opened / clicked | जो हुआ। |
| openCount | गिने गए हिट। स्कैनर और प्राइवेसी प्रॉक्सी शामिल नहीं। |
| openCountRaw | हर हिट। इसे एंगेजमेंट के तौर पर पेश करने से ही ओपन रेट 100% से ऊपर चला जाता है। |
| attributable | क्या किसी पढ़े जाने को किसी नामित प्राप्तकर्ता से जोड़ा भी जा सकता है। |
tracking.get_stats से मिलने वाली दरें ट्रैक किए गए संदेशों पर होती हैं, भेजे गए सभी संदेशों पर कभी नहीं। वरना जो मेलबॉक्स दस में से एक संदेश ट्रैक करता है, वह ढह गया-सा दिखेगा।
पैरामीटर: tracking.list
openedbool- `True` उन संदेशों को चुनता है जिनमें कम से कम एक गिना गया ओपन है, `False` उन ट्रैक किए गए संदेशों को चुनता है जिनमें एक भी नहीं। इनमें से कोई डिफ़ॉल्ट नहीं है, और `False` का मतलब कभी भी बिना ट्रैकिंग वाला मेल नहीं होता, जो इस सूची में आता ही नहीं।
clickedbool- गिने गए क्लिक के लिए वही फ़िल्टर, `opened` से स्वतंत्र रूप से लागू। दोनों दिए जा सकते हैं, और संदेशों को दोनों शर्तें पूरी करनी होंगी।
daysint- अभी से कितने दिन पीछे तक देखना है, 1 से 365 तक और डिफ़ॉल्ट 30; इस दायरे से बाहर होने पर 422 मिलता है। यह विंडो इस आधार पर मापी जाती है कि ट्रैकिंग रिकॉर्ड कब बना, और केवल वही रिकॉर्ड सूचीबद्ध होते हैं जिनका भेजा जाना सचमुच हुआ।
limitint- हर पेज पर रिपोर्टें, 1 से 200 तक और डिफ़ॉल्ट 50, नए से पुराने क्रम में। अगले पेज के लिए उसी फ़िल्टर के साथ पेज का `nextCursor` `cursor` के रूप में वापस भेजें, या `list_all` और `iterate` को पूरी विंडो पढ़ने दें।
रिस्पॉन्स: TrackingResource
objectLiteral['tracking']- अपने आप में लाई गई रिपोर्ट पर हमेशा `'tracking'`, चाहे वह `tracking.get`, `tracking.list` या `emails.get_tracking` से आई हो। वही रिपोर्ट जब किसी प्राप्त किए गए संदेश पर `email['tracking']` के रूप में नेस्ट होती है, तो यह key उसमें नहीं होती, क्योंकि वहाँ वह उस object का हिस्सा है, न कि अलग से लाई गई कोई चीज़।
idstr- ट्रैकिंग रिकॉर्ड की अपनी id, `tmsg_…`। प्रति-हिट कॉल `list_opens` और `list_clicks` इसी पर आधारित होती हैं; उन्हें दी गई कोई `msg_…` पहले इसी में बदली जाती है।
sendIdstr | None- वह `msg_…` send जिससे यह संबंधित है, और जहाँ कोई send रिकॉर्ड नहीं लिखा गया वहाँ null। कंपोज़र, MCP का `sendEmail` और असिस्टेंट, तीनों इसके बिना भेजते हैं। ट्रैकिंग पूरे मेलबॉक्स को कवर करती है, केवल API ट्रैफ़िक को नहीं।
threadIdstr | None- ट्रांसमिशन के बाद भरा जाता है ताकि पढ़ने वाला UI संदेश दोबारा ढूँढ सके, और जहाँ ड्राइवर ने कुछ नहीं बताया वहाँ null। यह अनिवार्य नहीं है: जिस रिकॉर्ड में यह null है वह भी गिना जाता है।
messageIdstr | None- RFC 5322 Message-ID, हमारी id नहीं। यह भी ट्रांसमिशन के बाद भरा जाता है, और जहाँ ट्रांसपोर्ट ने भरने के लिए कुछ नहीं लौटाया वहाँ null।
subjectstr | None- subject, जैसा वह भेजते समय था। बिना subject के दर्ज संदेश पर null।
fromstr- भेजने वाला पता, जो send से जोड़कर लाने के बजाय रिकॉर्ड पर ही कॉपी कर दिया जाता है। रिपोर्टें घटना के बहुत बाद पढ़ी जाती हैं, और तब से सुधारा या हटाया गया कोई पता अन्यथा इतिहास को दोबारा लिख देता।
sourceEmailSource | str- इसे किस सतह ने भेजा: `composer`, `api`, `mcp`, `ai`, `oauth` या `form`। टाइप खुला रखा गया है ताकि कोई ऐसी सतह, जिसका नाम यह SDK अभी नहीं लेता, breaking change न बने।
sentAtstr | None- संदेश कब गया, ISO-8601 क्षण के रूप में। जिस रिकॉर्ड का send कभी पूरा नहीं हुआ उस पर null। `tracking.list` उन्हें छोड़ देता है, `get` नहीं छोड़ता।
opensbool- क्या इस संदेश पर pixel लगाया गया था। यह बताता है कि क्या किया गया, न कि अभी अकाउंट सेटिंग क्या कहती है।
clicksbool- क्या इस संदेश के लिंक दोबारा लिखे गए थे। जब बॉडी में कोई लिंक ही नहीं था तो False, क्योंकि तब कुछ बदला ही नहीं गया और इसके उलट दावा करने वाले रिकॉर्ड को असली बाइट्स से मिलाया नहीं जा सकता।
openedbool- क्या सभी कॉपियों में कहीं भी कोई गिना गया ओपन दर्ज हुआ। इसे `opens` के साथ मिलाकर पढ़ें: डेटा इसलिए न होना कि कुछ इकट्ठा ही नहीं हुआ, इस बात से अलग तथ्य है कि संदेश किसी ने पढ़ा ही नहीं।
clickedbool- क्या कोई गिना गया क्लिक दर्ज हुआ। ओपन से ज़्यादा मज़बूत सबूत, क्योंकि लिंक पर न जाने की तुलना में इमेज कहीं ज़्यादा बार ब्लॉक होती हैं।
attributablebool- क्या यहाँ का हर पढ़ा जाना किसी नामित प्राप्तकर्ता से जोड़ा जा सकता है। जैसे ही किसी बिना-श्रेय वाली कॉपी पर गिनी गई गतिविधि दिखती है, यह False हो जाता है। यही वह बहु-प्राप्तकर्ता स्थिति है जहाँ एक ही बॉडी एक ही token के तहत पूरी सूची को जाती है, इसलिए "Bob ने इसे नहीं खोला" लिखने से पहले इसे जाँच लें।
openCountint- वे ओपन जिन्हें किसी व्यक्ति द्वारा किया गया माना जाता है, सभी कॉपियों को जोड़कर। मशीनी हिट छोड़ दिए जाते हैं और तीस सेकंड के भीतर के दोहराव एक में मिला दिए जाते हैं, इसलिए पाठक के सामने यही आँकड़ा रखना चाहिए।
clickCountint- गिने गए क्लिक, सभी कॉपियों को जोड़कर। डुप्लिकेट हटाना प्रति संदेश नहीं बल्कि प्रति लिंक होता है, इसलिए कुछ सेकंड के अंतर पर खोले गए दो अलग लिंक दो क्लिक हैं।
openCountRawint- हर पिक्सेल फ़ेच, स्कैनर और प्राइवेसी प्रॉक्सी समेत। `openCountRaw - openCount` बताता है कि क्लासिफ़ायर ने कितने अलग रखे, और यही अकेला सबूत है कि फ़िल्टरिंग हुई भी।
clickCountRawint- दोबारा लिखे गए लिंक पर हर विज़िट, मशीनी हिट और दोहराव समेत।
firstOpenAtstr | None- सभी प्रतियों में सबसे पहला गिना गया open, और कोई न होने पर null। मशीनी hits इसे कभी नहीं हिलातीं।
lastOpenAtstr | None- सभी प्रतियों में सबसे हालिया गिना गया ओपन; जब तक कोई नहीं है, null।
firstClickAtstr | None- सभी प्रतियों में सबसे पहला गिना गया क्लिक; जब तक कोई नहीं है, null।
lastClickAtstr | None- सभी प्रतियों में सबसे हालिया गिना गया क्लिक; जब तक कोई नहीं है, null।
recipientslist[TrackingRecipientResource]- प्रत्येक ट्रैक की गई प्रति के लिए एक प्रविष्टि: जहाँ ट्रांसपोर्ट बाइट्स को हर व्यक्ति के लिए अलग होने देता है वहाँ प्रति प्राप्तकर्ता एक, और जहाँ नहीं देता वहाँ एक साझा प्रविष्टि। साझा प्रविष्टि तब तक हटा दी जाती है जब तक उस पर वास्तव में कुछ दर्ज न हुआ हो, इसलिए बिना किसी हिट वाली "कोई" पंक्ति असली नामों के बगल में कभी नहीं बैठती।
recipients[].emailstr | None- यह प्रति किसे गई, lowercase में और जैसी वह भेजते समय थी। ठीक तभी null जब `attributed` false हो।
recipients[].kindRecipientKind | None- पता किस header पर आया था, ताकि रिपोर्ट वैसी ही पढ़ी जाए जैसा संदेश था। साझा प्रति पर null, जो किसी एक पते की नहीं होती।
recipients[].attributedbool- क्या यह पंक्ति किसी व्यक्ति का नाम बताती है। इसे `email` से पहले पढ़ें: false का अर्थ है साझा प्रति, जो किसी भी हिट के उस पर आते ही सूचीबद्ध हो जाती है, और उस हिट पर नाम चिपकाना, एकमात्र प्राप्तकर्ता वाले संदेश पर भी, ठीक वही तथ्य गढ़ना होगा जो यह तंत्र दे ही नहीं सकता।
recipients[].openCountint- केवल इसी प्रति पर गिने गए ओपन, संदेश के कुल योग जैसी ही छूटों के साथ: मशीन हिट हटा दी जाती हैं, और तीस सेकंड के भीतर की पुनरावृत्तियाँ एक में समेट दी जाती हैं।
recipients[].clickCountint- केवल इसी प्रति पर गिने गए क्लिक, जिनका दोहराव प्रति प्रति नहीं बल्कि प्रति लिंक हटाया जाता है।
recipients[].firstOpenAtstr | None- इस प्रति पर सबसे पहला गिना गया ओपन; जब तक कोई नहीं है, null।
recipients[].lastOpenAtstr | None- इस प्रति पर सबसे हालिया गिना गया ओपन; जब तक कोई नहीं है, null।
recipients[].firstClickAtstr | None- इस प्रति पर सबसे पहला गिना गया क्लिक; जब तक कोई नहीं है, null।
recipients[].lastClickAtstr | None- इस प्रति पर सबसे हालिया गिना गया क्लिक; जब तक कोई नहीं है, null।
linkslist[TrackingLinkResource]- इस संदेश में फिर से लिखा गया हर लिंक, उसी क्रम में जिसमें वह body में बैठा था। जहाँ कोई नहीं था वहाँ खाली: `clicks` बंद रखकर भेजा गया संदेश, या वह जिसकी body में कोई लिंक था ही नहीं।
links[].idstr- लिंक की अपनी id, `lnk_…`। यही वह मान है जिसका नाम किसी click पंक्ति का `linkId` लेता है, इसलिए `list_clicks` से आई हिट को यहाँ की प्रविष्टि से मिलाया जा सकता है।
links[].urlstr- लिंक वास्तव में कहाँ जाता है, जैसा वह फिर से लिखे जाने से पहले संदेश में था। रीडायरेक्टर किसी id को वापस इसी में हल करता है और आगंतुक को आगे भेज देता है।
links[].labelstr | None- ऐंकर टेक्स्ट, जैसा वह संदेश में दिखा, या null जहाँ लिंक के पास कोई नहीं था, जैसे कोई छवि या नंगा URL। यह इसलिए है ताकि रिपोर्ट तीन ट्रैकिंग पैरामीटर वाला URL उद्धृत करने के बजाय "प्राइसिंग लिंक" कह सके, और यह कभी `url` की जगह नहीं लेता।
links[].clickCountint- इस लिंक पर गिनी गई विज़िट, सभी प्रतियों पर जोड़कर। संदेश के `clickCount` जैसी ही प्रति-लिंक तीस-सेकंड की विंडो।
links[].clickCountRawint- इस लिंक पर हर विज़िट, मशीन हिट और पुनरावृत्तियाँ सहित।
संदर्भ
emails.get_tracking()पूरा रेफ़रेंसtracking.list()पूरा रेफ़रेंसtracking.list_all()पूरा रेफ़रेंसtracking.iterate()पूरा रेफ़रेंसtracking.get_stats()पूरा रेफ़रेंसtracking.get()पूरा रेफ़रेंसtracking.list_opens()पूरा रेफ़रेंसtracking.list_all_opens()पूरा रेफ़रेंसtracking.iterate_opens()पूरा रेफ़रेंसtracking.list_clicks()पूरा रेफ़रेंसtracking.list_all_clicks()पूरा रेफ़रेंसtracking.iterate_clicks()पूरा रेफ़रेंस