مستنداتمرجع
خطاها و سقفها
قالب پاسخ خطا، کدهای ماشینخوان، و سقفهای اندازه، نرخ و مصرف.
آخرین ویرایش: ۲۱ آبان ۱۴۰۵
قالب خطا
خطاهای ارسال یک شیء با message (متن انگلیسی برای انسان) و code (مقدار ثابت برای برنامه) هستند. به code تکیه کنید، نه به message؛ متن ممکن است عوض شود.
{
"message": "The From domain is not a verified domain of this account.",
"code": "sender_not_verified"
}خطای اعتبارسنجی فیلدها (مثلاً نشانی نامعتبر) قالب استاندارد لاراول را دارد: message و یک شیء errors که برای هر فیلد پیام میآورد، با کد 422.
کدهای وضعیت
| کد HTTP | معنا | تلاش دوباره؟ |
|---|---|---|
202 | پیام در صف قرار گرفت | — |
200 | پاسخ تکراری با Idempotency-Key | — |
401 | کلید نامعتبر، لغوشده، منقضی یا از آدرس غیرمجاز | نه |
403 | کلید اجازهی این کار را ندارد | نه |
404 | قالب پیدا نشد | نه |
413 | پیام یا پیوست بزرگ است | نه، کوچکش کنید |
422 | درخواست نامعتبر | نه، اصلاحش کنید |
429 | نرخ یا سهمیه | بعداً |
503 | سرویس موقتاً نمیپذیرد | بعداً، با Retry-After |
کدهای خطا
code | کد HTTP | توضیح |
|---|---|---|
sender_not_verified | 422 | دامنهی from تأیید نشده است |
key_not_allowed_for_domain | 403 | این کلید اجازهی ارسال از آن دامنه را ندارد |
no_recipients | 422 | پیام گیرنده ندارد |
too_many_recipients | 422 | بیش از ۵۰ گیرنده |
template_not_found | 404 | قالب متعلق به این حساب نیست |
message_too_large | 413 | پیام از اندازهی مجاز بزرگتر است |
attachment_too_large | 413 | مجموع پیوستها بزرگ است |
attachment_invalid | 422 | پیوست base64 معتبر نیست |
attachment_blocked | 422 | نوع فایل پیوست مجاز نیست |
batch_too_large | 413 | بدنه ضربدر گیرندهها بزرگ است؛ در گروههای کوچکتر بفرستید |
quota_exceeded | 429 | سهمیهی ماهانه یا روزانه تمام شده است |
sending_under_review | 503 | ارسال حساب برای بررسی کوتاه نگه داشته شده |
bad_idempotency_key | 422 | قالب Idempotency-Key درست نیست |
idempotency_key_reused | 422 | همان کلید با بدنهی دیگر آمده |
سقفها
| مورد | سقف |
|---|---|
| گیرنده در هر پیام | ۵۰ (To و Cc و Bcc با هم) |
عضو recipients در ارسال دستهای | ۵۰ |
| اندازهی پیام در API | ۱ مگابایت (بدون پیوست) |
| اندازهی پیام در SMTP | ۱۰ مگابایت |
| پیوست | ۱۰ عدد، مجموعاً ۱۰ مگابایت |
| ارسال دستهای | بدنه × گیرنده ≤ ۱۰ مگابایت |
| موضوع | ۲۵۵ نویسه |
| برچسب | ۱۰ عدد، هر کدام ≤ ۳۲ نویسه |
metadata و variables | ۱۰ و ۲۰ مورد |
| هدر دلخواه | ۲۰ مورد |
| درخواست در دقیقه | ۶۰۰ برای هر کلید |
نرخ درخواست
هر کلید در دقیقه ۶۰۰ درخواست دارد. بعد از آن پاسخ 429 با هدر Retry-After میگیرید. برای حجم بالا از ارسال دستهای استفاده کنید؛ هر درخواست تا ۵۰ گیرنده دارد.
سهمیه
سقف ماهانه و (در پلن رایگان) روزانه به پلن شما بستگی دارد. وقتی تمام شود، ارسال با quota_exceeded و کد 429 رد میشود و ایمیل بیصدا گم نمیشود. میتوانید ایمیل اضافه بخرید یا پلن را عوض کنید. سهمیه اول هر ماه شمسی از نو شروع میشود.
هر گیرنده یک واحد حساب میشود، یعنی یک ایمیل با سه گیرنده سه واحد است. تلاش دوبارهی خود سندک برای تحویل، دوباره حساب نمیشود. گیرندهی داخل فهرست حذف حساب نمیشود.
Retry-After
برای 429 و 503، اگر هدر Retry-After بود، همان قدر صبر کنید. بدون هدر، با فاصلهی افزایشی (۱ ثانیه، ۲، ۴، …) و Idempotency-Key دوباره بفرستید.
async function sendWithRetry(body, key, tries = 5) {
for (let attempt = 0; attempt < tries; attempt++) {
const response = await fetch('https://api.sendak.ir/v1/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SENDAK_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': key,
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(10_000),
})
if (response.ok) return response.json()
if (response.status !== 429 && response.status < 500) throw new Error(await response.text())
const wait = Number(response.headers.get('Retry-After')) || 2 ** attempt
await new Promise((resolve) => setTimeout(resolve, wait * 1000))
}
throw new Error('Sendak did not accept the message')
}