آنچه در این مقاله میخوانید [پنهانسازی]
در این مقاله یاد میگیرید چگونه ارسال ایمیل خودکار با Gmail در n8n را پیادهسازی کنید تا پاسخهای سریع، اعلانهای سیستمی و پیامهای خوش آمدگویی را بدون دخالت دستی ارسال کنید. ما یک فلو کامل میسازیم که از طریق Webhook اطلاعات ورودی را میگیرد، متن و عنوان ایمیل را میسازد و آن را از طریق Gmail ارسال میکند. همه کدها آماده اجرا هستند و فقط باید Credential جیمیل خود را در n8n انتخاب کنید.
قسمت قبل: ذخیره داده در Google Sheets با n8n
سرفصل های مقاله
پیشنیازها
- n8n نسخه 1.8 یا بالاتر نصب و در حال اجرا باشد
- دسترسی به یک حساب Gmail و ساخت Credential در بخش Google در n8n
- آشنایی پایه با Nodeهای Webhook، Function و Gmail در حد استفاده
معماری راهکار
- یک Webhook داده ورودی را دریافت میکند
- یک Function محتوا را اعتبارسنجی و قالببندی میکند
- Gmail Node ایمیل را به گیرنده مشخص ارسال میکند
- در صورت نیاز، یک Respond to Webhook پاسخ سریع HTTP برمیگرداند تا کلاینت بداند درخواست موفق بوده است
ساخت Credential جیمیل در n8n
- به Settings > Credentials بروید
- روی New کلیک کنید و Google: Gmail OAuth2 را انتخاب کنید
- Sign in with Google را بزنید و دسترسیها را تأیید کنید
- یک نام مشخص مانند
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را ارسال کنید.






