سلام، چند وقت پیش که در یک پروژه جدید مشغول به کار شدم چون پروژه بزرگی بود چالش های زیادی هم داشت، چالش هایی که ساعت ها شاید هم روز ها چند نفر رو درگیر خودش میکنه تا حل بشه و همونطور که میدونیم گاهی وقتا زمان برای ما خیلی ارزشمندتر میشه و باید سریع تر مشکلات پروژه رو رفع کنیم.
به همین خاطر تصمیم گرفتم چالش هایی که باهاشون رو به رو میشیم رو اینجا توضیح بدم شاید باعث بشه افراد دیگه چندین ساعت درگیر مسئله نشن.
ماژول nodemailer: از این ماژول برای ارسال ایمیل استفاده میشه و میتونید تقریبا همه mail server هارو بهش متصل کنید و در اپلیکیشن های نود جی اسی به راحتی آب خوردن ایمیل ارسال کنید. من سرور های gmail, sendinblue, mailgun و سرورهایی که هاست های ساده هم در اختیارمون قرار میدن رو با استفاده از nodemailer به راحتی در اپلیکیشن ها قرار دادم.
سرویس sendinblue: از این سرویس برای ایمیل مارکتینگ بیشتر استفاده میشه ولی از اونجایی که خدمات خوبی داره میشه در همه مواردی که ارسال ایمیل لازم هست ازش استفاده کرد.
میتونین ایمیل هارو دنبال کنید و بفهمید چند درصد از ملت ایمیل رو باز کردن و روی دکمه ای که قرار دادید کلیک کردن، میتونین همونجا مشخصات ملت رو ذخیره کنین که تو کمپین ها بهشون ایمیل بدین، میتونین template تعریف کنین، قالب هارو با ویرایشگر مخصوص خودش طراحی کنین و خیلی چیزای دیگه.
یکی دیگه از نکات مثبت SIB اینه که اجازه میده 1000 ایمیل در دقیقه ارسال کنین که اگه اکانت enterprise داشته باشید این تعداد به 100.000 ایمیل میرسه!
نکته: ما این سرویس رو از نجوا خریداری کردیم.
داکیومنت خود SIB به بهترین شکل همه چیز رو توضیح داده و پنل نجوا هم اطلاعات کانفیگ رو داشت.
من با اطلاعات SIB کانفیگ nodemailer رو انجام دادم، تست کردم و همه چیز اوکی بود، باید ایمیل ارسال میشد و اطلاعات کاربر از یک گروه در SIB به یک گروه دیگه منتقل میشد که دسته بندی کاربر هارو برای ایمیل مارکتینگ داشته باشیم.
تا اینجا که همه چیز خوب کار میکرد، کد روی سیستم خودم و لوکال بود، وقتی کد رو پوش کردیم و رفتیم برای تست، خطای connection refused میگرفتیم. سرویس اصلی که تاییدیه ایمیل و فراموشی رمز و... رو انجام میداد از mailgun استفاده میکرد، از شانس بد اون سرویس اعتبارش تموم شده بود و چون سرویس خارجی هست تمدیدش زمان بر و کمی مشکل بود، به همین خاطر مجبور بودیم اون سرویس هم تغییر بدیم و کلا از SIB استفاده کنیم که این ور تو دیوار بودیم ?
این وسط تیم پشتیبانی یک عالمه تماس داشت که چرا ایمیل تایید نمیاد چرا نمیتونم رمزمو برگردونمو فلان و به Product owner فشار میاوردن که مشکل حل بشه، PO عزیز هم از همون دست استرسش رو به ما تقدیم میکرد که بابا لاستیکای پروژه ترکیده درست کنین این وضع رو (? البته بنده خدا خیلیم استرس نمیداد ولی پیگیر بود دیگه)
خلاصه که ما اول برای اطمینان روی لوکال دوباره تست کردیم و مشکلی نبود (مستقیم با smtp وصل میشدیم) ولی همچنان سرور مشکل داشت، بعد از کمی جستجو متوجه شدیم که خود nodemailer از SIB پشتیبانی میکنه و فقط کافیه اسم سرویس رو بهش بدیم دیگه کانفیگ لازم نداره، این کار هم انجام دادیم و نشد ?♂️.
با پشتیبانی نجوا صحبت کردیم گفتن اول curl رو تست کنین روی سرور ببینین ارسال میشه یا نه، ارسال شد! ولی این فقط تست بود. با این حال تصمیم گرفتیم از axios کمک بگیریم که قطعا اشتباهه ولی میخواستیم موقتا کار راه بیفته تا بتونیم بهتر فکر کنیم...
با axios تلاش کردیم و همچنان مشت ها روی کیبورد و کله ها توی دیوار کوبیده میشد، این راه هم جواب نداد...
رفتم داکیومنت SIB رو خوندم، اگه شماهم خونده باشین خود سیب (خسته شدم انقد زبان کیبوردو عوض کردم ?) یک پکیج داره که تمام خدماتش رو میشه باهاش انجام داد، حتی ارسال ایمیل، یعنی دیگه به nodemailer نیازی نبود. سرویس رو تغییر دادیم و از پکیج استفاده کردیم و در کمال تعجب بازم جواب نداد ?
این هم بگم که تو این چند ساعتی که با هف هش خط توضیح دادم متوجه شدیم سرور داره مسخره بازی در میاره و اجازه نمیده ایمیل ارسال کنیم ( البته شک داشتیم چون با mailgun مشکل نداشت )
با یکی از بچهای بکند رفتیم به اعماق تاریک stackoverflow ، جایی که حتی نویسنده سوال هام بهش سر نمیزدن. بعد از ساعت ها گشتن در اعماق استک و افق مسطح نجوا که هیچ توضیح درست حسابی ای نداشت مشکل رو پیدا کردیم ?
همونطور که احتمالا نمیدونین نصف اعظم زمانی که صرف رفع باگ میشه، به خاطر پیدا کردن مشکل هست!
عنی وی، کانفیگی که نجوای عزیز داده بود با پورت 587 بود، ظاهرا خود کانفیگی هم که nodemailer برای سیب استفاده میکرد از همین پورت بود و مثل اینکه این پورت امن نیست و احتمالا فایروال سرور اجازه نمیداد از این پورت استفاده کنیم.
پورت رو به 465 تغییر دادیم و حل شد!
حقیقتا انقد ضایع و ناگهانی حل شد که پوکر نشسته بودیم و با بی اعتنایی خبر دادیم ک اره مشکل حل شد ?? داستانش سر ی عدد مسخره بود ک نجوا هم هیچ اشاره ای نکرده بود چون احتمالا خودشونم خبر ندارن. میدونم ک خودمون باید حدس میزدیم ولی چون مسئله پیش پا افتاده ای بود کسی اشاره ای نکرد و چون ما تازه کارا آشنا نبودیم هیچ توجهی نکردیم ?
خلاصه اینکه از ریشه دنبال مشکل بگردین و به نکات ساده هم توجه کنین، تا چالشی دیگر بدرود ✋?