MailLandDocs
ارسال ایمیل

قالب‌ها

ایجاد و مدیریت قالب‌های ایمیل قابل استفاده مجدد با جایگزینی متغیرهای پویا

قالب‌های ایمیل قابل استفاده مجدد با متغیرهای پویا ایجاد کنید. قالب‌ها موضوع، محتوای HTML و محتوای متنی ایمیل شما را ذخیره می‌کنند تا بتوانید ایمیل‌های شخصی‌سازی‌شده را بدون بازسازی محتوا در هر درخواست ارسال کنید.

ایجاد یک قالب

POST https://api.mail.land/v1/templates
Create a template
curl -X POST https://api.mail.land/v1/templates \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Confirmation",
    "subject": "Your order #{{orderNumber}} is confirmed",
    "htmlContent": "<h1>Thanks, {{firstName}}!</h1><p>Order #{{orderNumber}} has been confirmed. Total: {{total}}</p>",
    "textContent": "Thanks, {{firstName}}! Order #{{orderNumber}} has been confirmed. Total: {{total}}",
    "categoryId": "k3v9q2m7xw4tpa"
  }'
Response: 201 Created
{
  "id": "t8x2m4q9zk7wpr",
  "name": "Order Confirmation",
  "subject": "Your order #{{orderNumber}} is confirmed",
  "htmlContent": "<h1>Thanks, {{firstName}}!</h1>...",
  "textContent": "Thanks, {{firstName}}!...",
  "categoryId": "k3v9q2m7xw4tpa",
  "categoryName": "Transactional",
  "categoryColor": "#3B82F6",
  "createdAt": "2026-02-17T10:00:00Z",
  "updatedAt": null
}

قوانین اعتبارسنجی

فیلدمحدودیت
nameالزامی، حداکثر ۲۰۰ کاراکتر
subjectالزامی، حداکثر ۵۰۰ کاراکتر
htmlContentالزامی، حداکثر ۱ مگابایت
textContentاختیاری، حداکثر ۱ مگابایت
categoryIdاختیاری، باید به یک دسته‌بندی موجود اشاره کند

نحو متغیر

از آکولادهای دوتایی برای جایگزینی متغیر استفاده کنید:

Template with variables
<h1>Hello {{firstName}},</h1>
<p>Your order #{{orderNumber}} shipped on {{shipDate}}.</p>
<p>Track your package: <a href="{{trackingUrl}}">{{trackingNumber}}</a></p>

متغیرها در زمان ارسال جایگزین می‌شوند. مقادیر را از طریق فیلد variables در درخواست ارسال خود ارائه دهید:

Send with template variables
{
  "from": { "email": "[email protected]" },
  "to": [
    {
      "email": "[email protected]",
      "variables": {
        "firstName": "Jane",
        "orderNumber": "ORD-12345",
        "shipDate": "Feb 17, 2026",
        "trackingUrl": "https://track.example.com/ABC123",
        "trackingNumber": "ABC123"
      }
    }
  ],
  "templateId": "t8x2m4q9zk7wpr"
}

متغیرها هم در subject و هم در htmlContent/textContent کار می‌کنند. هر {{variable}} که قالب استفاده می‌کند باید مقداری داشته باشد، یا در variables درخواست یا در variables خودِ گیرنده. اگر مقداری نداشته باشد، MailLand پیام را با آن جایگزین خام نمی‌فرستد: POST /v1/transactional/send پاسخ 422 TEMPLATE_VARIABLE_MISSING می‌دهد و متغیرهای کم را نام می‌برد، و POST /v1/transactional/send-batch آن گیرنده را رد می‌کند و در rejectedRecipients فهرست می‌کند. کمپین‌ها و اتوماسیون‌ها هم آن گیرنده را رد می‌کنند. محتوای درون‌خطی htmlContent که بدون هیچ variables فرستاده شود، همان‌طور که نوشته شده ارسال می‌شود. جایگزین‌ها دقیقاً {{name}} هستند، بدون فیلتر، شرط یا حلقه. قالب grammarVersion: "legacy-v1" را گزارش می‌کند که امروز تنها دستور زبان است؛ هنگام ساخت یا ویرایش قالب می‌توانید این فیلد را نفرستید.

مقادیر پیش‌فرض

هر قالب می‌تواند برای هر فیلد مخاطبی که استفاده می‌کند یک مقدار پیش‌فرض داشته باشد، تا مشترکی که برای آن فیلد مقداری ندارد هم ایمیل را دریافت کند. آن را با variableDefaults تنظیم کنید، یک شیء از نام جایگزین به مقدار، هنگام ایجاد و به‌روزرسانی. هنگام دریافت، فهرست‌کردن یا تکثیر قالب هم برگردانده می‌شود.

قالب با مقدار پیش‌فرض
{
  "name": "Welcome",
  "subject": "Hello {{firstName}}",
  "htmlContent": "<p>Hi {{firstName}}</p>",
  "variableDefaults": { "firstName": "دوست" }
}

قواعد:

  • مقادیر پیش‌فرض فقط برای ارسال‌های کمپین و اتوماسیون اعمال می‌شوند. مقدار غیرخالیِ خودِ گیرنده همیشه بر پیش‌فرض برتری دارد.
  • فیلدی که نه مقدار دارد و نه پیش‌فرض، همچنان رد می‌شود: MailLand هرگز {{firstName}} خام را نمی‌فرستد.
  • ارسال‌های تراکنشی از طریق API و SMTP تحت‌تأثیر نیستند. در آن‌ها مقادیر از درخواست شما می‌آیند و مقدار نبودن، همان‌طور که بالا آمد رد می‌شود.
  • در به‌روزرسانی، اگر variableDefaults را نفرستید پیش‌فرض‌های ذخیره‌شده می‌مانند. برای پاک‌کردنشان {} بفرستید.
  • نام‌ها از نحو جایگزین‌ها پیروی می‌کنند. email و subscriberId همیشه تأمین می‌شوند و پیش‌فرض نمی‌گیرند. هر مقدار یک خط و حداکثر ۲۰۰ نویسه است و هر قالب حداکثر ۵۰ پیش‌فرض دارد.

در ویرایشگر داشبورد، برای هر جایگزین یک ورودی پیش‌فرض هست که تعداد مشترکان فاقد آن فیلد را نشان می‌دهد، و هنگام ذخیره اگر فیلدی که مشترک فاقد آن دارد پیش‌فرض نداشته باشد هشدار می‌دهد.

پیش‌نمایش یک قالب

پیش‌نمایش قالب با مقادیر نمونه که به‌طور خودکار برای متغیرهای شناسایی‌شده پر می‌شوند:

GET https://api.mail.land/v1/templates/{id}/preview
Preview a template
curl https://api.mail.land/v1/templates/t8x2m4q9zk7wpr/preview \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Preview response
{
  "id": "t8x2m4q9zk7wpr",
  "name": "Order Confirmation",
  "subject": "Your order #12345 is confirmed",
  "renderedHtml": "<h1>Thanks, John!</h1><p>Order #12345 has been confirmed.</p>",
  "renderedText": "Thanks, John! Order #12345 has been confirmed."
}

تکثیر یک قالب

یک قالب موجود را کلون کنید:

POST https://api.mail.land/v1/templates/{id}/duplicate
Duplicate a template
curl -X POST https://api.mail.land/v1/templates/t8x2m4q9zk7wpr/duplicate \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

نسخه تکثیرشده نام تولیدشده خودکار دریافت می‌کند: "Order Confirmation (Copy)". اگر یک نسخه از قبل موجود باشد، نام افزایش می‌یابد: "Order Confirmation (Copy 2)" و غیره.

دسته‌بندی‌های قالب

قالب‌ها را با رنگ‌های اختیاری در دسته‌بندی‌ها سازماندهی کنید.

ایجاد یک دسته‌بندی

POST https://api.mail.land/v1/templates/categories
Create a category
curl -X POST https://api.mail.land/v1/templates/categories \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Transactional",
    "description": "Order confirmations, receipts, and shipping notifications",
    "color": "#3B82F6"
  }'
فیلدمحدودیت
nameالزامی، ۱ تا ۱۰۰ کاراکتر
descriptionاختیاری، حداکثر ۵۰۰ کاراکتر
colorاختیاری، فرمت هگزادسیمال (#3B82F6 یا #38F)

فهرست دسته‌بندی‌ها

GET https://api.mail.land/v1/templates/categories
List template categories
curl https://api.mail.land/v1/templates/categories \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Categories response
{
  "categories": [
    {
      "id": "k3v9q2m7xw4tpa",
      "name": "Transactional",
      "description": "Order confirmations, receipts",
      "color": "#3B82F6",
      "templateCount": 12,
      "createdAt": "2026-01-15T10:00:00Z"
    }
  ],
  "totalCount": 3
}

فهرست قالب‌ها

GET https://api.mail.land/v1/templates?limit=50
List templates
curl "https://api.mail.land/v1/templates?limit=50" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

فیلتر بر اساس دسته‌بندی:

GET https://api.mail.land/v1/templates?categoryId=k3v9q2m7xw4tpa
List templates by category
curl "https://api.mail.land/v1/templates?categoryId=k3v9q2m7xw4tpa" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Template list response
{
  "items": [
    {
      "id": "t8x2m4q9zk7wpr",
      "name": "Order Confirmation",
      "subject": "Your order #{{orderNumber}} is confirmed",
      "htmlContent": "...",
      "categoryName": "Transactional",
      "categoryColor": "#3B82F6",
      "createdAt": "2026-02-17T10:00:00Z"
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

به‌روزرسانی یک قالب

PUT https://api.mail.land/v1/templates/{id}

تمام فیلدها در درخواست به‌روزرسانی الزامی هستند (این یک جایگزینی کامل است، نه به‌روزرسانی جزئی):

Update a template
curl -X PUT https://api.mail.land/v1/templates/t8x2m4q9zk7wpr \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Confirmation v2",
    "subject": "Order #{{orderNumber}} confirmed - {{companyName}}",
    "htmlContent": "<h1>Thanks, {{firstName}}!</h1><p>Updated template content.</p>",
    "textContent": "Thanks, {{firstName}}! Updated template content.",
    "categoryId": "k3v9q2m7xw4tpa"
  }'

حذف یک قالب

DELETE https://api.mail.land/v1/templates/{id}
Delete a template
curl -X DELETE https://api.mail.land/v1/templates/t8x2m4q9zk7wpr \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

در صورت موفقیت 204 No Content برمی‌گردد. قالب حذف‌شده دیگر قابل بازیابی، فهرست‌کردن یا استفاده برای ارسال نیست: درخواست ارسالی که به آن اشاره می‌کند، چه فوری چه زمان‌بندی‌شده، با خطای 400 TEMPLATE_NOT_FOUND رد می‌شود؛ و زمان‌بندی‌ای که قالبش پیش از موعد حذف شود نیز دقیقاً همین‌طور در زمان ارسال رد می‌شود.

استفاده از قالب‌ها هنگام ارسال

با ارجاع به یک قالب از طریق شناسه در درخواست ارسال خود، موضوع و محتوای قالب استفاده می‌شود و متغیرها جایگزین می‌شوند:

Send with template
{
  "from": { "email": "[email protected]" },
  "to": [
    {
      "email": "[email protected]",
      "variables": {
        "firstName": "Jane",
        "orderNumber": "ORD-12345"
      }
    }
  ],
  "templateId": "t8x2m4q9zk7wpr",
  "variables": {
    "companyName": "Acme Inc"
  }
}

وقتی templateId تنظیم شده باشد، همیشه موضوع رندرشدهٔ قالب استفاده می‌شود؛ هر subject در درخواست ارسال نادیده گرفته می‌شود.

محدودیت‌های طرح

تعداد قالب‌هایی که می‌توانید ایجاد کنید به طرح شما بستگی دارد. اگر به محدودیت برسید، ایجاد یک قالب جدید 403 PLAN_LIMIT_REACHED را برمی‌گرداند.

مراحل بعدی

در این صفحه