Belgelere geç
Python

Açılma ve tıklama izleme

`emails.get_tracking` ve `tracking` kaynağının tamamı.

Tek mesaj

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'])

Hiç izlenmemiş bir mesaj, boş bir rapor değil, is_not_found değeri true olan bir OpenEmailApiError fırlatır. “Hiçbir şey kaydetmedik” ile “kimse açmadı” farklı yanıtlardır ve aynı yanıtı paylaşmamalıdır.

Posta kutusu genelinde

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 ve list_clicks tek bir sayfa döndürür, {'items': [...], 'hasMore': ..., 'nextCursor': ...}; list_all, iterate, list_all_opens, iterate_opens, list_all_clicks ve iterate_clicks ise sizin için her sayfayı gezer. get, list_opens ve list_clicks, msg_… gönderim id'sini ya da izleme kaydının kendi tmsg_… değerini alır.

emails üzerindeki alanlar yerine kendi başına bir kaynak olmasının nedeni kapsamdır: emails, yalnızca bu API'nin işlediği postalar için var olan gönderim kayıtlarını listeler. Yazma ekranı, MCP araçları ve asistan bu kayıt olmadan gönderim yapar; dolayısıyla emails üzerine kurulmuş bir rapor, posta kutusunun değil API trafiğinizin raporu olurdu.

Sayıları dürüstçe okumak

ÇiftNe anlama gelir
opens / clicksUYGULANAN şey: mesajın bir pikselle veya yeniden yazılmış bağlantılarla gidip gitmediği.
opened / clickedNe olduğu.
openCountSayılan istekler. Tarayıcı botları ve gizlilik vekilleri hariç.
openCountRawHer istek. Bunu etkileşim diye sunmak, açılma oranının %100'ü aşmasına yol açar.
attributableBir okumanın adı belli bir alıcıya bağlanıp bağlanamayacağı.

tracking.get_stats oranları, gönderilen her şeye göre değil İZLENEN mesajlara göredir. Aksi hâlde on mesajdan birini izleyen bir posta kutusu çökmüş gibi görünürdü.

Parametreler: tracking.list

openedbool
`True`, en az bir sayılan açılması olan mesajları seçer; `False` ise hiç açılması olmayan izlenmiş mesajları seçer. Hiçbiri varsayılan değildir ve `False` asla izlenmemiş posta anlamına gelmez; o postalar bu listede hiç yer almaz.
clickedbool
Sayılan tıklamalar için aynı filtre; `opened` filtresinden bağımsız uygulanır. İkisi birden verilebilir ve mesajların ikisini de sağlaması gerekir.
daysint
Şimdiden geriye kaç gün bakılacağı, 1 ila 365, varsayılan 30; bu aralığın dışında 422 verir. Pencere, izleme kaydının oluşturulma zamanına göre ölçülür ve yalnızca gönderimi gerçekten gitmiş kayıtlar listelenir.
limitint
Sayfa başına rapor, 1 ila 200, varsayılan 50, en yeniden eskiye. Sonraki sayfa için sayfanın `nextCursor` değerini aynı filtrelerle `cursor` olarak geri gönderin ya da tüm pencereyi `list_all` ve `iterate` dolaşsın.

Yanıt: TrackingResource

objectLiteral['tracking']
`tracking.get`, `tracking.list` veya `emails.get_tracking` üzerinden kendi başına getirilen bir raporda her zaman `'tracking'`. Getirilen bir mesajın içinde `email['tracking']` olarak yer alan aynı rapor bu anahtar olmadan gelir, çünkü orada ayrıca getirilen bir şey değil o nesnenin parçasıdır.
idstr
İzleme kaydının kendi id'si, `tmsg_…`. İstek başına çağrılar olan `list_opens` ve `list_clicks` bu değere göre anahtarlanır; onlara verilen bir `msg_…` önce buna çözümlenir.
sendIdstr | None
Bunun karşılık geldiği `msg_…` gönderimi; hiç gönderim kaydı yazılmamışsa null. Yazma ekranı, MCP'nin `sendEmail` aracı ve asistan, kayıt yazmadan gönderim yapar. İzleme yalnızca API trafiğini değil posta kutusunu kapsar.
threadIdstr | None
Okuma arayüzünün mesajı yeniden bulabilmesi için iletimden sonra doldurulur; sürücü hiçbir şey bildirmediyse null olur. Kritik değildir: bu alanı null olan bir kayıt yine de sayılır.
messageIdstr | None
RFC 5322 Message-ID; bizim id'miz değil. O da iletimden sonra doldurulur ve taşıma katmanı dolduracak bir şey döndürmediyse null olur.
subjectstr | None
Gönderim anındaki hâliyle konu. Konusuz kaydedilmiş bir mesajda null.
fromstr
Gönderen adres; gönderimden birleştirilmek yerine kaydın üzerine kopyalanır. Raporlar olaydan çok sonra okunur ve o zamandan beri düzeltilmiş veya kaldırılmış bir adres, aksi hâlde geçmişi yeniden yazardı.
sourceEmailSource | str
Hangi yüzeyin gönderdiği: `composer`, `api`, `mcp`, `ai`, `oauth` veya `form`. Tipi açık bırakılmıştır; böylece bu SDK'nın henüz adlandırmadığı bir yüzey kırıcı bir değişiklik olmaz.
sentAtstr | None
Mesajın ne zaman gittiği, bir ISO-8601 anı olarak. Gönderimi hiç tamamlanmamış bir kayıtta null. `tracking.list` bunları hariç tutar, `get` tutmaz.
opensbool
Bu mesaja bir pikselin UYGULANIP uygulanmadığı. Bu, hesap ayarının şu anda ne dediği değil, ne yapıldığıdır.
clicksbool
Bu mesajın bağlantılarının yeniden yazılıp yazılmadığı. Gövde hiç bağlantı taşımıyorsa False olur, çünkü o zaman hiçbir şey değiştirilmemiştir ve aksini iddia eden bir kayıt baytlarla bağdaştırılamazdı.
openedbool
Kopyalar genelinde sayılan herhangi bir açılma kaydedilip kaydedilmediği. Bunu `opens` ile birlikte okuyun: veri toplanmadığı için verinin olmaması ile kimsenin mesajı okumamış olması farklı olgulardır.
clickedbool
Sayılan herhangi bir tıklama kaydedilip kaydedilmediği. Bir açılmadan daha güçlü bir kanıttır, çünkü görseller, bağlantıların takip edilmemesinden çok daha sık engellenir.
attributablebool
Buradaki her okumanın adı belli bir alıcıya bağlanıp bağlanamadığı. Atfedilmemiş bir kopyada sayılan bir etkinlik göründüğü anda False olur; bu, tek bir gövdenin tek bir belirteç altında tüm listeye gittiği çok alıcılı durumdur. Bu yüzden “Bob bunu açmadı” yazmadan önce bunu denetleyin.
openCountint
Bir insanın yol açtığına inanılan açılmalar, kopyalar üzerinden toplanır. Makine istekleri hariç tutulur ve otuz saniye içindeki tekrarlar tek bir açılmaya indirgenir; dolayısıyla okuyucunun önüne konacak rakam budur.
clickCountint
Sayılan tıklamalar, kopyalar üzerinden toplanır. Mesaj başına değil bağlantı başına tekilleştirilir; dolayısıyla saniyeler arayla takip edilen iki farklı bağlantı iki tıklamadır.
openCountRawint
Her piksel isteği; tarayıcı botları ve gizlilik vekilleri dahil. `openCountRaw - openCount`, sınıflandırıcının kaç tanesini ayırdığını gösterir ve filtrelemenin yapıldığına dair elinizdeki tek kanıttır.
clickCountRawint
Yeniden yazılmış bir bağlantıya yapılan her ziyaret; makine istekleri ve tekrarlar dahil.
firstOpenAtstr | None
Kopyalar arasındaki en erken sayılan açılma; hiç yoksa null. Makine istekleri bunu asla değiştirmez.
lastOpenAtstr | None
Kopyalar arasındaki en son sayılan açılma; hiç yoksa null.
firstClickAtstr | None
Kopyalar arasındaki en erken sayılan tıklama; hiç yoksa null.
lastClickAtstr | None
Kopyalar arasındaki en son sayılan tıklama; hiç yoksa null.
recipientslist[TrackingRecipientResource]
İzlenen her kopya için bir kayıt: taşıma katmanı baytların kişi başına farklılaşmasına izin verdiğinde alıcı başına, izin vermediğinde ise tek bir paylaşılan kayıt. Paylaşılan kayıt, üzerine gerçekten bir şey düşmedikçe atılır; böylece dokunulmamış bir “birisi” satırı asla gerçek adların yanında durmaz.
recipients[].emailstr | None
Bu kopyanın kime gittiği; gönderim anındaki hâliyle ve küçük harfli. Tam olarak `attributed` false olduğunda null'dır.
recipients[].kindRecipientKind | None
Adresin hangi başlıkta göründüğü; böylece rapor, mesajın okunduğu gibi okunur. Hiçbir adrese ait olmayan paylaşılan kopyada null.
recipients[].attributedbool
Bu satırın bir kişiyi adlandırıp adlandırmadığı. `email` alanından önce bunu okuyun: false, üzerine herhangi bir istek düştüğü anda listelenen paylaşılan kopyadır ve tek alıcılı bir mesajda bile o isteğe bir ad koymak, mekanizmanın sağlayamayacağı tek olguyu uydurmak olurdu.
recipients[].openCountint
Yalnızca bu kopyadaki sayılan açılmalar; mesaj toplamıyla aynı elemelere tabidir: makine istekleri düşürülür ve otuz saniye içindeki tekrarlar tek bir açılmaya indirgenir.
recipients[].clickCountint
Yalnızca bu kopyadaki sayılan tıklamalar; kopya başına değil bağlantı başına tekilleştirilir.
recipients[].firstOpenAtstr | None
Bu kopyadaki en erken sayılan açılma; hiç yoksa null.
recipients[].lastOpenAtstr | None
Bu kopyadaki en son sayılan açılma; hiç yoksa null.
recipients[].firstClickAtstr | None
Bu kopyadaki en erken sayılan tıklama; hiç yoksa null.
recipients[].lastClickAtstr | None
Bu kopyadaki en son sayılan tıklama; hiç yoksa null.
linkslist[TrackingLinkResource]
Bu mesajda yeniden yazılan her bağlantı, gövdedeki konumuna göre sıralı. Hiç yoksa boştur: `clicks` kapalı gönderilmiş bir mesaj ya da gövdesinde hiç bağlantı olmayan bir mesaj.
links[].idstr
Bağlantının kendi id'si, `lnk_…`. Bir tıklama satırındaki `linkId` alanının gösterdiği değer budur; böylece `list_clicks` çağrısından gelen bir istek buradaki kayıtla eşleştirilebilir.
links[].urlstr
Bağlantının gerçekte nereye gittiği; mesajda yeniden yazılmadan önceki hâliyle. Yönlendirici bir id'yi buna geri çözümler ve ziyaretçiyi yoluna gönderir.
links[].labelstr | None
Bağlantı metninin mesajda göründüğü hâli ya da bağlantının metni yoksa (bir görsel veya çıplak bir URL gibi) null. Bir raporun üç izleme parametresi taşıyan bir URL'yi alıntılamak yerine “fiyatlandırma bağlantısı” diyebilmesi için vardır ve asla `url` alanının yerini tutmaz.
links[].clickCountint
Bu bağlantıya yapılan sayılan ziyaretler, kopyalar üzerinden toplanır. Mesajdaki `clickCount` ile aynı, bağlantı başına otuz saniyelik pencere geçerlidir.
links[].clickCountRawint
Bu bağlantıya yapılan her ziyaret; makine istekleri ve tekrarlar dahil.

Referans