MailLandDocs
ارسال ایمیل

ارسال دسته‌ای

ارسال ایمیل به چندین گیرنده در یک فراخوانی API

ارسال دسته‌ای فقط با اعتبارنامه‌های جریان بازاریابی در دسترس است. اعتبارنامه‌های تراکنشی خطای 400 BATCH_NOT_ALLOWED_FOR_TRANSACTIONAL برمی‌گردانند. این امر از سوءاستفاده از جریان‌های تراکنشی برای ارسال انبوه ایمیل جلوگیری می‌کند.

ارسال یک دسته

POST https://api.mail.land/v1/transactional/send-batch
ارسال ایمیل دسته‌ای
curl -X POST https://api.mail.land/v1/transactional/send-batch \
  -H "X-API-Key: ml_pem_Ab3Kx9mN2pQ7rT4wL8yD..." \
  -H "Content-Type: application/json" \
  -d '{
    "from": {
      "email": "[email protected]",
      "name": "Your Company"
    },
    "recipients": [
      {
        "email": "[email protected]",
        "name": "Alice",
        "variables": { "firstName": "Alice", "plan": "Pro" }
      },
      {
        "email": "[email protected]",
        "name": "Bob",
        "variables": { "firstName": "Bob", "plan": "Starter" }
      }
    ],
    "subject": "Hi {{firstName}}, check out what'\''s new",
    "htmlContent": "<h1>Hey {{firstName}}!</h1><p>Your {{plan}} plan just got an upgrade.</p>",
    "variables": {
      "companyName": "Acme Inc",
      "year": "2026"
    },
    "tags": ["product-update", "february-2026"],
    "batchName": "February Product Update"
  }'

فیلدهای درخواست

فیلدنوعالزامیتوضیحات
fromobjectبلهآدرس فرستنده (email و name اختیاری)
recipientsarrayبلهلیست گیرندگان (توجه: recipients، نه to)
recipients[].emailstringبلهایمیل گیرنده
recipients[].namestringخیرنام نمایشی گیرنده
recipients[].variablesobjectخیرمتغیرهای قالب اختصاصی هر گیرنده
subjectstringمشروطالزامی است مگر اینکه از templateId استفاده شود
templateIdstringخیراستفاده از قالب ذخیره شده
htmlContentstringمشروطبدنه HTML (الزامی اگر templateId نباشد)
textContentstringخیرمتن ساده جایگزین
variablesobjectخیرمتغیرهای سراسری. چه templateId تنظیم شده باشد چه نشده اعمال می‌شوند؛ در صورت هم‌پوشانی کلید، مقدار recipients[].variables خودِ گیرنده برنده می‌شود
replyTostringخیرآدرس پاسخ‌دهی
batchNamestringخیرنام قابل خواندن برای این دسته
tagsarrayخیربرچسب‌ها برای تحلیل‌ها و فیلتر webhook
customHeadersobjectخیرهدرهای سفارشی ایمیل
trackingobjectخیربازنویسی ردیابی باز شدن/کلیک
ipPoolIdstringخیربرای استخرهای IP اختصاصی رزرو شده و هنوز در دسترس نیست؛ ارسال آن خطای 400 IP_POOL_NOT_FOUND برمی‌گرداند. آن را حذف کنید.
scheduledAtdatetimeخیرزمان‌بندی برای ارسال آینده، حداکثر تا ۷ روز بعد
externalBatchIdstringخیرشناسه دسته در سیستم شما: در صورت ارسال، همان مقدار به‌عنوان batchId در پاسخ بازگردانده می‌شود
priorityenumخیرLow، Normal (پیش‌فرض)، High، Critical
idempotencyKeystringخیرجلوگیری از ارسال تکراری برای یک کلید یکسان. هدر X-Idempotency-Key ترجیح داده می‌شود

توجه به تفاوت نام فیلد: ارسال دسته‌ای از recipients استفاده می‌کند در حالی که ارسال تکی از to استفاده می‌کند.

پاسخ

وضعیت: 202 Accepted

پاسخ دسته‌ای
{
  "success": true,
  "batchId": "batch_f47ac10b58cc43729876fedcba098765",
  "messageIds": ["m_a1b2c3...", "m_d4e5f6..."],
  "totalRecipients": 2,
  "acceptedCount": 2,
  "rejectedCount": 0,
  "rejectedRecipients": [],
  "queuedAt": "2026-02-17T10:30:00Z",
  "estimatedCompletion": "2026-02-17T10:35:00Z",
  "isSandboxed": false
}
فیلدنوعتوضیحات
batchIdstringشناسه یکتای دسته
messageIdsarrayشناسه‌های پیام به ازای هر گیرنده (با پیشوند m_ برای بازاریابی)
totalRecipientsintتعداد کل گیرندگان در درخواست
acceptedCountintگیرندگان پذیرفته شده برای تحویل
rejectedCountintگیرندگان رد شده
rejectedRecipientsarrayجزئیات گیرندگان رد شده به همراه دلایل
estimatedCompletiondatetimeزمان تخمینی اتمام پردازش دسته

ادغام متغیرها

متغیرهای اختصاصی هر گیرنده در صورت تداخل کلیدها، متغیرهای سراسری را بازنویسی می‌کنند:

اولویت متغیرها
{
  "variables": {
    "companyName": "Acme Inc",
    "greeting": "Hello"
  },
  "recipients": [
    {
      "email": "[email protected]",
      "variables": { "greeting": "Dear valued customer" }
    },
    {
      "email": "[email protected]"
    }
  ]
}
  • [email protected] دریافت می‌کند: greeting = "Dear valued customer"، companyName = "Acme Inc"
  • [email protected] دریافت می‌کند: greeting = "Hello"، companyName = "Acme Inc"

مدیریت خطا

خطاهای اختصاصی ارسال دسته‌ای:

وضعیتکدتوضیحات
400BATCH_NOT_ALLOWED_FOR_TRANSACTIONALاعتبارنامه تراکنشی نمی‌تواند دسته ارسال کند
400VALIDATION_FAILEDتعداد گیرندگان بیش از حداکثر هر دسته (۱۰٬۰۰۰)
400INVALID_REQUESTscheduledAt بیش از ۷ روز جلوتر («امکان زمان‌بندی ایمیل بیش از ۷ روز جلوتر وجود ندارد»)
400TEMPLATE_NOT_FOUNDtemplateId به هیچ قالب فعالی از این حساب اشاره ندارد (برای قالب حذف‌شده نیز برگردانده می‌شود)
400IP_POOL_NOT_FOUNDipPoolId به هیچ استخری که به این حساب اختصاص یافته باشد اشاره ندارد
422TEMPLATE_VARIABLE_MISSINGبرای هر گیرنده مقدار یک {{placeholder}} وجود ندارد (اگر فقط برای بعضی نباشد، آن‌ها رد می‌شوند و با دلیل template_variable_missing: name در rejectedRecipients می‌آیند). چیزی در صف قرار نمی‌گیرد
400BATCH_SEND_FAILEDتمام گیرندگان سرکوب شده‌اند
429RATE_LIMIT_EXCEEDEDاز محدودیت نرخ تجاوز شده (سطح فضای کاری/پلن، نه به‌ازای اعتبارنامه)
429QUOTA_EXCEEDEDسهمیه ماهانه تمام شده

کدهای سطح تأیید حساب و موتور سیاست که برای POST /v1/transactional/send مستند شده‌اند (SENDING_BLOCKED، ACTION_REQUIRED، DAILY_LIMIT_EXCEEDED، MARKETING_PAUSED و بقیه) اینجا هم اعمال می‌شوند.

موفقیت جزئی امکان‌پذیر است: ممکن است برخی گیرندگان پذیرفته شوند در حالی که دیگران رد شوند (مثلا آدرس‌های سرکوب شده). فیلد rejectedRecipients را در پاسخ بررسی کنید.

مراحل بعدی

در این صفحه