Toplu gönderimler
`broadcasts.preview`, `send`, `list`, `list_all`, `iterate`, `get`, `list_recipients`, `list_all_recipients`, `iterate_recipients`, `get_recipient`, `stats`, `analytics` ve `cancel`.
Her yöntem
import time from openemail import openemailfrom openemail.types import BroadcastCreate draft: BroadcastCreate = { 'audienceIds': ['aud_4c1b8e2a7d9f05c36b4e8a71'], 'from': 'Acme <[email protected]>', 'subject': '{{firstName|Hello}}, the September release is out', 'html': '<p>Hi {{firstName|there}},</p><p>Here is what changed this month.</p>', 'text': 'Hi {{firstName|there}}, here is what changed this month. Unsubscribe: {{unsubscribeUrl}}', 'tags': {'campaign': 'release-2026-09'},} reach = openemail.broadcasts.preview(draft)print(reach['recipients'], reach['unsubscribed'], reach['suppressed']) broadcast = openemail.broadcasts.send(draft) latest = openemail.broadcasts.get(broadcast['id'])while latest['status'] in ('scheduled', 'queued', 'sending'): time.sleep(5) latest = openemail.broadcasts.get(broadcast['id']) for copy in openemail.broadcasts.iterate_recipients(broadcast['id']): print(copy['email'], copy['status'], copy['opens'], copy['clicks']) bounced = openemail.broadcasts.list_recipients(broadcast['id'], filter='bounced')if bounced['items']: content = openemail.broadcasts.get_recipient(broadcast['id'], bounced['items'][0]['emailId']) print(content['subject'], content['bouncedAt']) stats = openemail.broadcasts.stats(broadcast['id'], grain='day')print(stats['totals']['opened'], stats['totals']['clicked'], stats['totals']['unsubscribed']) lately = openemail.broadcasts.stats(broadcast['id'], days=1)print(lately['window']['opened'] if lately['window'] else None) month = openemail.broadcasts.analytics(days=30)for row in month['broadcasts']: print(row['subject'], row['sent'], row['opened']) later = openemail.broadcasts.send({**draft, 'scheduledAt': 'P1D'})openemail.broadcasts.cancel(later['id']) history = openemail.broadcasts.list(audience_id=draft['audienceIds'][0])print(latest['status'], latest['counts']['sent'], len(history['items']))Toplu gönderim, bir ya da daha fazla kitledeki herkese her kişi için ayrı bir kopya olarak tek bir ileti gönderir. Her kopyanın tam olarak bir alıcısı vardır, cc ya da bcc yoktur; bu yüzden kimse başka kime gittiğini görmez ve her kopya kendi msg_ kimliği, olayları, izlemesi ve webhook'ları olan sıradan bir e-postadır. list_recipients onları her birine ne olduğuyla birlikte listeler. Kopyalar Gönderilenler klasörüne kaydedilmez, çünkü toplu gönderim kayıttır.
send, toplu gönderim queued durumundayken ya da scheduledAt verirseniz scheduled durumundayken hemen döner ve gönderim arka planda sürer. send için emails:send ve audiences:read, preview için audiences:read, list, list_all, iterate, get, list_recipients, list_all_recipients, iterate_recipients, get_recipient, stats ve analytics için emails:read, cancel için emails:send gerekir.
Her send bir Idempotency-Key taşır; idempotency_key= ile verdiğiniz ya da SDK'nın oluşturduğu. Bu yüzden bir ağ hatasından sonra yeniden deneme, iki kez göndermek yerine ilk denemenin oluşturduğu toplu gönderimle yanıt verir. preview, get, cancel ve tüm okumalar güvenle tekrarlanabilir ve yeniden denenir.
Birleştirme alanları
subject, html ve text her kişi için kendi kişi kaydından doldurulur. {{firstName}} kişi adının ilk sözcüğü, {{lastName}} geri kalanı, {{name}} tam ad, {{email}} kopyanın gittiği adres ve {{unsubscribeUrl}} onun aboneliğini sonlandıran bağlantıdır.
Her alan çizgiden sonra bir yedek değer alır; kişinin o alan için değeri yoksa kullanılır, bu yüzden {{firstName|there}} adsız kaydedilmiş bir kişi için "there" olur. Değerler html içinde kaçırılır ve diğer her {{…}} tam yazıldığı gibi bırakılır.
Kaydedilmiş bir şablonu göndermek için html ve text yerine template geçirin. Aynı beş değer ona özellik olarak ulaşır, ama yalnızca şablonun tanımladığı özellikler; bu yüzden firstName'i tanımlayan bir şablon onu alır, tanımlamayan ise bu yüzden hiçbir zaman reddedilmez. template.props içindeki her şey her kopyaya aynı biçimde gider.
Abonelikten çıkma
Her kopya, bir posta istemcisinin kendi abonelikten çıkma düğmesini göstermesini sağlayan tek tık abonelikten çıkma başlıklarını taşır; büyük posta kutusu sağlayıcılarının toplu postadan istediği de budur. {{unsubscribeUrl}}'i kendisi yerleştirmeyen bir html ya da text gövdesine bağlantıyı içeren tek satırlık bir alt bilgi eklenir. Şablon tam olduğu gibi gönderilir, bu yüzden {{unsubscribeUrl}}'i şablona koyun.
Abonelikten çıkmak, kişiyi o toplu gönderimin gittiği her kitlede abonelikten çıkmış olarak işaretler ve AudienceContactResource.unsubscribedAt bunu audiences.list_contacts üzerinde gösterir. Kişi kitlede ve adres defterinde kalır, diğer kitlelerine dokunulmaz ve ona tek tek gönderilen postalar gitmeye devam eder. Onu kitleden çıkarıp yeniden eklemek yeniden abone yapar.
Kimler atlanır
Toplu gönderim, audienceIds içindekilerden en az birinde bulunan her kişiye, kaçında bulunursa bulunsun bir kez ulaşır. İçinde bulunduğu bu kitlelerin her birinden abonelikten çıkmış kişiyi ve bir geri dönme ya da şikâyet sonrasında veya biri eklediği için engelleme listesinde olan adresi atlar. send'den sonra ama gönderim ona ulaşmadan önce kitlelerden birine eklenen kişi dahil edilir.
preview hiçbir şey göndermeden aynı sayıları döndürür: recipients, unsubscribed ve suppressed. Kimseye ulaşmayacak bir send 422 no_recipients fırlatır.
Herhangi bir şey yazılmadan önce gönderimin tamamı planın aylık gönderim sayısıyla karşılaştırılır; bu yüzden kotanın karşılayamadığı bir toplu gönderim 429 send_quota_exceeded fırlatır ve geride hiçbir şey bırakmaz. Her kopya bir gönderim sayılır.
Durum ve ilerleme
get, counts'u kopyalardan canlı okur, bu yüzden bir toplu gönderim sürerken onu yoklayın. status, scheduled ya da queued'dan sending'e geçer ve teslim edilen her kopya gittiğinde ya da başarısız olduğunda sent üzerinde kalır. Kopyalar hâlâ beklerken, completedAt son kişiye ulaşıldığını söyledikten sonra bile sending kalır. failed, toplu gönderimin tamamının durduğu anlamına gelir ve lastError nedenini söyler: from adresinden artık gönderilemiyor, şablon çözümlenmeyi bıraktı, plan yarı yolda bitti, gönderimin kendisi sürekli başarısız oldu ya da tek bir kopya bile yazılamadı.
cancel, scheduled, queued ya da sending olan bir toplu gönderimi durdurur. Kimse eklenmez ve hâlâ bekleyen her kopya iptal edilir, gitmiş kopyalar ise geri alınamaz. Her kopya gittikten sonra cancel 409 broadcast_not_cancellable fırlatır ve iptal edilmiş bir toplu gönderimi iptal etmek onu olduğu gibi döndürür.
Kime ulaştı
list_recipients, bir toplu gönderimin gittiği kişilerin bir sayfasını, kopya başına bir satır, adrese göre sıralı ve items, hasMore ve nextCursor içeren bir sözlük olarak döndürür. list_all_recipients tüm sayfaları dolaşıp tek bir listeye toplar, iterate_recipients ise her seferinde bir kopya verir ve sonraki sayfayı yalnızca döngü istediğinde getirir. limit 1 ile 200 arasındadır ve varsayılanı 50'dir; bir cursor aynı filter ve q ile geri gönderilir.
| filter | Tuttukları |
|---|---|
| pending | Hâlâ kuyrukta, zamanlanmış ya da gönderilmekte olan kopyalar. |
| sent | Gönderilen kopyalar. |
| delivered | Alıcı sunucunun kabul ettiği kopyalar. |
| opened | En az bir kez açılan kopyalar. |
| not_opened | Gönderilmiş ve hiç açılmamış kopyalar. |
| clicked | En az bir izlenen tıklaması olan kopyalar. |
| bounced | Geri dönen kopyalar. |
| complained | Kişinin spam olarak bildirdiği kopyalar. |
| failed | Başarısız olan ya da iptal edilen kopyalar. |
| unsubscribed | Toplu gönderimden sonra abonelikten çıkan kişiler. |
BROADCAST_RECIPIENT_FILTERS her filtreyi adlandırır, q ise adreste ve adda büyük/küçük harf ayrımı yapmadan arar. Açmalar ve tıklamalar görsel proxy'lerini ve bağlantı tarayıcılarını dışarıda bırakır ve toplu gönderim izleme kapalıyken çıktıysa 0 kalır.
get_recipient(id, email_id) tek bir kopya döndürür: aynı satır, artı birleştirme alanları doldurulmuş ve kişinin kendi abonelikten çıkma bağlantısıyla, o kişinin aldığı hâliyle subject, html ve text. HTML, açma ve tıklama izlemesi eklenmeden önceki hâlidir. Bu toplu gönderimin kopyası olmayan bir email_id 404 recipient_not_found fırlatır, bilinmeyen bir toplu gönderim ise 404 broadcast_not_found fırlatır.
stats toplamları ve bir seriyi döndürür. totals, sent, delivered, bounced, complained ve failed kopyaları, hâlâ bekleyenler için pending ile birlikte, ve opened, clicked ve unsubscribed kişileri sayar; opens ve clicks olay sayılarıdır. series seyrektir ve en eskiden başlar; bir şeyin olduğu her grain (minute, hour ya da day, varsayılan hour) için bir dilim vardır ve UTC'nin doğusundaki offset_minutes ile bölünür. Her kişiyi, başına ilk geldiği anda bir kez sayar, bu yüzden toplamı toplamlara eşittir.
Belirli adreslerle ya da alan adlarıyla sınırlı bir anahtar yalnızca sahip olduğu bir adresten ya da alan adından gönderilmiş toplu gönderimlere ulaşır. list, list_all ve iterate diğerlerini dışarıda bırakır; get, alıcı metotları, stats ve cancel ise onlar için 404 broadcast_not_found fırlatır.
Yanıt: BroadcastResource
get ve cancel her biri bunlardan birini döndürür; send ise bir SentBroadcastResource döndürür: aynı alanlar artı replayed; yanıt, aynı idempotency anahtarıyla yapılmış daha önceki bir çağrının oluşturduğu toplu gönderim olduğunda True olur. list bunlardan bir sayfayı en yeniden eskiye items, hasMore ve nextCursor içeren bir sözlük olarak döndürür; list_all ve iterate her sayfayı gezer. preview, audienceIds, recipients, unsubscribed ve suppressed içeren bir BroadcastPreviewResource döndürür. list_recipients bir BroadcastRecipientResource satırları sayfası, get_recipient bir BroadcastRecipientContentResource, stats ise bir BroadcastStatsResource döndürür.
idstr- Kalıcı tanıtıcı, `brd_` ardından 24 onaltılık karakter.
statusBroadcastStatus- `scheduled`, `queued`, `sending`, `sent`, `cancelled` ya da `failed`. Her birini `BROADCAST_STATUSES` adlandırır.
modeApiKeyMode- Onu oluşturan anahtara göre `live` ya da `test`. Bir test toplu gönderiminin kopyaları gönderildi olarak işaretlenir ve kimseye teslim edilmez.
sourceEmailSource | str- Nereden başlatıldığı: anahtar için `api`, bağlı bir uygulama için `oauth`, uygulama için `composer`, bir asistan için `mcp`.
audienceIdslist[str]- Gönderildiği kitleler, her biri bir kez.
fromstr- Her kopyanın gönderildiği adres.
subjectstr- Yazıldığı gibi konu, birleştirme alanlarıyla birlikte. Konuyu bir şablon sağladığında boştur.
countsBroadcastCounts- `recipients`, `send` sırasında alınan tahmindir. `created` yazılan kopyaları, `skipped` o zamana kadar adresleri engellendiği için atlanan kişileri, `failedToQueue` ise kopyası yazılamayan kişileri sayar. `queued`, `sending`, `sent`, `failed` ve `cancelled` kopyaları her birinin şu anki durumuna göre sayar.
lastErrorstr | None- Toplu gönderimin neden başarısız olduğu ya da yazılamayan en son kopya ve nedeni. Hiçbir şey ters gitmediği sürece `None`.
scheduledAtstr | None- ISO-8601 UTC, gönderimin başlaması gereken zaman. Hemen gönderilen bir toplu gönderim için `None`.
startedAtstr | None- ISO-8601 UTC, gönderimin ilk kişilere ulaştığı zaman.
completedAtstr | None- ISO-8601 UTC, son kişiye ulaşıldığı zaman. Bundan sonra da kopyalar gitmeyi bekliyor olabilir.
cancelledAtstr | None- ISO-8601 UTC, `cancel`'ın onu durdurduğu zaman.
createdAtstr- ISO-8601 UTC, `send`'in çağrıldığı zaman. Liste sırasını belirler.
updatedAtstr- ISO-8601 UTC, gönderim ilerledikçe güncellenir.
Yanıt: BroadcastRecipientResource
list_recipients, list_all_recipients ve iterate_recipients sonuçlarının her satırı. get_recipient'ten gelen BroadcastRecipientContentResource, subject, html ve text ekler.
emailIdstr- Bu kişinin kopyasının `msg_` kimliği. `get_recipient` onu içeriğiyle birlikte okur, `emails.get` ise gönderilmiş bir e-posta olarak okur.
contactIdstr | None- Gittiği kişi ya da kişi o zamandan beri silindiyse `None`.
emailstr- Kopyanın gittiği adres.
namestr | None- Kişi kaydındaki ad.
statusstr- Kopyanın durumu: `queued`, `scheduled`, `sending`, `sent`, `failed` ya da `cancelled`.
sentAtstr | None- ISO-8601 UTC, kopyanın gönderildiği zaman.
deliveredAtstr | None- ISO-8601 UTC, alıcı sunucunun onu kabul ettiği zaman, ilk `email.delivered`.
bouncedAtstr | None- ISO-8601 UTC, geri döndüğü zaman, ilk `email.bounced`.
complainedAtstr | None- ISO-8601 UTC, kişinin onu spam olarak bildirdiği zaman, ilk `email.complained`.
failurestr | None- Başarısız olduysa kopyanın neden başarısız olduğu.
opensint- Kaydedilen açmalar, görsel proxy'lerinin ve tarayıcıların oluşturdukları hariç. İzleme kapalıysa 0.
firstOpenAtstr | None- ISO-8601 UTC, ilk açma.
clicksint- İzlenen bağlantılarda kaydedilen tıklamalar, tarayıcılar hariç.
firstClickAtstr | None- ISO-8601 UTC, ilk tıklama.
unsubscribedAtstr | None- ISO-8601 UTC, bu kişinin gönderimden sonra toplu gönderimin kitlelerinden birinden, bağlantısı üzerinden ya da başka bir yolla abonelikten çıktığı zaman.
Referans
broadcasts.preview()Tam başvurubroadcasts.send()Tam başvurubroadcasts.list()Tam başvurubroadcasts.list_all()Tam başvurubroadcasts.iterate()Tam başvurubroadcasts.get()Tam başvurubroadcasts.list_recipients()Tam başvurubroadcasts.list_all_recipients()Tam başvurubroadcasts.iterate_recipients()Tam başvurubroadcasts.get_recipient()Tam başvurubroadcasts.stats()Tam başvurubroadcasts.analytics()Tam başvurubroadcasts.cancel()Tam başvuru