كيفية استخدام Nodemailer لإرسال رسائل البريد الإلكتروني من خادم Node.js

دقائق القراءة: 5

مقدمة: لماذا تستخدم Nodemailer في تطبيقات Node.js؟

تُعد مكتبة Nodemailer واحدة من أشهر الأدوات المخصصة لإرسال رسائل البريد الإلكتروني من تطبيقات Node.js. وتبرز أهميتها عندما تحتاج إلى إرسال رسائل ترحيبية للمستخدمين، أو تنبيهات خاصة بالنظام، أو إشعارات تلقائية عند حدوث خطأ داخل الخادم.

في هذا الدليل، سنشرح طريقة عملية واحترافية لاستخدام Nodemailer مع Gmail داخل بيئة Node.js بالاعتماد على OAuth2، وهي الطريقة الأكثر أمانًا وملاءمة للتطبيقات الحديثة.

استخدام Nodemailer لإرسال البريد الإلكتروني من خادم Node.js

البدء بإعداد مشروع Node.js

قبل تثبيت Nodemailer، من الأفضل تجهيز مشروع بسيط باستخدام Express حتى نمتلك خادمًا جاهزًا للتجربة.

التحقق من تثبيت Node.js وnpm

نفّذ الأوامر التالية داخل الطرفية للتأكد من أن البيئة جاهزة:

node -v
npm -v

إذا ظهرت أرقام الإصدارات، فهذا يعني أن التثبيت سليم. أما إذا لم تظهر، فستحتاج إلى تثبيت ما ينقصك أولًا.

إنشاء مجلد المشروع وتهيئته

أنشئ مجلدًا جديدًا للمشروع، ثم ادخل إليه وابدأ تهيئة الحزمة:

mkdir nodemailerProject
cd nodemailerProject
npm init

سيؤدي ذلك إلى إنشاء ملف package.json الذي يدير إعدادات المشروع واعتمادياته.

تثبيت Express

npm install express

بعد ذلك، افتح ملف نقطة الدخول مثل index.js وأضف الكود التالي:

const express = require('express')
const app = express()
const port = 3000

app.listen(port, () => {
  console.log(`nodemailerProject is listening at http://localhost:${port}`)
})

لتشغيل الخادم:

node index.js

إذا ظهر الرابط في الطرفية، فهذا يعني أن الخادم يعمل بشكل صحيح.

تثبيت مكتبة Nodemailer

الآن يمكننا تثبيت المكتبة الأساسية المسؤولة عن إرسال البريد:

npm install nodemailer

تعتمد آلية العمل في Nodemailer غالبًا على 3 خطوات رئيسية:

  • إنشاء كائن Transporter.
  • إنشاء كائن mailOptions.
  • استخدام الدالة sendMail() لإرسال الرسالة.

إعداد Transporter للاتصال بخدمة Gmail

الجزء الأهم هو إنشاء كائن الاتصال الذي يتولى تمرير بيانات المصادقة إلى Gmail. إليك الصيغة الأساسية:

let transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: process.env.MAIL_USERNAME,
    pass: process.env.MAIL_PASSWORD,
    clientId: process.env.OAUTH_CLIENTID,
    clientSecret: process.env.OAUTH_CLIENT_SECRET,
    refreshToken: process.env.OAUTH_REFRESH_TOKEN
  }
});

لاحظ أن الحقول user وpass تمثل بيانات حساب Gmail، بينما تتطلب الحقول clientId وclientSecret وrefreshToken إعداد OAuth2 داخل منصة Google Cloud Platform.

هذه الخطوة ضرورية لأن Gmail يفرض قيودًا أمنية عالية على التطبيقات التي تحاول إرسال البريد نيابة عن المستخدم.

خطوات إعداد Google Cloud Platform لاستخدام OAuth2 مع Gmail وNodemailer

إعداد Google Cloud Platform لاستخدام OAuth2

إذا لم يكن لديك حساب على Google Cloud Platform، فابدأ بإنشائه. بعد ذلك، أنشئ مشروعًا جديدًا من القائمة العلوية.

إنشاء مشروع جديد في Google Cloud Platformاختيار خيار مشروع جديد في منصة Google Cloud

اختر اسمًا مناسبًا للمشروع، ويمكنك مثلًا استخدام NodemailerProject.

تسمية مشروع Nodemailer داخل Google Cloud Platform

بعد اكتمال إنشاء المشروع، انتقل إلى قسم APIs and Services من القائمة الجانبية.

واجهة مشروع Google Cloud بعد الإنشاءالدخول إلى APIs and Services في Google Cloud Platform

تهيئة شاشة الموافقة الخاصة بـ OAuth Consent Screen

حتى تتمكن من استخدام OAuth2، عليك أولًا إعداد شاشة الموافقة الخاصة بالتطبيق.

إعداد OAuth Consent Screen في Google Cloud

إذا لم تكن تستخدم G-Suite، فسيكون الخيار المتاح غالبًا هو External.

اختيار نوع المستخدم External في إعداد OAuth

بعد ذلك، املأ بيانات التطبيق، وأضف بريدك الإلكتروني في حقلي دعم المستخدم وبيانات المطور.

إدخال معلومات التطبيق في شاشة موافقة OAuth

يمكنك تجاوز قسم Scopes في هذا السيناريو، ثم الانتقال إلى قسم Test Users وإضافة بريدك الإلكتروني كمستخدم تجريبي.

إضافة مستخدم تجريبي في إعدادات OAuth داخل Google Cloud

إنشاء بيانات اعتماد OAuth Client ID

بعد إعداد شاشة الموافقة، انتقل إلى تبويب Credentials، ثم اختر Create Credentials وبعدها OAuth Client ID.

إنشاء OAuth Client ID في Google Cloud Platform

من نوع التطبيق اختر Web Application.

اختيار نوع التطبيق Web Application عند إنشاء OAuth Client ID

داخل قسم Authorized Redirect URIs، أضف الرابط التالي لأنه سيُستخدم لاحقًا للحصول على refreshToken:

https://developers.google.com/oauthplayground

إضافة OAuth2 Playground إلى Authorized Redirect URIs

بعد الإنشاء، ستحصل على clientId وclientSecret. احتفظ بهما في مكان آمن جدًا، ولا تشاركهما علنًا مطلقًا.

الحصول على client ID وclient secret لاستخدام Gmail OAuth2 مع Nodemailer

الحصول على OAuth Refresh Token

الآن نحتاج إلى استخراج refreshToken، وهو جزء أساسي في مصادقة Nodemailer مع Gmail.

انتقل إلى OAuth2 Playground، ثم اضغط على رمز الترس وفعّل خيار استخدام بيانات OAuth2 الخاصة بك.

تفعيل استخدام بيانات OAuth2 الخاصة داخل OAuth Playground

من القائمة الجانبية، ابحث عن Gmail API v1.

اختيار Gmail API v1 من داخل OAuth2 Playground

بعد الضغط على Authorize APIs، سجّل الدخول بالحساب الذي أضفته كمستخدم تجريبي. قد تظهر رسالة تفيد بأن التطبيق غير موثّق بعد، ويمكنك المتابعة لأنك لم تُرسله بعد للمراجعة.

رسالة Google الخاصة بعدم التحقق من التطبيق أثناء إعداد OAuth

بعد منح الصلاحية للتطبيق للوصول إلى حساب Gmail:

منح التطبيق صلاحية الوصول إلى حساب Gmail عبر OAuth2

ستعود إلى صفحة OAuth Playground وبإمكانك الضغط على Exchange authorization code for tokens للحصول على accessToken وrefreshToken.

العودة إلى المشروع وتأمين البيانات السرية

بعد جمع القيم المطلوبة، من الأفضل عدم كتابتها مباشرة داخل الشيفرة. استخدم حزمة dotenv لتخزين البيانات الحساسة داخل ملف .env.

npm install dotenv

ولا تنسَ إضافة ملف .env إلى ملف .gitignore حتى لا يتم رفعه إلى المستودع.

صيغة transporter بعد استخدام المتغيرات البيئية

let transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: process.env.MAIL_USERNAME,
    pass: process.env.MAIL_PASSWORD,
    clientId: process.env.OAUTH_CLIENTID,
    clientSecret: process.env.OAUTH_CLIENT_SECRET,
    refreshToken: process.env.OAUTH_REFRESH_TOKEN
  }
});

إنشاء كائن mailOptions

هذا الكائن يحتوي على تفاصيل الرسالة: المرسل، والمستلم، والعنوان، والنص.

let mailOptions = {
  from: 'tomerpacific@gmail.com',
  to: 'tomerpacific@gmail.com',
  subject: 'Nodemailer Project',
  text: 'Hi from your nodemailer project'
};

يمكنك لاحقًا توسيع هذا الكائن ليشمل:

  • أكثر من مستلم.
  • نسخة كربونية cc.
  • نسخة مخفية bcc.
  • محتوى بصيغة HTML.
  • مرفقات ملفات.

إرسال الرسالة عبر sendMail()

بعد إعداد كل شيء، تأتي الخطوة الأخيرة: استدعاء الدالة المسؤولة عن الإرسال.

transporter.sendMail(mailOptions, function(err, data) {
  if (err) {
    console.log('Error ' + err);
  } else {
    console.log('Email sent successfully');
  }
});

عند تشغيل التطبيق بنجاح، ستصل رسالة جديدة إلى صندوق البريد المحدد في الحقل to.

أفضل ممارسات عند استخدام Nodemailer مع Gmail

  • لا تضع بيانات OAuth أو كلمات المرور داخل الشيفرة مباشرة.
  • استخدم ملف .env مع حزمة dotenv.
  • أضف ملف .env إلى .gitignore.
  • اختبر عملية الإرسال باستخدام حساب تجريبي قبل الاعتماد على الخدمة في بيئة الإنتاج.
  • راقب أخطاء الإرسال في السجلات لتتأكد من أن الإعدادات سليمة.

متى يكون هذا الأسلوب مناسبًا؟

يُعد هذا الأسلوب مناسبًا إذا كنت تبني:

  • نظام تواصل عبر نموذج اتصال.
  • منصة ترسل رسائل ترحيب أو تأكيد.
  • لوحة تحكم ترسل تنبيهات إدارية.
  • تطبيقًا يحتاج إلى إشعارات تلقائية عند فشل مهمة معينة.

لكن إذا كان مشروعك كبيرًا جدًا أو يعتمد على إرسال كثيف للبريد، فقد يكون من الأفضل التفكير في خدمات متخصصة مثل SendGrid أو Mailgun أو Amazon SES، لأنها تمنحك قابلية توسع ومراقبة أفضل.

الخلاصة التقنية

استخدام Nodemailer مع Node.js وGmail OAuth2 يوفّر طريقة موثوقة وآمنة لإرسال البريد الإلكتروني من الخادم دون تعريض بياناتك الحساسة للخطر. ورغم أن إعداد Google Cloud Platform قد يبدو طويلًا في البداية، إلا أنه يضمن تكاملًا أكثر أمانًا من الطرق التقليدية. إذا كنت تبحث عن حل عملي لمشاريع صغيرة ومتوسطة، فهذه المقاربة مناسبة جدًا، خاصة عند الالتزام بإدارة الأسرار عبر المتغيرات البيئية واتباع ضوابط الحماية الأساسية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *