ارسال ۵۰ هزار ایمیل در نودجی اس با کمک صف ها
ارسال تعداد زیادی ایمیل برای هر برنامه نویس موضوعی جالب و چالش برانگیز خواهد بود، خصوصا اگر قرار باشد همه آنها همزمان ارسال گردند!
در این مقاله به ارسال ۵۰ هزار ایمیل با کمک صف (queue) در نود جی اس خواهیم پرداخت؛ با کدنایت همراه باشید.
برای شروع بهتر است نیم نگاهی به نیازمندی های این مقاله داشته باشیم:
پیش نیاز ها:
۱- یک سرور جهت اجرای برنامه یا اپلیکیشن nodeJs خود
۲- یک ارائه دهنده خدمات ایمیل جهت ارسال ایمیل ها مانند sendGrid, Mailgun و غیره
۳- آشنایی با nodeJs و ماژول های مخصوص ارسال ایمیل
4- آشنایی با صف و شناخت ماژول های مخصوص آن (ماژول kue)
مرحله ی اول:
برای ارسال ایمیل ها با استفاده از نود جی اس، ابتدا نیاز است ماژول های زیر را نصب کنیم:
۱- Nodemailer: ماژولی برای ارسال ایمیل با ساده ترین روش ممکن
2- Kue: یک صف بر مبنای ردیس جهت استفاده در نود جی اس
پکیج های فوق، با دستورات زیر قابل نصب هستند :
npm install --save nodemailer
npm install --save kue
مرحله ی دوم:
در این مرحله نیاز است در یکی از وبسایت های ارائه دهنده خدمات ایمیل مانند sendGrid ثبت نام کرده و API key خود را دریافت کنید؛ سپس کافیست اسکریپت های ارسال ایمیل را با استفاده از nodemailer و sendGrid بنویسید:
//send-email.js file
const nodemailer = require('nodemailer');
const sendgridTransport = require('nodemailer-sendgrid-transport');
const transport = nodemailer.createTransport(sendgridTransport({
auth: {
api_key: 'YOUR_SENDGRID_API_KEY'
}
}));
const sendEmail = (email, subject, html) => {
const mailOptions = {
from: 'sender@example.com',
to: email,
subject,
html
};
transport.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log(`Email sent to ${email}: ${info.response}`);
}
});
};
// نمونه ای از تست فانکشن برای ارسال ایمیل
sendEmail('recipient@example.com', 'Codenight Blogs', '<p>This is a test email</p>');
module.exports = sendEmail
در مثال بالا، با کمک nodemailer-sendgrid-transport که یک افزونه انتقال (transport plugin) برای nodemailer میباشد، تابع ارسال ایمیل خود را توسعه دادیم. همچنین فراموش نکنید که به جای YOUR_SENDGRID_API_KEY ، باید API Key مربوط به sendGrid را قرار دهید.
مرحله ی سوم، افزودن ایمیل ها به صف یا queue :
در مثال زیر، با کمک kue تمامی ایمیل ها را در صف قرار میدهیم:
const kue = require('kue');
const queue = kue.createQueue();
const addEmailJobToQueue = (email, subject, html) => {
const job = queue.create('email', { email, subject, html }).save((error) => {
if (error) {
console.error(error);
} else {
console.log(`Email job added to queue: ${email}`);
}
});
};
// Add 50,000 email jobs to the queue
const emailList = [
{
email: 'recipient1@example.com',
subject: 'Test email 1',
html: '<p>This is a test email 1</p>'
},
{
email: 'recipient2@example.com',
subject: 'Test email 2',
html: '<p>This is a test email 2</p>'
},
// ...
{
email: 'recipient50000@example.com',
subject: 'Test email 50000',
html: '<p>This is a test email 50000</p>'
}
];
for (const mailData of emailList) {
addEmailJobToQueue(mailData.email, mailData.subject, mailData.html);
}
در کد بالا ۵۰ هزار ایمیل که در قالب آرایه ای از آبجکت ها قرار گرفته اند را از طریق یک حلقه به صف یا queue اضافه میکنیم؛ هر آبجکت شامل آدرس گیرنده، محتوا و عنوان ایمیل میباشد.
برای ساخت صف در قدم اول متد createQueue را در kue صدا میزنیم که نمونه ای از queue ایجاد شود؛ همچنین با متد create موجود در queue صف مخصوص ایمیل را شکل خواهیم داد، در پارامتر اول اسم صف مد نظر برای پردازش و در پارامتر دوم هم دیتایی که قرار است در پردازش ایمیل ها استفاده شود را جایگذاری میکنیم. در نهایت نیز از طریق یک حلقه، تمامی ایمیل های حاضر و آماده را به صف انتقال خواهیم داد.
مرحله ی چهارم، done کردن تسک های صف شده در kue:
در مرحله ی قبل تمامی دیتا ها با کمک متد addEmailJobToQueue به صف اضافه و آماده پردازش شدند، حال نوبت به done شدن این پردازش ها رسیده است؛ کد زیر این عمل را انجام خواهد داد:
const kue = require('kue');
const queue = kue.createQueue();
const sendEmail = require('./send-email'); //کدهای مربوط به مراحل ارسال ایمیل را در فایل دیگه ای قرار دادیم و در اینجا اضافه کردیم
queue.process('email', (job, done) => {
sendEmail(job.data.email, job.data.subject, job.data.html);
done();
});
همانطور که میبینید در کد فوق با کمک kue، صف ایجاد شده از قبل را خواندیم و با متد process در پارامتر اول مشخص کردیم کدام صف خوانده شود. با انجام این کار تمامی پردازش های موجود در صف اجرا و تمامی تسک های موجود در صف به نوبت done خواهند شد.
نکته: ارسال تعداد زیادی ایمیل بستگی به سرعت و مشخصات سرور خواهد داشت. زمان پردازش ایمیل ها نیز به شرکت ارائه دهنده خدمات ایمیل بستگی دارد. زمانی که بخواهید یک سیستم ایمیل مارکتینگ برای ارسال تعداد زیادی ایمیل در روز توسط مشتریانتان راه اندازی کنید، استفاده از صف ها به مقیاس پذیری (Scalability) و کارآمد (efficient) بودن اپلیکیشن شما کمک شایانی خواهد کرد.
از سال ۸۹ - ۹۰ وارد حوزه ی برنامه نویسی شدم و انواع زمینه ها و شاخه های مختلف رو کار کردم تا اینکه سال ۹۵ توی حوزه ی بک اند (نود جی اس) ماندگار شدم، تجربیات خیلی زیادی رو توی این مسیر کسب کردم. شکست ها و موفقیت هایی رو هم داشتم که همه ی این موارد رو در قالب مقاله، دوره و پادکست در اختیارتون خواهم گذاشت خلاصه که وبسایت کدنایت رو سال ۱۴۰۲ توسعه دادیم که یک پلتفرم آموزشی با گروهی از اساتید خفن هستش که قراره کلی محتوا در اختیارتون بذاریم.