Broadcasts
`broadcasts.preview`, `send`, `list`, `list_all`, `iterate`, `get`, `list_recipients`, `list_all_recipients`, `iterate_recipients`, `get_recipient`, `stats`, `analytics` und `cancel`.
Jede Methode
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']))Ein Broadcast sendet eine Nachricht an alle in einer oder mehreren Audiences, als eigene Kopie für jede Person. Jede Kopie hat genau einen Empfänger und kein Cc oder Bcc, sodass niemand sieht, an wen sie sonst ging, und jede Kopie ist eine gewöhnliche E-Mail mit eigener msg_-ID, eigenen Events, Tracking und Webhooks. list_recipients listet sie mit dem auf, was mit jeder geschah. Die Kopien werden nicht im Ordner „Gesendet“ abgelegt, weil der Broadcast der Nachweis ist.
send kehrt sofort zurück, mit dem Broadcast als queued, oder als scheduled, wenn Sie scheduledAt übergeben, und der Versand läuft im Hintergrund. send braucht emails:send und audiences:read, preview braucht audiences:read, list, list_all, iterate, get, list_recipients, list_all_recipients, iterate_recipients, get_recipient, stats und analytics brauchen emails:read, und cancel braucht emails:send.
Jedes send trägt einen Idempotency-Key, Ihren über idempotency_key= oder einen, den das SDK erzeugt, sodass eine Wiederholung nach einem Netzwerkfehler mit dem Broadcast antwortet, den der erste Versuch erstellt hat, statt doppelt zu senden. preview, get, cancel und jeder Lesezugriff lassen sich gefahrlos wiederholen und werden wiederholt.
Platzhalter
subject, html und text werden für jede Person aus ihrem Kontakt ausgefüllt. {{firstName}} ist das erste Wort des Kontaktnamens, {{lastName}} der Rest davon, {{name}} der ganze Name, {{email}} die Adresse, an die die Kopie geht, und {{unsubscribeUrl}} der Link, der die Person abmeldet.
Jedes Feld nimmt nach einem Strich einen Ersatzwert, der verwendet wird, wenn der Kontakt dafür keinen Wert hat, sodass {{firstName|there}} für einen ohne Namen gespeicherten Kontakt zu „there“ wird. Werte werden in html maskiert, und jedes andere {{…}} bleibt genau so stehen, wie es geschrieben ist.
Übergeben Sie template statt html und text, um eine gespeicherte Vorlage zu senden. Dieselben fünf Werte erreichen sie als Props, aber nur die Props, die die Vorlage deklariert, sodass eine Vorlage, die firstName deklariert, ihn bekommt, und eine, die es nicht tut, nie deswegen abgelehnt wird. Alles in template.props geht an jede Kopie gleich.
Abmelden
Jede Kopie trägt die Ein-Klick-Abmelde-Header, mit denen ein Mailprogramm seine eigene Abmelde-Schaltfläche zeigen kann, was die großen Postfachanbieter von Massenmails verlangen. Ein html- oder text-Inhalt, der {{unsubscribeUrl}} nicht selbst platziert, bekommt eine einzeilige Fußzeile mit dem Link. Eine Vorlage wird genau so gesendet, wie sie ist, setzen Sie {{unsubscribeUrl}} also in die Vorlage.
Abmelden markiert die Person in jeder Audience, an die dieser Broadcast ging, als abgemeldet, und AudienceContactResource.unsubscribedAt zeigt es bei audiences.list_contacts. Sie bleibt in der Audience und im Adressbuch, ihre anderen Audiences bleiben unberührt, und Mail, die einzeln an sie gesendet wird, geht weiterhin hinaus. Wenn Sie sie aus der Audience nehmen und wieder hinzufügen, ist sie neu angemeldet.
Wer übersprungen wird
Ein Broadcast erreicht jeden Kontakt in mindestens einer der audienceIds, einmal, egal in wie vielen er ist. Er überspringt einen Kontakt, der sich von jeder dieser Audiences abgemeldet hat, in der er ist, und eine Adresse auf der Sperrliste nach einem Bounce oder einer Beschwerde oder weil jemand sie hinzugefügt hat. Ein Kontakt, der nach send, aber bevor der Versand ihn erreicht, zu einer der Audiences hinzukommt, ist dabei.
preview liefert dieselben Zahlen, ohne zu senden: recipients, unsubscribed und suppressed. Ein send, das niemanden erreichen würde, löst 422 no_recipients aus.
Die ganze Sendung wird mit den monatlichen Sendungen des Plans abgeglichen, bevor irgendetwas geschrieben wird, sodass ein Broadcast, den das Kontingent nicht abdecken kann, 429 send_quota_exceeded auslöst und nichts hinterlässt. Jede Kopie zählt als eine Sendung.
Status und Fortschritt
get liest counts live aus den Kopien, fragen Sie es also während des Versands ab. status geht von scheduled oder queued zu sending und bleibt bei sent stehen, sobald jede übergebene Kopie hinausgegangen oder fehlgeschlagen ist. Er bleibt sending, solange noch Kopien warten, auch wenn completedAt schon sagt, dass die letzte Person erreicht wurde. failed heißt, dass der ganze Broadcast gestoppt ist, und lastError sagt warum: Von der from-Adresse kann nicht mehr gesendet werden, die Vorlage lässt sich nicht mehr auflösen, der Plan ist unterwegs ausgeschöpft, der Versand selbst ist wiederholt fehlgeschlagen, oder keine einzige Kopie ließ sich schreiben.
cancel stoppt einen Broadcast, der scheduled, queued oder sending ist. Niemand wird mehr hinzugefügt, und jede noch wartende Kopie wird abgebrochen, während hinausgegangene Kopien sich nicht zurückholen lassen. Sobald jede Kopie hinausgegangen ist, löst cancel 409 broadcast_not_cancellable aus, und das Abbrechen eines abgebrochenen Broadcasts gibt ihn so zurück, wie er ist.
Wen er erreicht hat
list_recipients gibt eine Seite der Personen zurück, an die ein Broadcast ging, eine Zeile pro Kopie, nach Adresse sortiert, als dict mit items, hasMore und nextCursor. list_all_recipients durchläuft alle Seiten und sammelt sie in einer einzigen Liste, und iterate_recipients liefert eine Kopie nach der anderen und holt die nächste Seite erst, wenn die Schleife danach fragt. limit reicht von 1 bis 200 mit Standardwert 50, und ein cursor geht mit demselben filter und q zurück.
| filter | Behält |
|---|---|
| pending | Kopien, die noch in der Warteschlange, geplant oder im Versand sind. |
| sent | Kopien, die hinausgegangen sind. |
| delivered | Kopien, die der empfangende Server angenommen hat. |
| opened | Kopien, die mindestens einmal geöffnet wurden. |
| not_opened | Kopien, die gesendet und nie geöffnet wurden. |
| clicked | Kopien mit mindestens einem getrackten Klick. |
| bounced | Kopien, die gebounct sind. |
| complained | Kopien, die die Person als Spam gemeldet hat. |
| failed | Kopien, die fehlgeschlagen sind oder abgebrochen wurden. |
| unsubscribed | Personen, die sich nach dem Versand des Broadcasts abgemeldet haben. |
BROADCAST_RECIPIENT_FILTERS benennt jeden Filter, und q durchsucht Adresse und Name, ohne Groß- und Kleinschreibung zu beachten. Öffnungen und Klicks lassen Bild-Proxys und Link-Scanner außen vor und bleiben 0, wenn der Broadcast mit ausgeschaltetem Tracking hinausging.
get_recipient(id, email_id) gibt eine Kopie zurück: dieselbe Zeile, dazu subject, html und text genau so, wie diese Person sie erhalten hat, mit ausgefüllten Platzhaltern und ihrem eigenen Abmeldelink. Das HTML stammt aus der Zeit, bevor das Öffnungs- und Klick-Tracking hinzugefügt wurde. Eine email_id, die keine Kopie dieses Broadcasts ist, löst 404 recipient_not_found aus, und ein unbekannter Broadcast löst 404 broadcast_not_found aus.
stats gibt die Summen und eine Reihe zurück. totals zählt Kopien, die sent, delivered, bounced, complained und failed sind, mit pending für die noch wartenden, und Personen, die opened, clicked und unsubscribed sind, mit opens und clicks als Ereigniszahlen. series ist dünn besetzt und beginnt mit dem ältesten Eintrag, ein Intervall pro grain (minute, hour oder day, Standardwert hour), in dem etwas geschah, aufgeteilt in offset_minutes östlich von UTC. Die Reihe zählt jede Person einmal, beim ersten Mal, als es ihr passierte, und ergibt deshalb in der Summe die Gesamtwerte.
Ein auf bestimmte Adressen oder Domains beschränkter Schlüssel erreicht nur die Broadcasts, die von einer Adresse oder Domain gesendet wurden, die er hält. list, list_all und iterate lassen die anderen weg, und get, die Empfänger-Methoden, stats und cancel lösen für sie 404 broadcast_not_found aus.
Antwort: BroadcastResource
get und cancel geben jeweils eine davon zurück, und send gibt eine SentBroadcastResource zurück, dieselben Felder plus replayed, das True ist, wenn die Antwort der Broadcast ist, den ein früherer Aufruf mit demselben Idempotency-Key angelegt hat. list gibt eine Seite davon zurück, ein dict mit items, hasMore und nextCursor, neueste zuerst, und list_all und iterate durchlaufen alle Seiten. preview gibt eine BroadcastPreviewResource mit audienceIds, recipients, unsubscribed und suppressed zurück. list_recipients gibt eine Seite von BroadcastRecipientResource-Zeilen zurück, get_recipient eine BroadcastRecipientContentResource und stats eine BroadcastStatsResource.
idstr- Der dauerhafte Bezeichner, `brd_` gefolgt von 24 Hexzeichen.
statusBroadcastStatus- `scheduled`, `queued`, `sending`, `sent`, `cancelled` oder `failed`. `BROADCAST_STATUSES` benennt jeden davon.
modeApiKeyMode- `live` oder `test`, vom Schlüssel, der ihn erstellt hat. Die Kopien eines Test-Broadcasts werden als gesendet markiert und niemandem zugestellt.
sourceEmailSource | str- Wo er gestartet wurde: `api` für einen Schlüssel, `oauth` für eine verbundene App, `composer` für die App, `mcp` für einen Assistenten.
audienceIdslist[str]- Die Audiences, an die er ging, jede einmal.
fromstr- Die Adresse, von der jede Kopie gesendet wird.
subjectstr- Der Betreff wie geschrieben, samt Platzhaltern. Leer, wenn eine Vorlage den Betreff liefert.
countsBroadcastCounts- `recipients` ist die bei `send` erstellte Schätzung. `created` zählt die geschriebenen Kopien, `skipped` die Personen, die übergangen wurden, weil ihre Adresse bis dahin gesperrt war, und `failedToQueue` die Personen, deren Kopie nicht geschrieben werden konnte. `queued`, `sending`, `sent`, `failed` und `cancelled` zählen die Kopien nach dem Zustand, in dem jede gerade ist.
lastErrorstr | None- Warum der Broadcast fehlgeschlagen ist, oder die jüngste Kopie, die nicht geschrieben werden konnte, und warum. `None`, solange nichts schiefgegangen ist.
scheduledAtstr | None- ISO-8601 UTC, wann der Versand beginnen soll. `None` bei einem sofort gesendeten Broadcast.
startedAtstr | None- ISO-8601 UTC, wann der Versand die ersten Personen erreicht hat.
completedAtstr | None- ISO-8601 UTC, wann die letzte Person erreicht wurde. Danach können noch Kopien auf den Versand warten.
cancelledAtstr | None- ISO-8601 UTC, wann `cancel` ihn gestoppt hat.
createdAtstr- ISO-8601 UTC, wann `send` aufgerufen wurde. Bestimmt die Reihenfolge der Liste.
updatedAtstr- ISO-8601 UTC, fortgeschrieben, während der Versand vorankommt.
Antwort: BroadcastRecipientResource
Jede Zeile von list_recipients, list_all_recipients und iterate_recipients. BroadcastRecipientContentResource aus get_recipient ergänzt subject, html und text.
emailIdstr- Die `msg_`-ID der Kopie dieser Person. `get_recipient` liest sie mit ihrem Inhalt, und `emails.get` liest sie als gesendete E-Mail.
contactIdstr | None- Der Kontakt, an den sie ging, oder `None`, wenn der Kontakt inzwischen gelöscht wurde.
emailstr- Die Adresse, an die die Kopie ging.
namestr | None- Der Name des Kontakts.
statusstr- Der Zustand der Kopie: `queued`, `scheduled`, `sending`, `sent`, `failed` oder `cancelled`.
sentAtstr | None- ISO-8601 UTC, wann die Kopie hinausging.
deliveredAtstr | None- ISO-8601 UTC, wann der empfangende Server sie angenommen hat, das erste `email.delivered`.
bouncedAtstr | None- ISO-8601 UTC, wann sie gebounct ist, das erste `email.bounced`.
complainedAtstr | None- ISO-8601 UTC, wann die Person sie als Spam gemeldet hat, das erste `email.complained`.
failurestr | None- Warum die Kopie fehlgeschlagen ist, falls sie es ist.
opensint- Erfasste Öffnungen, ohne die von Bild-Proxys und Scannern. 0, wenn das Tracking aus war.
firstOpenAtstr | None- ISO-8601 UTC, die erste Öffnung.
clicksint- Erfasste Klicks auf getrackte Links, ohne Scanner.
firstClickAtstr | None- ISO-8601 UTC, der erste Klick.
unsubscribedAtstr | None- ISO-8601 UTC, wann sich diese Person nach dem Versand von einer der Audiences des Broadcasts abgemeldet hat, über seinen Link oder auf anderem Weg.
Referenz
broadcasts.preview()Vollständige Referenzbroadcasts.send()Vollständige Referenzbroadcasts.list()Vollständige Referenzbroadcasts.list_all()Vollständige Referenzbroadcasts.iterate()Vollständige Referenzbroadcasts.get()Vollständige Referenzbroadcasts.list_recipients()Vollständige Referenzbroadcasts.list_all_recipients()Vollständige Referenzbroadcasts.iterate_recipients()Vollständige Referenzbroadcasts.get_recipient()Vollständige Referenzbroadcasts.stats()Vollständige Referenzbroadcasts.analytics()Vollständige Referenzbroadcasts.cancel()Vollständige Referenz