ویژگی تصویر

ارسال پیامک با Node.js

  /  Node.js   /  ارسال پیامک با Node.js
بنر تبلیغاتی الف
NodeJS - Node.js

ارسال پیامک (SMS) از طریق سرور با Node.js یکی از رایج‌ترین نیازهای اپلیکیشن‌های تجاری، اطلاع‌رسانی و احراز هویت است. از ارسال کد تأیید (OTP) گرفته تا اعلان‌های تراکنشی و کمپین‌های بازاریابی، قابلیت ارسال پیامک کمک می‌کند ارتباط با کاربر سریع و قابل اطمینان باشد. در این مقاله به صورت جامع نحوهٔ ارسال پیامک با Node.js، نکات فنی، مثال‌های عملی و بهترین روش‌ها را بررسی می‌کنیم.

مزایا و حالات کاربرد

  • ارسال کد تایید دو مرحله‌ای (2FA / OTP)
  • اطلاع‌رسانی تراکنش‌ها و وضعیت سفارش
  • پیامک‌های تراکنشی و هشدارهای فوری
  • ارسال پیامک انبوه و کمپین‌های بازاریابی
  • تأیید هویت و بازیابی رمز عبور

انتخاب سرویس‌دهنده (Providers)

برای ارسال پیامک با Node.js معمولاً از سرویس‌دهندگان خارجی یا داخلی استفاده می‌شود. سرویس‌هایی مثل Twilio، Vonage (Nexmo)، MessageBird، یا سرویس‌های محلی مانند SMS.ir و Farapayamak در ایران رایج‌اند. در انتخاب سرویس‌دهنده به موارد زیر توجه کنید:

  • پوشش بین‌المللی و ارسال به کشور مقصد
  • قیمت پیامک و هزینه ارسال انبوه
  • پشتیبانی از پیامک فارسی (Unicode) و UDH برای الحاق پیام‌ها
  • API مستند و کتابخانه رسمی برای Node.js
  • امکاناتی مثل گزارش تحویل (Delivery Receipt)، شماره اختصاصی و برنامه‌ریزی ارسال

ملاحظات فنی هنگام ارسال پیامک

  • رمزنگاری و نگهداری کلیدها در متغیرهای محیطی (ENV)
  • محدودیت طول پیام: GSM 03.38 معمولاً 160 کاراکتر؛ برای یونیکد (فارسی) هر بخش 70 کاراکتر است و در پیام‌های ترکیبی به 153 یا 67 کاهش می‌یابد.
  • Rate limiting و صف‌بندی برای جلوگیری از بلاک شدن اکانت
  • پردازش خطا و Retry با backoff برای مواجهه با ناپایداری شبکه
  • رعایت قوانین حریم خصوصی و موافقت کاربران برای دریافت پیامک

مثال عملی: ارسال SMS با Twilio در Node.js

// Install: npm install twilio
const twilio = require('twilio');
const client = twilio(process.env.TWILIO_SID, process.env.TWILIO_TOKEN);

async function sendOtp(to, message) {
  return await client.messages.create({
    body: message,
    from: process.env.TWILIO_PHONE, // e.g. '+1234567890'
    to: to // recipient number in E.164 format
  });
}

(async () => {
  try {
    const res = await sendOtp('+989121234567', 'کد شما: 123456');
    console.log('Message SID:', res.sid);
  } catch (err) {
    console.error('Send failed:', err);
  }
})();

توضیح: این کد از کتابخانهٔ رسمی Twilio استفاده می‌کند. شناسه حساب (TWILIO_SID) و توکن (TWILIO_TOKEN) باید در متغیرهای محیطی نگهدار شوند. عدد فرستنده (TWILIO_PHONE) باید توسط Twilio تأیید شده باشد. تابع sendOtp پیام را ارسال و شیٔ پاسخ شامل SID پیام را برمی‌گرداند. برای ارسال پیامک فارسی اطمینان حاصل کنید که سرویس Twilio از ارسال Unicode پشتیبانی می‌کند یا از راهکار جایگزین استفاده شود.

ارسال پیامک با یک API عمومی (مثال HTTP)

// Install: npm install axios
const axios = require('axios');

async function sendSmsViaApi(apiKey, url, to, message) {
  const payload = {
    api_key: apiKey,
    to: to,
    message: message,
    from: 'MyService'
  };
  const res = await axios.post(url, payload, {
    headers: { 'Content-Type': 'application/json' }
  });
  return res.data;
}

// Usage
sendSmsViaApi(process.env.SMS_API_KEY, 'https://api.smsprovider.com/send', '+989121234567', 'سلام از Node.js')
  .then(console.log)
  .catch(console.error);

توضیح: این مثال نشان می‌دهد چگونه با استفاده از axios یک درخواست HTTP به API فراهم‌کنندهٔ پیامک ارسال کنیم. ساختار payload و مسیر API به ارائه‌دهنده بستگی دارد؛ بنابراین مستندات آن را بررسی کنید. از HTTPS و توکن‌های مخفی در ENV استفاده کنید تا امنیت حفظ شود.

بهبود: اضافه کردن Retry و Backoff

const axios = require('axios');

async function sendWithRetry(url, payload, retries = 3) {
  let attempt = 0;
  while (attempt  setTimeout(r, 2 ** attempt * 100)); // exponential backoff
    }
  }
}

توضیح: این قطعه کد مکانیزم تکرار با backoff نمایی را اضافه می‌کند تا در صورت شکست‌های موقتی شبکه، تلاش مجدد انجام شود. عدد پایه و تعداد تکرارها را براساس نیاز تنظیم کنید.

ارسال پیامک فارسی و مسائل Encoding

پیامک فارسی معمولاً نیاز به یونیکد دارد. وقتی پیام شامل کاراکترهای فارسی یا سمبل‌هایی خارج از جدول GSM باشد، پیام به صورت Unicode ارسال می‌شود و طول هر بخش کاهش می‌یابد. نکات:

  • برای فارسی: هر پیام تک‌بخشی تا 70 کاراکتر.
  • برای پیام‌های چندبخشی (concatenated): هر بخش ≈ 67 کاراکتر (برای Unicode).
  • برخی ارائه‌دهندگان خودکار این تقسیم‌بندی را مدیریت می‌کنند؛ برخی نیاز به UDH یا پارامتر خاص دارند.

ارسال پیامک انبوه با Node.js — معماری پیشنهادی

برای ارسال انبوه، از صف‌ها و پردازش موازی کنترل‌شده استفاده کنید. معماری نمونه:

  • فرستادن درخواست‌های ارسال به یک صف (Redis + Bull یا RabbitMQ)
  • پردازشگرهای Worker که با نرخ محدود (rate limit) پیام‌ها را ارسال می‌کنند
  • ذخیرهٔ وضعیت پیام‌ها (pending, sent, delivered, failed) در دیتابیس
  • استفاده از callback/webhook برای دریافت گزارش تحویل

مقایسهٔ اجمالی سرویس‌دهندگان

ویژگیTwilioVonageسرویس‌های محلی
پوشش بین‌المللیعالیخوبمحدود (محلی)
قیمتمتوسط تا بالارقابتیمعمولاً ارزان‌تر در داخل کشور
پشتیبانی از فارسیبله (غالباً)بلهبله (بهینه برای بازار داخلی)

نکات امنیتی و حقوقی

  • کلیدهای API را در متغیرهای محیطی نگهدارید و در ریپازیتوری‌ها قرار ندهید.
  • اطمینان از رضایت کاربران (Opt-in) قبل از ارسال پیامک تبلیغاتی.
  • قابلیت لغو اشتراک (Opt-out) را فراهم کنید.
  • مراقب فیلترینگ محتوای پیام بر اساس قوانین کشور باشید.

نتیجه‌گیری

ارسال پیامک با Node.js ساده و قدرتمند است به شرطی که انتخاب سرویس‌دهنده مناسب، مدیریت صف و نرخ ارسال، نگهداری امنیت اطلاعات و رعایت قوانین را انجام دهید. با استفاده از کتابخانه‌های رسمی و الگوهای صف‌بندی می‌توانید سامانه‌ای مقیاس‌پذیر و قابل اطمینان برای ارسال SMS پیاده‌سازی کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: