दस्तावेज़ पर जाएँ
Python

Open और click tracking

`emails.get_tracking` और पूरा `tracking` संसाधन।

एक संदेश

tracking.py
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 है। "हमने कुछ दर्ज नहीं किया" और "इसे किसी ने नहीं खोला" अलग-अलग उत्तर हैं और उन्हें एक ही रिस्पॉन्स साझा नहीं करना चाहिए।

पूरे मेलबॉक्स में

tracking_report.py
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
इस लिंक पर हर विज़िट, मशीन हिट और पुनरावृत्तियाँ सहित।

संदर्भ