فهرست و دریافت
`emails.list`، `emails.list_all`، `emails.iterate`، `emails.get` و `emails.list_events`.
emails.list
filters = {status: ["queued", "scheduled"], from: "[email protected]"} first = client.emails.list(**filters, limit: 50)second = client.emails.list(**filters, limit: 50, cursor: first.next_cursor) if first.next_cursor p first.items.size, second&.items&.sizeهر صفحه یک OpenEmail::Page با items، has_more? و next_cursor است. next_cursor را با همان فیلترها بهعنوان cursor: پس بدهید تا صفحهٔ بعد از آن را بگیرید.
emails.iterate و emails.list_all
client.emails.iterate(status: "failed") do |email| warn "#{email[:id]} #{email[:lastError]}"end failures = client.emails.list_all(status: "failed", from: "[email protected]")puts failures.sizeهر دو next_cursor را بهجای شما دنبال میکنند. iterate صفحه را فقط وقتی میگیرد که پیمایش به آن برسد، پس break در بلاک، یا first یا find روی Enumeratorی که بدون بلاک برمیگرداند، درخواستها را متوقف میکند، در حالی که list_all پیش از برگرداندن یک Array همهٔ صفحهها را میپیماید، پس فیلتری به آن بدهید که تمام شود. در هر دو حالت صفحهبندی keyset است، پس پیامی که وسط پیمایش برسد نمیتواند باعث شود ردیفی از قلم بیفتد، آنطور که با offset میافتاد.
emails.get و emails.list_events
email = client.emails.get("msg_3f9a1c07d2b84e6a9c5b1f20")puts email[:status]p email[:recipients] events = client.emails.list_all_events("msg_3f9a1c07d2b84e6a9c5b1f20")events.each { |event| puts "#{event[:type]} #{event[:createdAt]}" }get تنها فراخوانیای است که recipients را برمیگرداند، یک Hash به ازای هر نشانی با status، error و deliveredAt خودش. فهرستی از پنجاه پیام که هرکدام گیرندگانش را حمل کند، صفحهای از گزارشی است که کسی نخواسته.
list_events ردِ رویدادهای یک ارسال را میخواند، قدیمیترین در ابتدا: email.accepted، email.queued، email.sent، email.delivered، email.bounced، email.opened و بقیه، هرکدام با یک Hash به نام data که شکلش به type آن بستگی دارد. list_all_events و iterate_events کل این رد را برایتان میپیمایند. وبهوکها زیرمجموعهای از همین رویدادها را در لحظهٔ رخ دادن تحویل میدهند، پس وقتی وبهوکی از دست رفته، اینجا را نگاه کنید.
پارامترها
statusString or Array<String>- یک وضعیت یا چند وضعیت (`queued`، `scheduled`، `sending`، `sent`، `partial`، `bounced`، `cancelled`، `failed`)، که با هرکدام از آنها که داده شود مطابقت میکند. `bounced` یعنی پیام برای همهٔ گیرندگانش برگشت خورده، در حالی که پیامی که برای بعضی برگشت خورده و به بقیه رسیده `partial` است. gem یک Array را بهصورت یک مقدار جداشده با کاما میفرستد چون سرور روی کاما جدا میکند، و مقداری بیرون از این مجموعه یک 422 است که مقدار ناشناخته را نام میبرد.
broadcast_idString- فقط نسخههای یک ارسال گروهی، یک شناسهٔ `brd_` از `broadcasts.send`. هر کسی که ارسال گروهی به او برسد پیام خودش را میگیرد، پس این فهرست نشان میدهد برای چه کسانی رفته و چه بر سر هر نسخه آمده. `broadcasts.list_recipients` همین افراد را همراه با باز کردنها، کلیکها و لغو اشتراکهایشان فهرست میکند.
fromString- تطبیق دقیق روی نشانی فرستنده، همانطور که ثبت شده، یعنی `addr@host` خام و با حروف کوچک. ردیف با حذف هر نام نمایشی نوشته میشود، پس angle-addrی مانند `Acme <[email protected]>` با هیچچیز مطابقت نمیکند. مقدار شما پیش از مقایسه به حروف کوچک تبدیل میشود، و مقایسه برابری است نه پیشوند یا تطبیق دامنه.
scheduled_fromTime, DateTime or String- فقط پیامهایی که برای این لحظه یا پس از آن زمانبندی شدهاند. همراه با `scheduled_to:` و `status: ["scheduled", "queued"]` آنچه را در یک بازه منتظر رفتن است فهرست میکند، همانطور که تقویم برنامه انجام میدهد. پیامی که `scheduledAt` ندارد کنار گذاشته میشود. یک Time، یک DateTime یا یک لحظهٔ ISO 8601 همراه با offset آن بدهید: Date در Ruby بهصورت تاریخ خالی فرستاده میشود، که این دو فیلتر ردش میکنند.
scheduled_toTime, DateTime or String- فقط پیامهایی که برای این لحظه یا پیش از آن زمانبندی شدهاند. `scheduled_from:` پس از `scheduled_to:` یک 422 `invalid_parameter` است.
limitInteger- ردیفهای این صفحه، 1 تا 100 با پیشفرض 25. مقداری بیرون از این بازه بهجای محدود شدن، با 422 رد میشود. روی `list_all` و `iterate` اندازهٔ هر صفحهای است که میگیرند.
cursorString- شناسهٔ یک پیام (`msg_…`) که صفحهبندی از آن آغاز شود. keyset است نه offset: ردیفها اکیداً قدیمیتر از `createdAt` آن پیام برمیگردند، پس ارسالهایی که وسط صفحه میرسند نمیتوانند ردیفی را از جلوی شما رد کنند. شناسهای که در این فضای کاری هیچ پیامی را نام نبرد یک 400 `invalid_cursor` است.
api_keyString- بهجای کلید کلاینت با این کلید فهرست میگیرد.
کلیدی که به برخی نشانیها محدود شده فقط پیامهایی را میخواند که از نشانیهای تحت پوشش آن فرستاده شدهاند، و صفحه پس از همین فیلتر بریده میشود، پس هر صفحه بهجز آخرین همچنان limit ردیف دارد. from:ی که کلید پوشش نمیدهد بهجای 403 یک صفحهٔ آخرِ خالی برمیگرداند.
پاسخ: OpenEmail::Page
itemsArray<Hash>- یک صفحه از پیامها، تازهترین اول بر اساس `createdAt`، که از پاکت `data` مربوط به API بیرون کشیده شده است. ردیفهای فهرست هرگز تفکیکِ بهازاینشانیِ `recipients` را حمل نمیکنند. آن روی `get` است.
has_more?Boolean- اینکه آیا فراتر از این صفحه ردیفهای دیگری با فیلتر میخوانند یا نه. پاسخش با گرفتن یکی بیش از `limit` به دست میآید، نه با کوئری شمارش دوم.
next_cursorString or nil- شناسهای که باید بهعنوان `cursor:` پس بدهید، و روی آخرین صفحه nil است. `iterate` و `list_all` وقتی این nil باشد یا `has_more?` برابر false باشد میایستند، چون صفحهای که ادعای ادامه کند اما هیچ cursorی را نام نبرد تا ابد حلقه میزد.
هر مورد
objectString- روی یک ردیف از این فهرست همیشه `email`.
idString- شناسهٔ خودِ این API، `msg_…`. همان چیزی است که هر فراخوانی دیگر emails میگیرد، و همان چیزی که cursor نام میبرد.
statusString- پیام کجای زندگیاش است. `partial` وضعیتی از آنِ خودش است نه گونهای از failed: بعضی گیرندگان آن را دارند و نمیشود پس گرفت، پس تلاش دوباره اشتباه است. و `bounced` یعنی پیام پس از رفتن از همهی گیرندگان برگشت خورد، پس دست هیچکس نیست، و هر گیرنده در `get` دلیلش را میگوید.
modeString- `live` یا `test`، برگرفته از کلیدی که آن را فرستاده. ارسال در حالت test همینجا ثبت میشود و هرگز منتقل نمیشود.
fromString- نشانیای که ارسال زیر آن مجاز شمرده شد، که خام و با حروف کوچک ذخیره میشود، پس نام نمایشیای که روی `from` داده شده باشد باز هم روی سیم بیرون میرود اما اینجا نگه داشته نمیشود. یک String ساده است نه یک Hash، چون این همان هویتی است که مجاز شمرده شد: نشانیای بیرون از اسکوپ ارسالِ یک کلید، که نه روی دامنهای است که آن کلید دارد و نه روی آن نام برده شده، با یک 403 رد میشود و هرگز بیسروصدا با نشانی مجاز عوض نمیشود.
subjectString or nil- موضوع همانطور که ذخیره شده. روی پیامی که بدون موضوع ثبت شده nil است.
messageIdString or nil- همان Message-ID مربوط به RFC 5322، نه شناسهٔ ما. تا وقتی MIME وجود نداشته باشد nil است، و سرویس ارسال در مسیر خروج آن را بازنویسی میکند، پس bounce یا DSN بعدی شناسهٔ دیگری حمل میکند و بهجای آن با `id` تطبیق داده میشود.
threadIdString or nil- رشتهای که این پیام به آن تعلق دارد، در جایی که داده یا تخصیص داده شده باشد. در غیر این صورت nil.
transportString or nil- بایتها چگونه رفتند. تا پیش از ارسال nil است. رکوردهای ذخیرهشده ممکن است هنوز لایههای انتقالی را نام ببرند که دیگر استفاده نمیشوند، پس با مقداری که نمیشناسید بهعنوان اطلاعات رفتار کنید نه خطا.
attemptsInteger- پیام چند بار تلاش برای ارسال داشته است؛ پیش از نخستین تلاش 0.
lastErrorString or nil- تازهترین خطای ارسال، نوشتهشده برای آدم. تا وقتی چیزی شکست نخورده nil است.
scheduledAtString or nil- زمانی که پیام باید برود، به شکل یک لحظهٔ ISO 8601. فقط روی ارسال فوریِ بدون پنجرهٔ لغو nil است: پنجره چیزی جز تأخیری کوتاه نیست، پس `cancellableForSeconds` هم این را پر میکند، روی ردیفی که `status` آن `queued` است نه `scheduled`.
cancellableUntilString or nil- لحظهای که پیام باید برود، که روی هر ارسال بهتعویقافتاده همان مقدار `scheduledAt` را دارد و روی ارسالی که به تعویق نیفتاده nil است. این زمانی است برای نمایش، نه آزمونی که سرور انجام میدهد: `cancel` روی `status` شاخه میزند و پیام را فقط تا وقتی هنوز `queued` یا `scheduled` است متوقف میکند.
sentAtString or nil- زمانی که رفت. تا کامل شدن ارسال nil است، و به همین دلیل باید روی `status` شاخه بزنید نه روی این.
tagsHash- برچسبهایی که هنگام ارسال داده شدهاند، همانطور بازگردانده میشوند و هرگز تفسیر نمیشوند. همیشه یک Hash، خالی وقتی چیزی تنظیم نشده و هرگز nil، و فقط بازگردانده میشوند: این فهرست بر اساس `status`، `from`، `broadcast_id` و بازهٔ زمانبندی فیلتر میکند، پس برچسب چیزی است که از روی پیام خوانده میشود، نه راهی برای یافتن آن.
broadcastIdString or nil- ارسال گروهیِ `brd_` که این پیام نسخهای از آن است، یا nil برای پیامی که تنها فرستاده شده.
sourceString- کدام سطح درخواست ارسال را داده است: `composer`، `api`، `mcp`، `ai` یا `queue`. `api` همین کلاینت است.
createdAtString- زمانی که رکورد ارسال نوشته شد، که پیش از ارسال واقعی است. فهرست بر اساس همین فیلد مرتب میشود و cursor با همین فیلد مقایسه میشود.
trackingHash- خلاصهٔ تعامل، که فقط روی ردیفی حاضر است که پیامش ردیابی شده و در غیر این صورت غایب است. پاسخِ «آیا این ردیابی شد؟» همین غیاب است، جایی که `openCount` برابر 0 به معنای «کسی بازش نکرد» خوانده میشد.
translationHash- هرگز روی یک ردیف فهرست حاضر نیست: رکورد ترجمه در درخواست ذخیرهشده زندگی میکند، که فهرست عمداً آن را نمیگیرد. غیابش اینجا هیچ نمیگوید که پیام ترجمه شده یا نه. از `get` بپرسید.
ردیابی یک مورد
opensBoolean- اینکه آیا این پیام با یک pixel بیرون رفت یا نه. آنچه بر همین پیام اعمال شد، نه آنچه تنظیم حساب اکنون میگوید.
clicksBoolean- اینکه آیا پیوندهای این پیام بازنویسی شدند یا نه. وقتی بدنه هیچ پیوندی برای بازنویسی نداشته false است، چون آنگاه چیزی تغییر نکرده.
openedBoolean- اینکه آیا هیچ باز شدنِ شمردهشدهای ثبت شده است یا نه، که از بالاتر بودن `openCount` از 0 مشتق میشود.
clickedBoolean- اینکه آیا هیچ کلیکِ شمردهشدهای ثبت شده است یا نه، که از بالاتر بودن `clickCount` از 0 مشتق میشود.
openCountInteger- باز شدنهایی که گمان میرود کار یک آدم بودهاند، جمعزده روی هر نسخه از پیام. اسکنرها و پروکسیهای حریم خصوصی ثبت میشوند اما کنار گذاشته میشوند، و واکشیهای تکراری در سی ثانیه در یکی جمع میشوند.
clickCountInteger- کلیکهای شمردهشده، جمعزده روی نسخهها. به ازای هر پیوند یکتاسازی میشود نه به ازای هر پیام، چون دنبالکردن دو پیوند با چند ثانیه فاصله دو کنش است نه یک تکرار.
firstOpenAtString or nil- نخستین باز شدنِ شمردهشده در میان نسخهها، و تا وقتی هیچکدام نباشد nil. بازدیدهای ماشینی هرگز آن را جابهجا نمیکنند.