تخطَّ إلى المستندات
Python

البث

`broadcasts.preview` و`send` و`list` و`list_all` و`iterate` و`get` و`list_recipients` و`list_all_recipients` و`iterate_recipients` و`get_recipient` و`stats` و`analytics` و`cancel`.

كل الدوالّ

broadcasts.py
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']))

البث يرسل رسالة واحدة إلى كل من في جمهور أو أكثر، بنسخة منفصلة لكل شخص. لكل نسخة مستلم واحد بالضبط بلا cc ولا bcc، فلا يرى أحد لمن ذهبت أيضًا، وكل نسخة رسالة عادية لها معرّف msg_ وأحداث وتتبع وخطافات ويب خاصة بها. ويعرضها list_recipients مع ما حدث لكل منها. ولا تُحفظ النسخ في مجلد المرسل، لأن البث هو السجل.

يعود send فورًا مع البث في حالة queued، أو scheduled حين تمرر scheduledAt، ويستمر الإرسال في الخلفية. يحتاج send إلى emails:send وaudiences:read، ويحتاج preview إلى audiences:read، وتحتاج list وlist_all وiterate وget وlist_recipients وlist_all_recipients وiterate_recipients وget_recipient وstats وanalytics إلى emails:read، ويحتاج cancel إلى emails:send.

كل send يحمل Idempotency-Key، مفتاحك عبر idempotency_key= أو مفتاحًا ينشئه SDK، فإعادة المحاولة بعد عطل في الشبكة تجيب بالبث الذي أنشأته المحاولة الأولى بدلًا من الإرسال مرتين. ويمكن تكرار preview وget وcancel وكل عمليات القراءة بأمان وتُعاد محاولتها.

حقول الدمج

تُملأ subject وhtml وtext لكل شخص من جهة اتصاله. {{firstName}} هي الكلمة الأولى من اسم جهة الاتصال، و{{lastName}} بقيته، و{{name}} الاسم كاملًا، و{{email}} العنوان الذي تذهب إليه النسخة، و{{unsubscribeUrl}} الرابط الذي يلغي اشتراكه.

يقبل كل حقل قيمة بديلة بعد شرطة تُستخدم حين لا تكون لجهة الاتصال قيمة له، فيصير {{firstName|there}} "there" لجهة اتصال محفوظة بلا اسم. تُهرَّب القيم في html، ويُترك أي {{…}} آخر كما كُتب تمامًا.

مرّر template بدلًا من html وtext لإرسال قالب محفوظ. تصل إليه القيم الخمس نفسها كخصائص، لكن فقط الخصائص التي يعلنها القالب، فالقالب الذي يعلن firstName يحصل عليها والذي لا يعلنها لا يُرفض بسببها أبدًا. وكل ما في template.props يذهب إلى كل النسخ على حد سواء.

إلغاء الاشتراك

تحمل كل نسخة ترويسات إلغاء الاشتراك بنقرة واحدة التي تتيح لبرنامج البريد عرض زر إلغاء الاشتراك الخاص به، وهو ما يطلبه كبار مزودي صناديق البريد من البريد الجماعي. والمتن html أو text الذي لا يضع {{unsubscribeUrl}} بنفسه يحصل على تذييل من سطر واحد فيه الرابط. أما القالب فيُرسل كما هو تمامًا، فضع {{unsubscribeUrl}} في القالب.

إلغاء الاشتراك يعلّم الشخص كملغٍ للاشتراك في كل جمهور ذهب إليه ذلك البث، ويُظهر ذلك AudienceContactResource.unsubscribedAt في audiences.list_contacts. ويبقى في الجمهور وفي دفتر العناوين، ولا تُمس جماهيره الأخرى، ويظل البريد المرسل إليه رسالةً رسالة يخرج. وإخراجه من الجمهور ثم إضافته من جديد يعيد اشتراكه.

من يُتخطى

يصل البث إلى كل جهة اتصال في واحد على الأقل من audienceIds، مرة واحدة مهما كان عدد ما يضمها منها. ويتخطى جهة الاتصال التي ألغت اشتراكها في كل جمهور من تلك الجماهير تنتمي إليه، والعنوان الموجود في قائمة الحظر بعد ارتداد أو شكوى أو لأن أحدًا أضافه إليها. وجهة الاتصال المضافة إلى أحد الجماهير بعد send وقبل أن يصل إليها الإرسال تُشمل.

يعيد preview الأعداد نفسها دون إرسال: recipients وunsubscribed وsuppressed. وsend الذي لن يصل إلى أحد يرفع 422 no_recipients.

يُقارن الإرسال كله بعدد الرسائل الشهري في الخطة قبل كتابة أي شيء، فالبث الذي لا تغطيه الحصة يرفع 429 send_quota_exceeded ولا يترك شيئًا خلفه. وتُحسب كل نسخة رسالة واحدة.

الحالة والتقدم

يقرأ get قيم counts مباشرة من النسخ، فاستطلعه أثناء إرسال البث. تنتقل status من scheduled أو queued إلى sending وتستقر على sent حين تخرج كل نسخة سُلّمت أو تفشل. وتبقى sending ما دامت نسخ تنتظر، حتى بعد أن يقول completedAt إن آخر شخص قد وُصل إليه. وfailed تعني أن البث كله توقف، ويقول lastError السبب: لم يعد ممكنًا الإرسال من عنوان from، أو توقف القالب عن الحل، أو نفدت الخطة في منتصف الطريق، أو ظل الإرسال نفسه يفشل، أو تعذرت كتابة أي نسخة.

يوقف cancel بثًا حالته scheduled أو queued أو sending. لا يُضاف أحد آخر وتُلغى كل نسخة ما زالت تنتظر، بينما النسخ التي خرجت لا يمكن استرجاعها. وبمجرد أن تخرج كل النسخ يرفع cancel الخطأ 409 broadcast_not_cancellable، وإلغاء بث مُلغى يعيده كما هو.

من وصل إليهم

يعيد list_recipients صفحة واحدة من الأشخاص الذين ذهب إليهم البث، صف لكل نسخة، مرتبة حسب العنوان، في صورة قاموس فيه items وhasMore وnextCursor. ويمر list_all_recipients على كل الصفحات في قائمة واحدة، ويُنتج iterate_recipients نسخة واحدة في كل مرة، ولا يجلب الصفحة التالية إلا حين تطلبها الحلقة. وتتراوح limit من 1 إلى 200 وقيمتها الافتراضية 50، ويُعاد cursor مع filter وq نفسيهما.

filterيحتفظ بـ
pendingنسخ ما زالت في الطابور أو مجدولة أو قيد الإرسال.
sentنسخ خرجت.
deliveredنسخ قبلها الخادم المستقبِل.
openedنسخ فُتحت مرة واحدة على الأقل.
not_openedنسخ أُرسلت ولم تُفتح قط.
clickedنسخ فيها نقرة متتبَّعة واحدة على الأقل.
bouncedنسخ ارتدّت.
complainedنسخ أبلغ عنها الشخص كرسالة مزعجة.
failedنسخ فشلت أو أُلغيت.
unsubscribedأشخاص ألغوا اشتراكهم بعد خروج البث.

تسمّي BROADCAST_RECIPIENT_FILTERS كل مرشّح، ويبحث q في العنوان والاسم دون تمييز لحالة الأحرف. تستبعد الفتحات والنقرات وكلاء الصور وماسحات الروابط، وتبقى 0 حين يخرج البث والتتبع معطّل.

يعيد get_recipient(id, email_id) نسخة واحدة: الصف نفسه، إضافة إلى subject وhtml وtext كما تلقّاها ذلك الشخص تمامًا، مع ملء حقول الدمج ورابط إلغاء الاشتراك الخاص به. وHTML من قبل إضافة تتبع الفتح والنقر. وقيمة email_id ليست نسخة من هذا البث ترفع 404 recipient_not_found، والبث غير المعروف يرفع 404 broadcast_not_found.

يعيد stats المجاميع وسلسلة. تعدّ totals النسخ sent وdelivered وbounced وcomplained وfailed، مع pending للنسخ التي ما زالت تنتظر، والأشخاص الذين opened وclicked وunsubscribed، مع opens وclicks كأعداد للأحداث. وseries متفرقة والأقدم أولًا، فترة واحدة لكل grain (minute أو hour أو day، والافتراضي hour) حدث فيها شيء، مقسّمة بـ offset_minutes شرق UTC. وهي تعدّ كل شخص مرة واحدة، عند أول مرة حدث له ذلك، فيتطابق مجموعها مع المجاميع.

المفتاح المقصور على عناوين أو نطاقات بعينها لا يبلغ إلا البث المرسل من عنوان أو نطاق يملكه. list وlist_all وiterate تترك الباقي، وget ودوال المستلمين وstats وcancel ترفع 404 broadcast_not_found له.

الاستجابة: BroadcastResource

يعيد كل من get وcancel واحدًا من هذه، ويعيد send قيمة SentBroadcastResource، وهي الحقول نفسها مضافًا إليها replayed، التي تكون True حين يكون الجواب هو البث الذي أنشأه استدعاء سابق بمفتاح اللاتكرارية نفسه. ويعيد list صفحة منها، قاموسًا فيه items وhasMore وnextCursor، الأحدث أولًا، ويمر list_all وiterate على كل الصفحات. ويعيد preview قيمة BroadcastPreviewResource فيها audienceIds وrecipients وunsubscribed وsuppressed. ويعيد list_recipients صفحة من صفوف BroadcastRecipientResource، وget_recipient قيمة BroadcastRecipientContentResource، وstats قيمة BroadcastStatsResource.

idstr
المعرّف الدائم، `brd_` يليه 24 حرفًا ست عشريًا.
statusBroadcastStatus
`scheduled` أو `queued` أو `sending` أو `sent` أو `cancelled` أو `failed`. ويسمّي `BROADCAST_STATUSES` كلًّا منها.
modeApiKeyMode
`live` أو `test`، بحسب المفتاح الذي أنشأه. ونسخ البث التجريبي تُعلَّم كمرسلة ولا تُسلَّم إلى أحد.
sourceEmailSource | str
من أين بدأ: `api` لمفتاح، و`oauth` لتطبيق متصل، و`composer` للتطبيق، و`mcp` لمساعد.
audienceIdslist[str]
الجماهير التي أُرسل إليها، كل منها مرة واحدة.
fromstr
العنوان الذي تُرسل منه كل نسخة.
subjectstr
الموضوع كما كُتب، بحقول الدمج كلها. فارغ حين يوفر القالب الموضوع.
countsBroadcastCounts
`recipients` هو التقدير المأخوذ عند `send`. ويحسب `created` النسخ المكتوبة، و`skipped` الأشخاص الذين تُخطّوا لأن عناوينهم كانت محظورة حينها، و`failedToQueue` الأشخاص الذين تعذرت كتابة نسختهم. وتحسب `queued` و`sending` و`sent` و`failed` و`cancelled` النسخ حسب الحالة التي فيها كل منها الآن.
lastErrorstr | None
سبب فشل البث، أو أحدث نسخة تعذرت كتابتها وسبب ذلك. `None` ما دام لم يحدث خطأ.
scheduledAtstr | None
بصيغة ISO-8601 بتوقيت UTC، موعد بدء الإرسال. `None` لبث أُرسل فورًا.
startedAtstr | None
ISO-8601 UTC، وقت وصول الإرسال إلى أول الأشخاص.
completedAtstr | None
ISO-8601 UTC، وقت الوصول إلى آخر شخص. وقد تظل نسخ تنتظر الخروج بعده.
cancelledAtstr | None
ISO-8601 UTC، وقت إيقاف `cancel` له.
createdAtstr
ISO-8601 UTC، وقت استدعاء `send`. ويحدد ترتيب القائمة.
updatedAtstr
ISO-8601 UTC، يُحدَّث مع تقدم الإرسال.

الاستجابة: BroadcastRecipientResource

كل صف من list_recipients وlist_all_recipients وiterate_recipients. ويضيف BroadcastRecipientContentResource، من get_recipient، الحقول subject وhtml وtext.

emailIdstr
معرّف `msg_` لنسخة هذا الشخص. يقرؤها `get_recipient` مع محتواها، ويقرؤها `emails.get` كرسالة مرسلة.
contactIdstr | None
جهة الاتصال التي ذهبت إليها، أو `None` حين تكون جهة الاتصال قد حُذفت منذ ذلك الحين.
emailstr
العنوان الذي ذهبت إليه النسخة.
namestr | None
الاسم المسجّل في جهة الاتصال.
statusstr
حالة النسخة: `queued` أو `scheduled` أو `sending` أو `sent` أو `failed` أو `cancelled`.
sentAtstr | None
ISO-8601 بتوقيت UTC، وقت خروج النسخة.
deliveredAtstr | None
ISO-8601 بتوقيت UTC، وقت قبول الخادم المستقبِل لها، أول `email.delivered`.
bouncedAtstr | None
ISO-8601 بتوقيت UTC، وقت ارتدادها، أول `email.bounced`.
complainedAtstr | None
ISO-8601 بتوقيت UTC، وقت إبلاغ الشخص عنها كرسالة مزعجة، أول `email.complained`.
failurestr | None
سبب فشل النسخة، إن فشلت.
opensint
الفتحات المسجّلة، دون تلك التي تحدثها وكلاء الصور والماسحات. 0 حين كان التتبع معطّلًا.
firstOpenAtstr | None
ISO-8601 بتوقيت UTC، أول فتح.
clicksint
النقرات المسجّلة على الروابط المتتبَّعة، دون الماسحات.
firstClickAtstr | None
ISO-8601 بتوقيت UTC، أول نقرة.
unsubscribedAtstr | None
ISO-8601 بتوقيت UTC، وقت إلغاء هذا الشخص اشتراكه من أحد جماهير البث بعد خروجه، عبر رابطه أو بطريقة أخرى.

المرجع