কয়েক বছর ধরে, কুইন্সি লারসন ফ্রিকোডক্যাম্পের মেইল ফর গুড প্ল্যাটফর্মের মাধ্যমে একটি সাপ্তাহিক ইমেল নিউজলেটার পাঠিয়েছেন, যা অ্যামাজন এসইএস দ্বারা চালিত।
তিনি সম্প্রতি এই প্রক্রিয়াটি সেন্ডগ্রিডে স্থানান্তরিত করেছেন। এই নিবন্ধে, আমি আপনাকে দেখাব কিভাবে আমি এটি সম্পন্ন করার জন্য একটি টুল তৈরি করেছি।
কিভাবে একটি সেন্ডগ্রিড অ্যাকাউন্ট সেট আপ করবেন
প্রথম ধাপ হল SendGrid-এর জন্য নিবন্ধন করা এবং আপনার অ্যাকাউন্ট সেট আপ করা। এই টিউটোরিয়ালের উদ্দেশ্যে, বিনামূল্যের স্তরটি যথেষ্ট হওয়া উচিত।
আপনি যখন আপনার আবেদন স্কেল বাড়ান, আপনাকে প্ল্যাটফর্মের মাধ্যমে আপনার উপলব্ধ ইমেল সীমা বাড়াতে হতে পারে।
সেন্ডগ্রিডে একটি ডেডিকেটেড আইপি ঠিকানা কীভাবে সেট আপ করবেন
ডিফল্টরূপে, সেন্ডগ্রিড ইমেল পাঠানোর জন্য শেয়ার করা আইপি ঠিকানা ব্যবহার করে। এটি ছোট আকারের ইমেল অ্যাপ্লিকেশনগুলির জন্য গ্রহণযোগ্য হতে পারে, তবে আপনি আপনার প্রেরণের হার বাড়ালে আপনাকে একটি ডেডিকেটেড আইপি ঠিকানা সেট আপ করতে হবে।
এটি একটি ভাল ধারণা, কারণ আপনার "প্রেরকের খ্যাতি" (মেট্রিক সেন্ডগ্রিড ইমেল পরিষেবা প্রদানকারীদের সাথে আপনার অবস্থান মূল্যায়ন করতে ব্যবহার করে) একই আইপি শেয়ার করা অন্যান্য ব্যবহারকারীদের ক্রিয়াকলাপের দ্বারা নেতিবাচকভাবে প্রভাবিত হবে না৷
আপনার নিজস্ব ডেডিকেটেড আইপি সেট আপ করতে, পাশের নেভিগেশন মেনু থেকে "সেটিংস" বিকল্পটি নির্বাচন করুন, তারপরে "আইপি ঠিকানা" নির্বাচন করুন। শুধু একটি দ্রুত নোট, যাইহোক:এই বিকল্পটি বিনামূল্যে স্তরে অনুপলব্ধ।
আপনার প্রদত্ত প্ল্যানের উপর নির্ভর করে, আপনার ইতিমধ্যে একটি ডেডিকেটেড IP ঠিকানা সেট আপ থাকতে পারে। আপনার যদি একটি না থাকে, বা আপনি যদি আরও যোগ করতে চান, তাহলে আপনি একটি নতুন আইপি কনফিগার করতে "একটি আইপি ঠিকানা যোগ করুন" বোতামটি নির্বাচন করতে পারেন৷

সেন্ডগ্রিডে একজন ইমেল প্রেরককে কীভাবে অনুমোদন দেওয়া যায়
দ্রষ্টব্য:আপনি যদি আপনার ইমেলের জন্য একটি কাস্টম ডোমেন ব্যবহার করেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন৷
আপনার ব্যক্তিগত ইমেল ঠিকানা থেকে ইমেল পাঠাতে, আপনাকে যাচাই করতে হবে যে ইমেল ঠিকানাটি আপনারই।
বাম মেনুতে, "সেটিংস" নির্বাচন করুন, তারপর "প্রেরক প্রমাণীকরণ"। আপনার একটি ইমেল ঠিকানা যোগ করার প্রবাহের মধ্য দিয়ে যেতে "একক প্রেরক যাচাই করুন" চয়ন করুন৷

কিভাবে সেন্ডগ্রিডে আপনার কাস্টম ডোমেন প্রমাণীকরণ করবেন
দ্রষ্টব্য:আপনি যদি আপনার ইমেলগুলির জন্য একটি কাস্টম ডোমেন ব্যবহার না করেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন৷
আপনার কাস্টম মেল ডোমেন থেকে ইমেল পাঠানোর জন্য, আপনাকে সেন্ডগ্রিডের সাথে সেই ডোমেনটিকে প্রমাণীকরণ করতে হবে। এই স্ক্রিনে যেতে, সেটিংস মেনু আবার নির্বাচন করুন, তারপর "প্রেরক প্রমাণীকরণ" নির্বাচন করুন।

তারপরে আপনাকে "ডোমেন প্রমাণীকরণ" এর বিকল্প সহ একটি স্ক্রীন দেখতে হবে। "আপনার ডোমেন প্রমাণীকরণ করুন" বিকল্পটি নির্বাচন করুন এবং SendGrid আপনাকে আপনার DNS রেকর্ড কনফিগার করার প্রক্রিয়ার মধ্য দিয়ে নিয়ে যাবে (আপনার DNS প্রদানকারীর উপর ভিত্তি করে নির্দিষ্ট নির্দেশাবলী সহ)।

সেন্ডগ্রিডে কীভাবে বিপরীত ডিএনএস সেট আপ করবেন
দ্রষ্টব্য:আপনি যদি আপনার ইমেলের জন্য একটি কাস্টম ডোমেন ব্যবহার না করেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন৷
রিভার্স ডিএনএস (ডোমেন নেম সিস্টেম) একটি প্রদত্ত আইপি ঠিকানার মালিকের সন্ধান করতে ইমেল প্রদানকারীরা ব্যবহার করে। এটি সেট আপ করলে ইমেল প্রদানকারীদের আপনি যে আইপি ঠিকানা থেকে একটি ইমেল পাঠান সেটি আপনার কাস্টম ডোমেনের সাথে সংযুক্ত কিনা তা যাচাই করার অনুমতি দেবে৷
উপরের মত একই প্রেরক প্রমাণীকরণ স্ক্রিনে, আপনি একটি "বিপরীত DNS" বিভাগ দেখতে পাবেন। আপনার অ্যাকাউন্টে থাকা প্রতিটি ডেডিকেটেড IP-এর জন্য বিপরীত DNS কনফিগার করার একটি বিকল্প থাকবে - যেমন ডোমেন প্রমাণীকরণ, সেন্ডগ্রিডের প্ল্যাটফর্ম আপনাকে এটি সেট আপ করার মাধ্যমে নিয়ে যাবে৷
সেন্ডগ্রিডে কীভাবে ইমেল প্রমাণীকরণ সেট আপ করবেন
দ্রষ্টব্য:আপনি যদি আপনার ইমেলের জন্য একটি কাস্টম ডোমেন ব্যবহার না করেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন৷
প্রধান ইমেল প্রদানকারীরা (যেমন Gmail, Yahoo, এবং Outlook) একটি ইমেল প্রেরককে প্রমাণীকরণের জন্য বিভিন্ন পদ্ধতি ব্যবহার করে:SPF, DKIM, এবং DMARC৷
- SPF (প্রেরক নীতি ফ্রেমওয়ার্ক) যাচাই করে যে আপনার ডোমেন থেকে মেল পাঠানোর আইপি ঠিকানা এটি করার জন্য অনুমোদিত৷
- DKIM (DomainKeys আইডেন্টিফাইড মেল) একটি ইমেল
fromপ্রমাণীকরণ করতে সর্বজনীন কী স্ট্রিং ব্যবহার করে ঠিকানা সঠিক এবং জালিয়াতি/মিথ্যা নয়। - DMARC (ডোমেন-ভিত্তিক বার্তা প্রমাণীকরণ, রিপোর্টিং এবং কনফরমেন্স) নির্দেশাবলীর একটি সেট যা ইমেল প্রদানকারীদের বলে যে কিভাবে প্রতিক্রিয়া জানাতে হবে যখন একটি ইমেল এসপিএফ বা ডিকেআইএম যাচাইকরণে ব্যর্থ হয়।
SendGrid এর প্রমাণীকরণ প্রবাহ আপনাকে ডোমেন প্রমাণীকরণ প্রক্রিয়ার অংশ হিসাবে SPF এবং DKIM সেট আপ করার মাধ্যমে নিয়ে যাবে, তবে আপনাকে আপনার DMARC ম্যানুয়ালি কনফিগার করতে হবে।
আপনার DNS হোস্টিং প্রদানকারীতে যান এবং DNS ব্যবস্থাপনা সেটিংস অ্যাক্সেস করুন। সেখান থেকে, একটি নতুন TXT যোগ করুন _dmarc.yourdomain.com নামের সাথে রেকর্ড করুন (yourdomain.com প্রতিস্থাপন করা হচ্ছে আপনার কাস্টম ডোমেনের সাথে)।
মনে রাখবেন যে কিছু প্রদানকারী, যেমন GoDaddy, স্বয়ংক্রিয়ভাবে আপনার ডোমেন রেকর্ডে যুক্ত করবে - এই ক্ষেত্রে, নামটি হওয়া উচিত _dmarc .
মান এই রেকর্ডের একটি অনুরূপ কাঠামো নেওয়া উচিত:
"v=DMARC1; p=none; pct=100; rua=mailto:dmarc@yourdomain.com" v=DMARCব্যবহার করার জন্য DMARC নিয়মের সংস্করণ নির্দেশ করে (বর্তমানে শুধুমাত্র সংস্করণ 1 উপলব্ধ)।p=noneএকটি ইমেল DKIM বা SPF ব্যর্থ হলে একটি ইমেল প্রদানকারীর কি পদক্ষেপ নেওয়া উচিত তা নির্দেশ করে৷ এই সেটিংটিnoneহিসাবে শুরু হওয়া উচিত , আপনার ইমেল বিতরণযোগ্যতা প্রভাবিত এড়াতে. একবার আপনি নিশ্চিত করেছেন যে আপনার DKIM এবং SPF সঠিকভাবে কনফিগার করা হয়েছে, আপনি এই মানটিকেquarantine-এ আপডেট করতে পারেন প্রদানকারীরা স্বয়ংক্রিয়ভাবে ব্যর্থ ইমেলগুলিকে স্প্যাম ফোল্ডারে বাrejectরুট করে প্রদানকারীরা প্রত্যাখ্যান/বাউন্স ব্যর্থ ইমেল আছে.pct=100ব্যর্থ ইমেলগুলির শতকরা হার নির্দেশ করে যেখানে ক্রিয়াটি প্রয়োগ করা উচিত৷rua=mailto:dmarc@yourdomain.comসমষ্টিগত রিপোর্ট পাঠাতে ইমেল ঠিকানা. এই রিপোর্টগুলিতে আপনার আইপি থেকে সমস্ত ইমেলের তথ্য রয়েছে যা একটি প্রদত্ত প্রদানকারীর দ্বারা প্রাপ্ত হয়েছিল।dmarc@yourdomain.comপ্রতিস্থাপন করুন যে ইমেল ঠিকানা দিয়ে আপনি সেই রিপোর্টগুলি পেতে চান৷
৷
কিভাবে সেন্ডগ্রিডে একটি ডায়নামিক টেমপ্লেট তৈরি করবেন
আমরা আজ যে টুলটি তৈরি করব সেটি একটি ইমেলের বিষয় এবং বডি টেক্সট সেট করতে SendGrid-এর গতিশীল টেমপ্লেট বৈশিষ্ট্য ব্যবহার করে। এটি সেট আপ করতে, পাশের নেভিগেশন মেনুতে "ইমেল API" বিকল্পটি নির্বাচন করুন, তারপরে "ডাইনামিক টেমপ্লেট" নির্বাচন করুন৷

আপনি আপনার প্রথম গতিশীল টেমপ্লেট তৈরি করার জন্য একটি প্রম্পট সহ একটি স্ক্রীন দেখতে পাবেন। "একটি ডায়নামিক টেমপ্লেট তৈরি করুন" বিকল্পটি নির্বাচন করুন।
আপনার নতুন টেমপ্লেটকে একটি নাম দিন:"freeCodeCamp SendGrid Tutorial"। SendGrid এই টেমপ্লেটটিকে উপলব্ধ টেমপ্লেটের তালিকায় যুক্ত করবে। Template ID দেখতে টেমপ্লেটটি নির্বাচন করুন (এটি একটি নোট করুন, কারণ আমাদের পরে টুলের জন্য এটি প্রয়োজন হবে) এবং "সংস্করণ যোগ করুন" বোতামে ক্লিক করুন৷

প্রদর্শিত স্ক্রিনে "ব্ল্যাঙ্ক টেমপ্লেট" নির্বাচন করুন, তারপরে "কোড এডিটর" নির্বাচন করুন। আপনি এখন সম্পাদক দৃশ্য দেখতে হবে. সেন্ডগ্রিডের সম্পাদক ইমেল বডি তৈরি করতে HTML ব্যবহার করে - তবে, যখন আমরা আমাদের টুল তৈরি করব তখন আমরা প্লেইন টেক্সট সংস্করণ পাঠাব।
আপাতত, সম্পাদকের বিষয়বস্তুকে নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:
<p>This is a test email used with the freeCodeCamp SendGrid tutorial</p>
<p>Unsubscribe: {{{unsubscribeId}}}</p>
আপনি লক্ষ্য করবেন যে আমরা {{{unsubscribeId}}} যোগ করেছি . SendGrid-এর টেমপ্লেট হ্যান্ডেলবার ব্যবহার করে মানগুলিকে গতিশীলভাবে প্রতিস্থাপন করতে - আমরা যখন টুলটি তৈরি করব তখন আমরা এই বৈশিষ্ট্যটি ব্যবহার করব।
এখন উপরের বাম দিক থেকে সেটিংস বিকল্পটি নির্বাচন করুন - আপনি ঐচ্ছিকভাবে আপনার টেমপ্লেট সংস্করণটিকে একটি নাম দিতে পারেন, তবে "বিষয়" ক্ষেত্রটি আমরা যা পরিবর্তন করতে চাই। এই মানটিকে {{{subject}}} এ সেট করুন আমাদের টুল থেকে ডাইনামিক্যালি সাবজেক্ট ভ্যালু লোড করতে।
ডায়নামিক টেমপ্লেট পরীক্ষা করতে, উপরের মেনু থেকে "টেস্ট ডেটা" বিকল্পটি নির্বাচন করুন। সেখানে সম্পাদকে এই JSON ডেটা প্রবেশ করান:
{
"unsubscribeId": "1",
"subject": "Testing emails!"
}
আপনি এখন টেমপ্লেটে এই মানগুলিকে প্রতিফলিত করে স্ক্রিনের ডানদিকে প্রিভিউ দেখতে পাবেন। মনে রাখবেন Save টিপতে আপনার পরিবর্তনগুলি সংরক্ষণ করতে বোতাম!

কিভাবে সেন্ডগ্রিডে একটি API কী তৈরি করতে হয়
আপনার SendGrid অ্যাকাউন্ট কনফিগার করার চূড়ান্ত ধাপ হল আমাদের টুল ব্যবহারের জন্য একটি API কী তৈরি করা।
মূল সেন্ডগ্রিড পৃষ্ঠায় ফিরে যেতে উপরের বাম দিকের পিছনের তীরটিতে ক্লিক করুন। তারপরে "সেটিংস" এবং "এপিআই কী" নির্বাচন করুন। একটি নতুন কী তৈরি করতে "এপিআই কী তৈরি করুন" চয়ন করুন৷ আপনি ঐচ্ছিকভাবে আপনার কীটিতে "সম্পূর্ণ অ্যাক্সেস" মঞ্জুর করতে পারেন, তবে এই টিউটোরিয়ালটির উদ্দেশ্যে আপনার শুধুমাত্র "মেল পাঠান" অ্যাক্সেসের প্রয়োজন হবে।
আপনার কীটিকে একটি বর্ণনামূলক নাম দিতে ভুলবেন না যাতে আপনি যদি এই স্ক্রীনটি আবার অ্যাক্সেস করেন তবে আপনি এর উদ্দেশ্য মনে রাখবেন। একবার আপনার অনুমতিগুলি কনফিগার হয়ে গেলে, কী তৈরি করতে "তৈরি করুন এবং দেখুন" নির্বাচন করুন - এটি নিরাপদ কোথাও সংরক্ষণ করুন কারণ আপনি এটি আবার দেখতে পারবেন না .

ইমেল টুল কিভাবে তৈরি করবেন
এখন কিছু ইমেল পাঠানোর জন্য কোড লেখার সময় এসেছে। আপনি আমাদের লাইভ অ্যাপ্লিকেশনের জন্য কোডটি দেখতে পারেন, কিন্তু এই টিউটোরিয়ালের উদ্দেশ্যে আমরা প্রাথমিকভাবে SendGrid API ব্যবহার করার উপর ফোকাস করার জন্য একটি সামান্য সংক্ষিপ্ত সংস্করণ তৈরি করব৷
কাস্টম ইমেল ক্যাম্পেইন স্ক্রিপ্টের জন্য প্রয়োজনীয় সফ্টওয়্যার
এই প্রকল্পের সাথে কাজ করার জন্য আপনাকে নিম্নলিখিত সরঞ্জামগুলি ইনস্টল করতে হবে:
- Node.js - LTS সংস্করণ সুপারিশ করা হয়
- একটি IDE, যেমন VSCode বা Atom
আপনি ঐচ্ছিকভাবে gitও চাইতে পারেন সংস্করণ নিয়ন্ত্রণের জন্য।
আমাদের লাইভ টুল একটি MongoDB Atlas ক্লাস্টার ব্যবহার করে, কিন্তু আমাদের টিউটোরিয়াল উদাহরণ তা করবে না। আপনি যদি MongoDB-এর সাথে পরিচিত না হন, তাহলে FreeCodeCamp-এর পাঠ্যক্রমে MongoDB সেট আপ এবং ব্যবহার করার একটি চমৎকার বিভাগ অন্তর্ভুক্ত রয়েছে।
কিভাবে প্রকল্পটি শুরু করবেন
এই প্রকল্পে কাজ করার জন্য একটি ডিরেক্টরি (ফোল্ডার) তৈরি করুন। তারপর আপনার সম্পাদক এবং পছন্দের টার্মিনাল দিয়ে সেই ফোল্ডারটি খুলুন৷
শুরু করার জন্য, আমাদের এটি একটি নোড প্রকল্প হিসাবে সেট আপ করতে হবে। এটি করার দ্রুততম উপায় হল npm init আপনার টার্মিনালে। এটি আপনাকে একটি package.json তৈরি করে নিয়ে যাবে৷ যা একটি নোড অ্যাপ্লিকেশনের মূল ফাইল।
ডিফল্ট মান আমাদের অ্যাপ্লিকেশনের জন্য ঠিক কাজ করবে, কিন্তু আমরা scripts পরিবর্তন করতে চাই বিভাগ:
"scripts": {
"build": "tsc",
"send": "node ./prod/send.js"
}, npm init একটি test তৈরি করবে স্ক্রিপ্ট - এটি আমাদের প্রকল্পের জন্য সরানো যেতে পারে।
build জাভাস্ক্রিপ্টে আমাদের টাইপস্ক্রিপ্ট কম্পাইল করতে স্ক্রিপ্ট ব্যবহার করা হবে, এবং send স্ক্রিপ্ট আমাদের অ্যাপ্লিকেশন চালাবে।
এরপর আমরা TypeScript ইন্সটল ও সেট আপ করব। আপনি যদি টাইপস্ক্রিপ্টের সাথে পরিচিত না হন তবে এটি মূলত জাভাস্ক্রিপ্টের একটি সুপারসেট যা শক্তিশালী টাইপ সংজ্ঞা এবং কম্পাইল-টাইম ত্রুটি পরীক্ষা করে।
আপনার প্রকল্পে TypeScript ইনস্টল করতে, npm install --save-dev typescript চালান আপনার টার্মিনালে। (--save-dev পতাকা এটিকে একটি বিকাশ নির্ভরতা হিসাবে সংরক্ষণ করে - রানটাইমে টাইপস্ক্রিপ্টের প্রয়োজন হয় না তাই একটি উত্পাদন পরিবেশে পরিষ্কার করা যেতে পারে)।
জাভাস্ক্রিপ্ট ফাইল তৈরি করার সময় যে নিয়মগুলি অনুসরণ করা উচিত তা সেট করার জন্য টাইপস্ক্রিপ্টের নিজস্ব কনফিগারেশন ফাইল প্রয়োজন। আপনার প্রকল্পের রুট ডিরেক্টরিতে tsconfig.json নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিত সন্নিবেশ করান:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./prod",
"rootDir": "./src"
}
} excludes দেখতে পাবেন সম্পত্তি সেই মান টিউটোরিয়াল ফাইল কাঠামোর জন্য নির্দিষ্ট এবং আপনার এটির প্রয়োজন হবে না।সংক্ষিপ্ততার জন্য, আমরা এই কনফিগারেশন সেটিংসে ডুব দেব না। আপনি যদি অতিরিক্ত তথ্য চান, TypeScript-এ অত্যন্ত গভীর ডকুমেন্টেশন রয়েছে।
আপনি যদি git ব্যবহার করেন সংস্করণ নিয়ন্ত্রণের জন্য এবং এটি একটি সংগ্রহস্থলে আপলোড করার জন্য (যেমন GitHub), আপনি একটি .gitignore তৈরি করতে চাইবেন আপনার প্রকল্পের রুট ডিরেক্টরিতে ফাইল করুন। এই ফাইলটিতে থাকা উচিত:
/node_modules/
.env
/prod/ /node_modules/ইনস্টল করা প্যাকেজ উপেক্ষা করবে। সংস্করণ নিয়ন্ত্রণের সাথে কাজ করার সময় এটি একটি সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয়৷.envআমাদের পরিবেশ ভেরিয়েবল ফাইল উপেক্ষা করবে. এটি খুবই গুরুত্বপূর্ণ কারণ আপনি কখনই না৷ আপনার গোপনীয়তাকে একটি ভান্ডারে দিতে চান৷/prod/আমাদের কম্পাইল করা জাভাস্ক্রিপ্ট ফাইল উপেক্ষা করবে। আমরা আমাদের ইমেল তালিকার জন্যও এই ফোল্ডারটি ব্যবহার করব, তাই ভুলবশত সেই ব্যক্তিগত শনাক্তযোগ্য তথ্যটি এড়ানো গুরুত্বপূর্ণ৷
একটি .env তৈরি করুন আপনার রুট প্রকল্প ডিরেক্টরিতে ফাইল করুন। আমরা এই ফাইলের মাধ্যমে নিম্নলিখিত পরিবেশ ভেরিয়েবলগুলি লোড করব:
SENDGRID_API_KEY=
SENDGRID_FROM=
SENDGRID_TEMPLATE_ID=
MAIL_SUBJECT= = এর আশেপাশে কোনো স্থান নেই সাইন!SENDGRID_API_KEYআগের ধাপে আপনার তৈরি করা API কী হওয়া উচিত।SENDGRID_FROMআপনার ইমেল ঠিকানা হওয়া উচিত (এটিfrom-এর জন্য ব্যবহৃত ঠিকানা ক্ষেত্র)।SENDGRID_TEMPLATE_IDidহওয়া উচিত আপনার আগে তৈরি করা ডায়নামিক টেমপ্লেটের জন্য স্ট্রিং।MAIL_SUBJECTআপনার পাঠানো ইমেলগুলির জন্য বিষয় লাইন হবে। আপাতত, এটিকে "fCC টিউটোরিয়াল ইমেল" হিসাবে সেট করুন৷
অবশেষে, একটি src তৈরি করুন আপনার রুট প্রকল্প ডিরেক্টরিতে ফোল্ডার, এবং একটি send.ts তৈরি করুন সেই ফোল্ডারে ফাইল।
কিভাবে আপনার নির্ভরতা ইনস্টল করবেন
প্রথমে আমাদের sendgrid ইনস্টল করতে হবে Node.js প্যাকেজ। এই প্যাকেজটি SendGrid API-এর জন্য একটি মোড়ক হিসাবে কাজ করে এবং ইমেল পাঠানোর জন্য API কল করার জন্য আমাদের প্রক্রিয়াটিকে স্ট্রিমলাইন করবে। npm install @sendgrid/mail চালান এই প্যাকেজ ইন্সটল করতে।
তারপর আমরা উন্নয়ন নির্ভরতা একটি দম্পতি প্রয়োজন. npm install --save-dev dotenv @types/node চালান .
dotenvআমাদের.envথেকে পরিবেশ ভেরিয়েবল লোড করার অনুমতি দেবে স্থানীয়ভাবে ফাইল করুন।@types/nodeNode.js-এর জন্য টাইপ সংজ্ঞা প্রদান করে - টাইপস্ক্রিপ্ট অন্তর্নির্মিত পদ্ধতি এবং ফাংশনগুলির গঠন বোঝার জন্য এই সংজ্ঞাগুলির উপর নির্ভর করে৷
কিভাবে যুক্তি লিখতে হয়
এখন আমরা আমাদের /src/send.ts এ কাজ করব ফাইল - এখানেই আমরা আমাদের অ্যাপ লজিকের বড় অংশ তৈরি করছি। আমরা আমাদের প্যাকেজগুলি থেকে প্রয়োজনীয় মানগুলি আমদানি করে শুরু করব৷
প্রথমে আমরা dotenv লোড করতে চাই প্যাকেজ করুন এবং আমাদের পরিবেশ ভেরিয়েবল পার্স করুন।
import dotenv from "dotenv";
dotenv.config(); dotenv শুধুমাত্র স্থানীয় উন্নয়নের জন্য প্রয়োজন - বেশিরভাগ অনলাইন হোস্ট যেমন Heroku এবং Repl.it নেটিভভাবে পরিবেশের ভেরিয়েবলগুলি পরিচালনা করতে পারে
dotenv.config() কল আমাদের .env পড়ে ফাইল করে এবং process.env-এ মান লোড করে নোড অবজেক্ট।
এরপর আমরা সেন্ডগ্রিড প্যাকেজ থেকে প্রয়োজনীয় মডিউলগুলি আমদানি করি:
import sgMail, { MailDataRequired } from "@sendgrid/mail";
sgMail প্রাথমিক API মোড়ক, এবং MailDataRequired একটি টাইপ সংজ্ঞা আমাদের প্রয়োজন হবে৷
অবশেষে, আমরা আমাদের ফাইলগুলি পরিচালনা করার জন্য কিছু অন্তর্নির্মিত নোড বৈশিষ্ট্য আমদানি করি:
import path from "path";
import { createWriteStream, readFile } from "fs"; pathআপেক্ষিক পাথের সাথে আমাদের ইমেল তালিকা ফাইলগুলি সনাক্ত করতে ব্যবহার করা হবেfsসেই ফাইলগুলি পড়তে এবং লিখতে ব্যবহৃত হবে
যুক্তি নির্মাণ শুরু করার সময়! আমাদের অ্যাপ্লিকেশনটি .env-এ সেট করা কিছু প্রয়োজনীয় মানগুলির উপর নির্ভর করে ফাইল, তাই আমাদের যাচাই করে শুরু করতে হবে যে সেই ভেরিয়েবলগুলি সঠিকভাবে সেট করা আছে। যদি কেউ অনুপস্থিত থাকে, আমরা ইমেল পাঠানোর সময় ত্রুটিগুলি এড়াতে আমাদের অ্যাপ্লিকেশনটি তাড়াতাড়ি প্রস্থান করতে চাই৷
// Here we check for a valid API key
const apiKey = process.env.SENDGRID_API_KEY;
if (!apiKey) {
console.error("Missing SendGrid Key");
process.exit(1);
}
// Here we check for a valid from address
const fromAddress = process.env.SENDGRID_FROM;
if (!fromAddress) {
console.error("Missing sender email address!");
process.exit(1);
}
// Here we check for a dynamic template ID
const sgTemplate = process.env.SENDGRID_TEMPLATE_ID;
if (!sgTemplate) {
console.error("Missing SendGrid Template ID");
process.exit(1);
}
// Here we check for the mail subject, but if it is missing
// we do not need to exit. Instead we use a fallback value.
const subjectValue = process.env.MAIL_SUBJECT || "Fallback value - check your env!"; || সিনট্যাক্স কোডকে বলে যে যদি process.env.MAIL_SUBJECT অসংজ্ঞায়িত বা মিথ্যা, পরিবর্তে স্ট্রিং ব্যবহার করুন।
process.exit(1) প্রতিটি কন্ডিশন চেক করলে কল করলে নোডকে 1 এর প্রস্থান কোড সহ প্রক্রিয়া (আমাদের আবেদন) বন্ধ করতে বলে। . এটি নির্দেশ করে যে এই চেকগুলির মধ্যে একটি ব্যর্থ হওয়ার কারণে আমাদের অ্যাপ্লিকেশন ক্র্যাশ হয়েছে৷
SendGrid-এর জন্য আমাদের API কী সেট করতে হবে। আপনার পরিবেশ পরিবর্তনশীল যুক্তির নীচে, কী সেট করতে ফাংশন কল যোগ করুন।
// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);
এগিয়ে যাওয়ার আগে, এগিয়ে যান এবং npm run build চালান আপনার টার্মিনালে - এটি একটি prod তৈরি করবে আমাদের সংকলিত জাভাস্ক্রিপ্ট ধারণকারী ফোল্ডার. আপনি এখন নিম্নলিখিত ফাইল গঠন দেখতে হবে:

এই সময়ে, আপনি যদি git ব্যবহার করেন আপনি খুব নিশ্চিত হতে চান যে prod ফোল্ডার আপনার সংগ্রহস্থলে প্রতিশ্রুতিবদ্ধ হবে না।
prod-এর মধ্যে ফোল্ডার, একটি validEmails.csv তৈরি করুন ফাইল আমাদের অ্যাপটি ইমেল তালিকা পড়তে এই ফাইলটি ব্যবহার করবে। নিম্নলিখিত বিষয়বস্তু দিয়ে ফাইলটি শুরু করুন (your@email.com প্রতিস্থাপন করুন আপনার প্রকৃত ইমেল ঠিকানা সহ):
email,unsubscribeId
your@email.com,1
iama@fake.email,2 .csv ফাইলে কমার চারপাশে স্পেস নেই।
এখন আমরা এটিকে একটি ইমেল তালিকায় পার্স করার জন্য কোডটি লিখতে পারি! আপনার src/send.ts-এ ফাইল, এই কোড যোগ করুন:
// Here we concatenate our file path for the valid email file
const filePath = path.join(__dirname + "/../validEmails.csv");
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data)
}); function ব্যবহার করার জন্য আপনাকে স্বাগতম পরিবর্তে ঘোষণা, যদি আপনি পছন্দ করেন।
এখন আপনি যদি npm run build চালান এবং npm run send আপনি আমাদের validEmail.csv এর বিষয়বস্তু দেখতে পাবেন টার্মিনালে ফাইল করুন। আপনি যদি চান, আপনি এই বিন্দু পর্যন্ত আমাদের বর্তমান অগ্রগতি দেখতে পারেন।
দারুণ! এখন আমাদের সেই স্ট্রিংটিকে বস্তুর অ্যারেতে পার্স করতে হবে যাতে আমরা এটির মাধ্যমে পুনরাবৃত্তি করতে পারি এবং আমাদের ইমেল বার্তাগুলি তৈরি করতে পারি। আমাদের কলব্যাক ফাংশন আপডেট করুন:
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
// Here we parse the data into an object array
const emailList = data
.split("\n")
.slice(1)
.map((el) => {
const [email, unsubscribeId] = el.split(",");
return { email, unsubscribeId };
});
}); [email, unsubscribeId] এই দুটি ভেরিয়েবলে স্প্লিট অ্যারের মান নির্ধারণের জন্য ডিস্ট্রাকচারিং প্রয়োগ করে।.split("\n")লাইন ব্রেক দ্বারা স্ট্রিং বিভক্ত করে। দ্রষ্টব্য :আপনি যদি Windows এ থাকেন, তাহলে আপনাকে আপনারvalidEmails.csv-এর জন্য শেষ-লাইন সেটিং পরিবর্তন করতে হতে পারেCRLFথেকেLFএ (উইন্ডোজ অতিরিক্ত লাইনব্রেক অক্ষর সন্নিবেশিত করে যা আমাদের ডেটা পরিচালনাকে প্রভাবিত করবে).slice(1)সেই অ্যারের প্রথম উপাদানটি সরিয়ে দেয় (আমাদেরemail,unsubscribeIdলাইন)।- আমাদের
mapফাংশন প্রতিটিemail,unsubscribeIdরূপান্তর করবে একটি{email, unsubscribeId}এ স্ট্রিং বস্তু।
এই পার্সিং ফাংশনের শেষ ফলাফল হবে email সহ বস্তুর একটি অ্যারে এবং unsubscribeId বৈশিষ্ট্য - একটি স্ট্রিং তুলনায় অনেক মসৃণ সঙ্গে কাজ.

এখন কিছু ইমেল পাঠানোর সময়। আপনার পার্সিং ফাংশনের নীচে (কিন্তু এখনও readFile এর মধ্যে কলব্যাক) আমাদের পুনরাবৃত্তি পদ্ধতির জন্য কাঠামো যোগ করুন। কারণ আমরা অ্যারের প্রতিটি মান অ্যাক্সেস করতে চাই, আমরা .forEach ব্যবহার করব পন্থা।
// Here we iterate through the emailList array
emailList.forEach((user) => {}); user প্যারামিটার একটি {email, unsubscribeId} হবে বস্তু আমরা একে user বলেছি কারণ এটি সম্পূর্ণ অ্যাপ্লিকেশনে একটি freeCodeCamp userdata অবজেক্ট উপস্থাপন করে।
.forEach-এর জন্য কলব্যাকের মধ্যে , আমরা SendGrid API আশা করে বার্তা অবজেক্ট তৈরি করতে পারি।
// Here we iterate through the emailList array
emailList.forEach((user) => {
// This is the message object SendGrid needs
const message: MailDataRequired = {
to: user.email,
from: fromAddress,
subject: subjectValue,
text: "This goes away!",
templateId: sgTemplate,
dynamicTemplateData: {
subject: subjectValue,
unsubscribeId: user.unsubscribeId
}
}
});
এগিয়ে যাওয়ার আগে, আসুন এই বার্তা বস্তুটিকে আরও ঘনিষ্ঠভাবে দেখি। MailDataRequired আমরা আগে আমদানি করেছি এখানে টাইপ সংজ্ঞা হিসাবে ব্যবহার করা হয়েছে, তাই টাইপস্ক্রিপ্ট আমাদের সতর্ক করতে পারে যদি আমরা একটি প্রয়োজনীয় সম্পত্তি মিস করি। সৌভাগ্যক্রমে, আমাদের কাছে প্রয়োজনীয় সমস্ত বৈশিষ্ট্য রয়েছে। কিন্তু তারা কি মানে?
to:বার্তা পাঠাতে ইমেল ঠিকানা. এটি হবেemailআমাদেরvalidEmails.csvএর প্রতিটি লাইন থেকে ফাইলfrom:যে ইমেল ঠিকানা থেকে বার্তা পাঠানো হবে। এটি আমাদের.envএ সেট করা আছে আগে (এটি আপনার হওয়া উচিত ইমেল ঠিকানা)।subject:এই ক্ষেত্রটির প্রয়োজন নেই, কিন্তু ডায়নামিক টেমপ্লেট আমাদের বিষয়কে সঠিকভাবে পার্স না করলে এটি আমাদের একটি ফলব্যাক মান দেয়৷text:এই টেক্সট মান টেমপ্লেট দ্বারা ওভাররাইট করা হয়. যাইহোক, এটি এখনও ব্যবহার করা গুরুত্বপূর্ণ। SendGridplaintextহিসেবে ইমেল পাঠাতে পারে অথবাhtml-textব্যবহার করেhtmlএর পরিবর্তে সম্পত্তি সম্পত্তি, আমরা নিশ্চিত করি যে আমাদের টেমপ্লেটটিplaintextহিসাবে পাঠানো হয়েছে . ইমেল প্রদানকারীর সম্ভাব্যতা বেশি এইচটিএমএল বার্তাগুলিকে স্প্যাম হিসাবে পতাকাঙ্কিত করতে, তাই এটি আমাদের বিতরণযোগ্যতার হার বাড়াতে সহায়তা করে৷templateId:এটি ডায়নামিক টেমপ্লেটের আইডি SendGrid-এর ইমেলে ব্যবহার করা উচিত৷
৷ dynamicTemplateData:এই মানগুলি আমাদের হ্যান্ডেলবার স্ট্রিংগুলির সাথে মিলে যায় যা আমরা আগে ডায়নামিক টেমপ্লেটে সেট করেছি।
দারুণ! আমাদের পরবর্তী পদক্ষেপ হল এই তৈরি করা বার্তাটি নেওয়া এবং এটি পাঠানো। বার্তা অবজেক্টের নীচে (তবে এখনও .forEach এর মধ্যে কলব্যাক), আসুন আমাদের সেন্ড কল যোগ করি:
// Here we send the message we just constructed!
sgMail.send(message);
এটি আমাদের validEmails.csv-এর প্রতিটি ইমেলে বার্তা পাঠাবে . দুর্ভাগ্যবশত, আমাদের কোড নিঃশব্দে চলবে এবং প্রতিটি পাঠানো সফল হয়েছে কিনা তা আমরা জানতে পারব না। এর কিছু ত্রুটি হ্যান্ডলিং যোগ করা যাক.
.send() কল একটি প্রতিশ্রুতি প্রদান করে, তাই আমরা .then().catch() ব্যবহার করতে পারি রিটার্ন পরিচালনা করতে।
// Here we send the message we just constructed!
sgMail.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`)
}).catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`)
});
এখন আপনি যদি npm run build চালান এবং npm run send আপনি আপনার ইনবক্সে একটি সুন্দর ইমেল দেখতে পাবেন!
এই মুহুর্তে, আপনার কাছে এখন একটি কার্যকরী ইমেল পাঠানোর অ্যাপ্লিকেশন রয়েছে। অভিনন্দন! আপনি চাইলে এই বিন্দু পর্যন্ত আমাদের অগ্রগতি দেখতে পারেন।
বাউন্স হওয়া ইমেলগুলি কীভাবে পরিচালনা করা যায় এবং প্রেরণ ব্যর্থতার জন্য অতিরিক্ত যুক্তি দেখতে পড়ুন, যা আমরা পরবর্তী আলোচনা করব৷
সেন্ডগ্রিডে বাউন্স হওয়া ইমেলগুলি কীভাবে পরিচালনা করবেন
আপনি হয়ত লক্ষ্য করেছেন যে iama@fake.email এটি একটি বাস্তব ইমেল ঠিকানা নয়। SendGrid আপনার আগের দিনের কার্যকলাপের জন্য প্রতিদিন বাউন্সড রিপোর্ট তৈরি করবে।
প্রতিটি বাউন্স করা ইমেল আপনার সেন্ডগ্রিড খ্যাতিকে আঘাত করে এবং ইমেল প্রদানকারীরা আপনার মেলকে স্প্যাম হিসাবে চিহ্নিত করতে পারে। সুতরাং, পরিচিত বাউন্সিং ঠিকানায় পাঠানো প্রতিরোধ করার জন্য আমাদের যুক্তি যোগ করতে হবে।
একটি bouncedEmails.csv তৈরি করে শুরু করুন আপনার prod এ ফাইল ফোল্ডার (এটি আপনার validEmails.csv এর পাশে থাকা উচিত ) আমাদের unsubscribeId দরকার নেই এখানে মান, তাই এটি দিয়ে শুরু করুন:
email
iama@fake.email
এখন আমাদের send.ts এ ফিরে যান ফাইল 38 লাইনে, আমাদের বিদ্যমান filePath এর ঠিক নীচে ঘোষণা, নতুন bouncedEmails.csv এর জন্য পাথ কনফিগার করুন ফাইল।
// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv"); send.ts ফাইল)।
দারুণ! এখন আমাদের সেই ফাইলটি পড়তে হবে। অবিলম্বে এই ফাইল পাথ ঘোষণার নীচে (আমাদের বিদ্যমান readFile আগে কল করুন), বাউন্স হওয়া ফাইল পড়ার জন্য যুক্তি যোগ করুন।
// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
if (err) {
console.error(err);
process.exit(1);
}
bounceList = data.split("\n").slice(1);
readFile অ্যাসিঙ্ক্রোনাস - তাই আমাদের আমাদের বিদ্যমান সমস্ত পাঠান যুক্তি এর চারপাশে কলব্যাক ফাংশন মোড়ানো দরকার . নিশ্চিত করুন যে আপনার ক্লোজিং }) এই কলব্যাকের জন্য আমাদের ফাইলের একেবারে শেষে সরানো হয়েছে।
আমরা bouncedEmails.csv পড়ি ফাইল, এটিকে নতুন লাইনে বিভক্ত করুন (মনে রাখবেন যে আপনাকে নিশ্চিত করতে হবে যে আপনার লাইনের শেষগুলি LF ), এবং email সরান লাইন পরিশেষে, আমরা আমাদের বিদ্যমান সেন্ড লজিক দিয়ে চালিয়ে যাচ্ছি।
আমাদের পাঠান যুক্তিতে ফিরে যান। আমাদের .forEach-এর মধ্যে ফাংশন, ব্লক করা ইমেলগুলি এড়িয়ে যাওয়ার জন্য যুক্তি যোগ করুন (অপ্রয়োজনীয় ভেরিয়েবল তৈরি এড়াতে আমরা বার্তা অবজেক্ট তৈরি করার আগে এটি যুক্ত করব)।
// Here we iterate through the emailList array
emailList.forEach((user) => {
// Here we check if the email has been bounced
if (bounceList.length && bounceList.includes(user.email)) {
console.info(`Message send skipped: ${user.email}`);
return;
}
bounceList.csv ফাইলটি খালি, কল করা হচ্ছে includes একটি ত্রুটি নিক্ষেপ করবে। তাই আমরা একটি .length চেক করি মান প্রথম।
একটি প্রারম্ভিক return ব্যবহার করে বিবৃতি, আমরা সেই নির্দিষ্ট .forEach শেষ করি পুনরাবৃত্তি যখন bounceList যে ইমেল অন্তর্ভুক্ত. এটি আমাদের পূর্বে বাউন্স হওয়া ইমেল ঠিকানাগুলিতে পাঠানোর প্রচেষ্টা থেকে বাধা দেয়। এখন আপনি যদি npm run build চালান এবং npm run start , আপনার টার্মিনালে এই আউটপুটটি দেখতে হবে:

এই বিন্দু পর্যন্ত আমাদের অগ্রগতি দেখুন।
সেন্ডগ্রিডে ব্যর্থ ইমেলগুলি কীভাবে ক্যাপচার করবেন
বর্তমানে আমাদের অ্যাপ্লিকেশন একটি ত্রুটি লগ করবে যদি একটি ইমেল পাঠাতে ব্যর্থ হয়। এটি ছোট ব্যবহারের ক্ষেত্রে কাজ করতে পারে, কিন্তু আপনি আপনার অ্যাপ্লিকেশনের আকার বাড়াতে গিয়ে সেই ব্যর্থতাগুলি সনাক্ত করা এবং আবার পাঠানোর চেষ্টা করা ক্রমবর্ধমান কঠিন হবে।
কিন্তু এর পরিবর্তে, আমরা আমাদের অ্যাপ্লিকেশনটিকে সেই ইমেলগুলিকে একটি নতুন ফাইলে সংরক্ষণ করতে পারি৷
৷
একটি failedEmails.csv তৈরি করুন আপনার prod এ ফাইল ফোল্ডার এই ফাইল খালি হতে পারে. হেডার সারি যোগ করার জন্য আমরা কোড লিখব।
আমাদের send.ts এ ফিরে যান ফাইল, 38 লাইনে আমাদের পাথ ঘোষণার দিকে যান। আসুন আমাদের নতুন failedEmails.csv এর জন্য আরও একটি যোগ করি :
// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
const failedPath = path.join(__dirname + "/failedEmails.csv");
আমাদের অন্যান্য পাথ থেকে ভিন্ন, এই পথটি একটি write-এর জন্য ব্যবহার করা হবে অপারেশন. যেহেতু আমরা ইমেলগুলি প্রসেস করার সাথে সাথে ক্রমাগত লিখতে চাই, তাই এটি করার জন্য আমাদের একটি স্ট্রিম তৈরি করতে হবে। এই পথ ঘোষণার ঠিক নীচে, আসুন সেই স্ট্রীমটি তৈরি করি এবং আমাদের প্রাথমিক শিরোনাম সারি যোগ করি।
// Here we create our write stream for failed emails
const failedStream = createWriteStream(failedPath);
// Here we add the header row
failedStream.write("email,unsubscribeId\n")
এই নতুন স্ট্রীমকে অন্তর্ভুক্ত করার জন্য আমাদের ত্রুটি পরিচালনার যুক্তি উন্নত করার সময়। আমাদের আরেকটি write যোগ করতে হবে send-এ আমাদের ত্রুটি পরিচালনার জন্য অপারেশন কল করুন।
// Here we send the message we just constructed!
sgMail
.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`);
})
.catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`);
// And here we add that email to the failedEmails.csv
failedStream.write(`${user.email},${user.unsubscribeId}\n`)
});
এটি email লিখবে এবং unsubscribeId আমাদের নতুন failedEmails.csv-এ সঠিক বিন্যাসে - আমাদের সেই ডেটা validEmails.csv-এ কপি করার অনুমতি দেয় আরেকটি পাঠানোর চেষ্টা করতে।
অভিনন্দন! আপনি এখন ইমেল বিস্ফোরণ পাঠাতে একটি সফল এবং সম্পূর্ণ কার্যকরী টুল তৈরি করেছেন। আপনি আপনার কাজ নিশ্চিত করতে চান তাহলে আপনি সম্পূর্ণ কোড দেখতে পারেন. কিন্তু কিছু ঐচ্ছিক, "আছে ভালো" বৈশিষ্ট্যের জন্য পড়তে থাকুন৷
৷আপনার ইমেল টুলের জন্য ঐচ্ছিক বৈশিষ্ট্য
কারণ আমাদের টুল CLI-ভিত্তিক (অর্থাৎ এটি কমান্ড-লাইন ইন্টারফেস বা টার্মিনালে ব্যবহার করা হয়), সেখানে ব্যবহারকারীর খুব বেশি প্রতিক্রিয়া নেই। স্ক্রিপ্টের অগ্রগতি সম্পর্কে আরও তথ্য প্রদানের জন্য আমরা কিছু অতিরিক্ত কনসোল ফাংশন ব্যবহার করতে পারি।
কিছু "চেকপয়েন্ট" যোগ করে শুরু করা যাক। আমাদের এনভায়রনমেন্ট ভেরিয়েবল ভ্যালিডেশনের আগে, আসুন একটি বার্তা প্রিন্ট করি যে স্ক্রিপ্টটি শুরু হয়েছে এবং ভেরিয়েবলগুলি পরীক্ষা করছে:
console.info('Script started. Validating environment variables...') তারপর, আমাদের যাচাইকরণের পরে, আমরা একটি সফল বার্তা প্রিন্ট করতে পারি।
// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);
console.info('Variables confirmed!') বাউন্স হওয়া ফাইল পড়ার জন্য আমাদের ফাংশনের মধ্যে, আমরা শুরু, ব্যর্থতা এবং সাফল্যের জন্য কিছু বার্তা যোগ করতে পারি।
console.info('Reading bounced email list...')
// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
if (err) {
console.error(err);
console.error('Failed to read bounced emails!')
process.exit(1);
}
bounceList = data.split("\n").slice(1);
console.info('Bounced emails read!') এবং আমাদের বৈধ ইমেল তালিকার জন্য একই:
console.info('Reading send list...')
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
console.error('Failed to read send list!')
return;
}
এখন, অপারেশন শেষ হলে একটি বার্তা প্রিন্ট করা খুব ভালো হবে। যাইহোক, যদি আমরা একটি console.info যোগ করি আমাদের .forEach পরে লুপ, এটি আসলে আগে প্রিন্ট করবে ইমেল পাঠানো শেষ হয়েছে!
এর কারণ হল .send পদ্ধতি একটি নেটওয়ার্ক কল তৈরি করে এবং একটি প্রতিশ্রুতি প্রদান করে এবং আমাদের পুনরাবৃত্তি শেষ হওয়ার আগে সেই প্রতিশ্রুতিটি সমাধান/প্রত্যাখ্যান নাও হতে পারে।
সুতরাং এর পরিবর্তে আমরা মোট ইমেলের সংখ্যার বিপরীতে আমাদের পাঠানো ইমেলের সংখ্যা ট্র্যাক করার জন্য একটি কাউন্টার তৈরি করতে পারি। আমাদের .forEach এর ঠিক আগে লুপ, এই ভেরিয়েবল যোগ করুন:
// Here we create variables for counting
const emailTotal = emailList.length;
let emailCount = 0; আমরা বাউন্স হওয়া ইমেলগুলিকে প্রক্রিয়াকৃত হিসাবে গণনা করতে চাই, যদিও আমরা সেগুলি এড়িয়ে যাচ্ছি৷
৷ // Here we iterate through the emailList array
emailList.forEach((user) => {
// Here we check if the email has been bounced
if (bounceList.includes(user.email)) {
console.info(`Message send skipped: ${user.email}`);
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
return;
}
} অবশেষে আমাদের পাঠানো ইমেলটি শেষ ইমেল কিনা তা দেখতে আমাদের যুক্তি যোগ করতে হবে। এই যুক্তি আমাদের সফলতা এবং সেন্ড কলের জন্য ত্রুটি হ্যান্ডলারে যায়:
// Here we send the message we just constructed!
sgMail
.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`);
// Here we handle the email counts
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
}
})
.catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`);
// And here we add that email to the failedEmails.csv
failedStream.write(`${user.email},${user.unsubscribeId}\n`);
// Here we handle the email counts
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
}
});
এবং যে সঙ্গে, আমাদের অ্যাপ্লিকেশন সম্পূর্ণরূপে সম্পূর্ণ! আপনি যদি npm run build চালান এবং npm run send স্ক্রিপ্ট, আপনার টার্মিনালে এই আউটপুটটি দেখতে হবে:

এবং আপনার কিছু ইমেল পাওয়া উচিত ছিল যা দেখতে এইরকম:

আপনি এখানে আমাদের চূড়ান্ত কোড দেখতে পারেন, অথবা আপনি freeCodeCamp-এর জন্য নির্মিত বর্ধিত সংস্করণ দেখতে পারেন।