در این مقاله یاد می‌گیرید چگونه ارسال ایمیل خودکار با Gmail در n8n را پیاده‌سازی کنید تا پاسخ‌های سریع، اعلان‌های سیستمی و پیام‌های خوش آمدگویی را بدون دخالت دستی ارسال کنید. ما یک فلو کامل می‌سازیم که از طریق Webhook اطلاعات ورودی را می‌گیرد، متن و عنوان ایمیل را می‌سازد و آن را از طریق Gmail ارسال می‌کند. همه کدها آماده اجرا هستند و فقط باید Credential جیمیل خود را در n8n انتخاب کنید.

قسمت قبل: ذخیره داده در Google Sheets با n8n

پیش‌نیازها

  • n8n نسخه 1.8 یا بالاتر نصب و در حال اجرا باشد
  • دسترسی به یک حساب Gmail و ساخت Credential در بخش Google در n8n
  • آشنایی پایه با Nodeهای Webhook، Function و Gmail در حد استفاده

معماری راهکار

  1. یک Webhook داده ورودی را دریافت می‌کند
  2. یک Function محتوا را اعتبارسنجی و قالب‌بندی می‌کند
  3. Gmail Node ایمیل را به گیرنده مشخص ارسال می‌کند
  4. در صورت نیاز، یک Respond to Webhook پاسخ سریع HTTP برمی‌گرداند تا کلاینت بداند درخواست موفق بوده است

ساخت Credential جیمیل در n8n

  1. به Settings > Credentials بروید
  2. روی New کلیک کنید و Google: Gmail OAuth2 را انتخاب کنید
  3. Sign in with Google را بزنید و دسترسی‌ها را تأیید کنید
  4. یک نام مشخص مانند Gmail Codity بدهید و Save کنید

ایجاد گردش‌کار مرحله به مرحله

گام 1: ساخت Webhook

  • Node Webhook اضافه کنید
  • Method را روی POST بگذارید
  • Path را مثل sendMail قرار دهید
  • Response Mode را فعلاً روی On Received یا Last Node تنظیم کنید (در ادامه از Last Node استفاده می‌کنیم)

آموزش ابزارهای هوش مصنوعی

گام 2: اعتبارسنجی و ساخت بدنه ایمیل با Function

یک Function Node بعد از Webhook قرار دهید و کد زیر را عیناً کپی کنید. این کد آماده اجراست و اگر فیلدهای ضروری نبود خطای دوستانه می‌دهد و در غیر این صورت سابجکت و بادی را می‌سازد:

// Ready-to-run for n8n v1.8+
// Expects JSON: { "to": "user@example.com", "name": "Sara", "subject": "Welcome", "message": "Thanks for joining" }
const data = $json;

// basic validation
const errors = [];
if (!data.to) errors.push("to");
if (!data.subject) errors.push("subject");
if (!data.message) errors.push("message");

if (errors.length) {
  return [
    {
      json: {
        ok: false,
        error: "Missing required fields: " + errors.join(", ")
      }
    }
  ];
}

const name = (data.name ? String(data.name) : "کاربر عزیز").trim();
const subject = String(data.subject).trim();

// build plain-text body
const lines = [];
lines.push(`سلام ${name}`);
lines.push("");
lines.push(String(data.message).trim());
lines.push("");
lines.push("با تشکر");
lines.push("تیم کدیتی");

const body = lines.join("\n");

return [
  {
    json: {
      ok: true,
      to: String(data.to).trim(),
      subject,
      body
    }
  }
];

گام 3: ارسال ایمیل با Gmail

  • Node Gmail را اضافه کنید
  • Resource: Message
  • Operation: Send
  • Credentials: همان Credential ساخته‌شده را انتخاب کنید
  • To: از Expression استفاده کنید و مقدار را از Function بگیرید: {{$json["to"]}}
  • Subject: {{$json["subject"]}}
  • Message: {{$json["body"]}}
  • در صورت نیاز From Name را روی Codity Team بگذارید

گام 4: پاسخ HTTP به درخواست‌کننده

برای بازگرداندن نتیجه به کلاینت، یا Response Mode وبهوک را روی Last Node بگذارید و Gmail را آخرین نود قرار دهید، یا یک Node Respond to Webhook بعد از Gmail قرار دهید و فیلد Response را به‌صورت زیر تنظیم کنید:

{
  "status": "sent",
  "to": "{{$json['to']}}",
  "subject": "{{$json['subject']}}"
}

تست سریع با cURL

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

curl -X POST http://localhost:5678/webhook/sendMail \
  -H "Content-Type: application/json" \
  -d '{
    "to": "test@example.com",
    "name": "Sara",
    "subject": "خوش آمدگویی",
    "message": "ثبت نام شما با موفقیت انجام شد"
  }'

اگر Credential درست باشد، ایمیل ارسال می‌شود و پاسخ JSON موفق دریافت می‌کنید.

اکسپورت آماده وارد کردن در n8n

فایل زیر را عیناً کپی و در n8n از گزینه Import from Clipboard استفاده کنید.
پس از ایمپورت فقط Credential جیمیل را روی Gmail Node انتخاب و Workflow را فعال کنید.

{
  "name": "Codity - Gmail Auto Send",
  "nodes": [
    {
      "parameters": {
        "path": "sendMail",
        "httpMethod": "POST",
        "options": {
          "responseMode": "lastNode"
        }
      },
      "id": "Webhook_Receive",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [300, 300]
    },
    {
      "parameters": {
        "functionCode": "// Ready-to-run for n8n v1.8+\\n// Expects JSON: { \\\"to\\\": \\\"user@example.com\\\", \\\"name\\\": \\\"Sara\\\", \\\"subject\\\": \\\"Welcome\\\", \\\"message\\\": \\\"Thanks for joining\\\" }\\nconst data = $json;\\n\\n// basic validation\\nconst errors = [];\\nif (!data.to) errors.push(\\\"to\\\");\\nif (!data.subject) errors.push(\\\"subject\\\");\\nif (!data.message) errors.push(\\\"message\\\");\\n\\nif (errors.length) {\\n  return [\\n    {\\n      json: {\\n        ok: false,\\n        error: \\\"Missing required fields: \\\" + errors.join(\\\", \\\")\\n      }\\n    }\\n  ];\\n}\\n\\nconst name = (data.name ? String(data.name) : \\\"کاربر عزیز\\\").trim();\\nconst subject = String(data.subject).trim();\\n\\n// build plain-text body\\nconst lines = [];\\nlines.push(`سلام ${name}`);\\nlines.push(\\\"\\\");\\nlines.push(String(data.message).trim());\\nlines.push(\\\"\\\");\\nlines.push(\\\"با تشکر\\\");\\nlines.push(\\\"تیم کدیتی\\\");\\n\\nconst body = lines.join(\\\"\\\\n\\\");\\n\\nreturn [\\n  {\\n    json: {\\n      ok: true,\\n      to: String(data.to).trim(),\\n      subject,\\n      body\\n    }\\n  }\\n];"
      },
      "id": "Function_Prepare",
      "name": "Prepare Email",
      "type": "n8n-nodes-base.function",
      "typeVersion": 2,
      "position": [580, 300]
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "send",
        "toList": "={{$json[\"to\"]}}",
        "subject": "={{$json[\"subject\"]}}",
        "message": "={{$json[\"body\"]}}"
      },
      "id": "Gmail_Send",
      "name": "Gmail - Send",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 3,
      "position": [860, 300],
      "credentials": {
        "gmailOAuth2": {
          "id": "",
          "name": ""
        }
      }
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Prepare Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Email": {
      "main": [
        [
          {
            "node": "Gmail - Send",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  ],
  "meta": {
    "version": "1.0.0",
    "instanceId": "codity-n8n",
    "workflowId": "gmail-auto-send"
  },
  "settings": {
    "executionOrder": "v1",
    "saveExecutionProgress": true
  }
}

نکات حرفه‌ای

  • برای جلوگیری از اسپم شدن، From Name معنادار انتخاب کنید و نرخ ارسال را کنترل کنید.
  • در صورت نیاز از فیلد Reply-To استفاده کنید تا پاسخ‌های کاربر به آدرس خاصی برود.
  • برای پیام‌های چندزبانه، متن‌ها را در Function بر اساس زبان ورودی بسازید.
  • برای لاگ بهتر، قبل از Gmail یک Node Set اضافه کنید و داده‌های کلیدی مثل زمان و شناسه درخواست را ثبت کنید.
  • اگر نیاز دارید سریع پاسخ HTTP بدهید اما ارسال ایمیل طولانی است، به جای Response Mode: Last Node، یک Respond to Webhook با پیام موفقیت اضافه و ارسال ایمیل را در پس‌زمینه با Queue اجرا کنید.

عیب‌یابی سریع

  • خطای احراز هویت: Credential را مجدد انتخاب یا Refresh Token کنید.
  • ایمیل ارسال نمی‌شود اما فلو موفق است: ممکن است محدودیت‌های ارسال Gmail فعال شده باشد؛ از بخش Security حساب بررسی کنید.
  • کاراکترهای فارسی به‌هم‌ریخته است: اطمینان دهید نوع محتوا text/plain باشد.
  • ورودی ناقص: Function پیام خطا برمی‌گرداند؛ فیلدهای to, subject, message را ارسال کنید.