কম্পিউটার টিউটোরিয়াল

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

বছর ধরে কুইন্সি লার্সন ফ্রিকোডক্যাম্পের Mail for Good প্ল্যাটফর্মের মাধ্যমে সাপ্তাহিক ইমেল নিউজলেটার পাঠাতেন, যা Amazon SES দ্বারা চালিত।

তিনি gầnামাত্রই এই প্রক্রিয়াকে SendGrid-এ মাইগ্রেট করেছেন। এই আর্টিকেলে আমি দেখাব কীভাবে আমি এই কাজটি সম্পন্ন করার একটি টুল বানালাম।

SendGrid অ্যাকাউন্ট সেট আপ করার পদ্ধতি

প্রথম ধাপ হলো SendGrid-এ রেজিস্টার করা এবং অ্যাকাউন্ট সেট আপ করা। এই টিউটোরিয়ালের জন্য ফ্রি টিয়ার যথেষ্ট।

অ্যাপ্লিকেশন স্কেল আপ করার সাথে সাথে আপনাকে প্ল্যাটফর্মের মাধ্যমে উপলব্ধ ইমেল লিমিট বাড়াতে হতে পারে।

SendGrid-এ ডেডিকেটেড IP ঠিকানা সেট আপ করা

ডিফল্টরূপে SendGrid ইমেল পাঠাতে শেয়ারড IP ঠিকানা ব্যবহার করে। ছোট স্কেলের ইমেল অ্যাপ্লিকেশনের জন্য এটি গ্রহণযোগ্য হতে পারে, কিন্তু পাঠানোর হার বাড়ার সাথে সাথে আপনাকে একটি ডেডিকেটেড IP ঠিকানা সেট আপ করতে হবে।

এটি ভালো আইডিয়া, কারণ আপনার "সেন্ডার রেপুটেশন" (যে মেট্রিক SendGrid ইমেল সার্ভিস প্রোভাইডারদের সাথে আপনার অবস্থান বোঝার জন্য ব্যবহার করে) অন্য ব্যবহারকারীদের কাজের কারণে নেতিবাচকভাবে প্রভাবিত হবে না যারা একই IP শেয়ার করে।

নিজস্ব ডেডিকেটেড IP সেট আপ করতে, সাইড নেভিগেশন মেনু থেকে "Settings" অপশনটি সিলেক্ট করুন, তারপর "IP Addresses"। দ্রুত নোট: ফ্রি টিয়ারে এই অপশনটি অনুপলব্ধ।

আপনার পেইড প্ল্যানের উপর নির্ভর করে, আপনার কাছে ইতিমধ্যে একটি ডেডিকেটেড IP ঠিকানা সেট আপ থাকতে পারে। যদি না থাকে, বা আপনি আরও যোগ করতে চান, তবে "Add an IP address" বাটনে ক্লিক করে একটি নতুন IP কনফিগার করুন।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

IP ঠিকানাগুলোর জন্য সেটিং মেনু

SendGrid-এ ইমেল সেন্ডার অথরাইজ করা

নোট: আপনি যদি ইমেলের জন্য কাস্টম ডোমেন ব্যবহার করেন তবে এই সেকশনটি বাদ দিন।

আপনার ব্যক্তিগত ইমেল ঠিকানা থেকে ইমেল পাঠাতে, আপনাকে যাচাই করতে হবে যে ইমেল ঠিকানাটি আপনারই।

বাম মেনু থেকে "Settings" সিলেক্ট করুন, তারপর "Sender Authentication"। "Verify a Single Sender" বেছে নিন আপনার একটি ইমেল ঠিকানা যোগ করার ফ্লো সম্পন্ন করতে।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

সিঙ্গেল সেন্ডার অপশন

SendGrid-এ আপনার কাস্টম ডোমেন অথেনটিকেট করা

নোট: আপনি যদি ইমেলের জন্য কাস্টম ডোমেন ব্যবহার করেন না, তবে এই সেকশনটি বাদ দিন।

আপনার কাস্টম মেইল ডোমেন থেকে ইমেল পাঠাতে, সেটি SendGrid-এর সাথে অথেনটিকেট করতে হবে। এই স্ক্রিনে যেতে, আবার Settings মেনুতে যান, তারপর "Sender Authentication" সিলেক্ট করুন।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

সেন্ডার অথেনটিকেশন সেটিং মেনু

আপনি একটি স্ক্রিন দেখবেন যেখানে "Domain Authentication" অপশন থাকবে। "Authenticate Your Domain" অপশনটি সিলেক্ট করুন এবং SendGrid আপনাকে DNS রেকর্ড কনফিগার করার প্রক্রিয়ায় গাইড করবে (আপনার DNS প্রোভাইডারের উপর ভিত্তি করে নির্দিষ্ট নির্দেশাবলীর সাথে)।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

সেন্ডার অথেনটিকেশন সেটিংস পেজ

SendGrid-এ Reverse DNS সেট আপ করা

নোট: আপনি যদি ইমেলের জন্য কাস্টম ডোমেন ব্যবহার করেন না, তবে এই সেকশনটি বাদ দিন।

Reverse DNS (Domain Name System) ইমেল প্রোভাইডাররা একটি দেওয়া IP ঠিকানার মালিক খুঁজে বের করতে ব্যবহার করে। এটি সেট আপ করলে ইমেল প্রোভাইডাররা যাচাই করতে পারবে যে যে IP ঠিকানাটি থেকে আপনি ইমেল পাঠাচ্ছেন সেটি আপনার কাস্টম ডোমেনের সাথে সংযুক্ত।

উপরোক্ত Sender Authentication স্ক্রিনে, আপনি একটি "Reverse DNS" সেকশন দেখবেন। আপনার অ্যাকাউন্টে থাকা প্রতিটি ডেডিকেটেড IP-এর জন্য রিভার্স DNS কনফিগার করার অপশন থাকবে — ডোমেন অথেনটিকেশনের মতোই, SendGrid-এর প্ল্যাটফর্ম আপনাকে এটি সেট আপ করার মাধ্যমে গাইড করবে।

SendGrid-এ ইমেল অথেনটিকেশন সেট আপ করা

নোট: আপনি যদি ইমেলের জন্য কাস্টম ডোমেন ব্যবহার করেন না, তবে এই সেকশনটি বাদ দিন।

প্রমুখ ইমেল প্রোভাইডাররা (যেমন Gmail, Yahoo, এবং Outlook) ইমেলের সেন্ডার অথেনটিকেট করার জন্য কিছু পদ্ধতি ব্যবহার করে: SPF, DKIM, এবং DMARC।

  • SPF (Sender Policy Framework) যাচাই করে যে আপনার ডোমেন থেকে মেইল পাঠানো IP ঠিকানাটি সেটি করার জন্য অনুমোদিত কিনা।
  • DKIM (DomainKeys Identified Mail) পাবলিক কী স্ট্রিং ব্যবহার করে যাচাই করে যে একটি ইমেলের from ঠিকানা সঠিক কিনা এবং স্পুফ/জালিয়াত করা হয়নি।
  • DMARC (Domain-based Message Authentication, Reporting, and Conformance) হলো নির্দেশাবলির একটি সেট যা ইমেল প্রোভাইডারকে বলে যখন ইমেল SPF বা DKIM যাচাইতে ব্যর্থ হয় তখন কী করবে।

SendGrid-এর অথেনটিকেশন ফ্লো SPF এবং DKIM সেট আপ করার মাধ্যমে গাইড করবে ডোমেন অথেনটিকেশন প্রক্রিয়ার অংশ হিসেবে, কিন্তু DMARC আপনাকে ম্যানুয়ালি কনফিগার করতে হবে।

আপনার DNS হোস্টিং প্রোভাইডারের সাইটে যান এবং DNS ম্যানেজমেন্ট সেটিংস অ্যাক্সেস করুন। সেখান থেকে একটি নতুন TXT রেকর্ড যোগ করুন যার নাম হবে _dmarc.yourdomain.com (yourdomain.com-কে আপনার কাস্টম ডোমেন দিয়ে রিপ্লেস করুন)।

মনে রাখবেন কিছু প্রোভাইডার (যেমন GoDaddy) স্বয়ংক্রিয়ভাবে আপনার ডোমেন রেকর্ডে যুক্ত করে দেয় — সেক্ষেত্রে নামটি শুধু _dmarc হবে।

এই রেকর্ডের value নিচের স্ট্রাকচারের মতো হবে:

"v=DMARC1; p=none; pct=100; rua=mailto:dmarc@yourdomain.com"
  • v=DMARC ব্যবহার করার DMARC রুলের ভার্সন ইঙ্গিত করে (ফিলহাল শুধু Version 1 উপলব্ধ)।
  • p=none ইঙ্গিত করে যে ইমেল প্রোভাইডারটি ইমেল DKIM বা SPF-এ ব্যর্থ হলে কী অ্যাকশন নেবে। এই সেটিং none থেকে শুরু করা উচিত, যাতে আপনার ইমেলের ডেলিভারিবিলিটি প্রভাবিত না হয়। একবার আপনি নিশ্চিত হলে যে DKIM এবং SPF সঠিকভাবে কনফিগার হয়েছে, আপনি এই মানটি quarantine এ আপডেট করতে পারেন যাতে প্রোভাইডাররা ব্যর্থ ইমেলগুলো স্বয়ংক্রিয়ভাবে স্প্যাম ফোল্ডারে পাঠাবে, অথবা reject যাতে প্রোভাইডাররা ব্যর্থ ইমেলগুলো রিজেক্ট/বাউন্স করবে।
  • pct=100 ইঙ্গিত করে যে ব্যর্থ ইমেলের কত শতাংশে অ্যাকশন প্রয়োগ করা হবে।
  • rua=mailto:dmarc@yourdomain.com হলো যে ইমেল ঠিকানায় সমষ্টি রিপোর্ট পাঠানো হবে। এই রিপোর্টগুলিতে আপনার IP গুলো থেকে পাঠানো সকল ইমেলের তথ্য থাকে যেগুলো একটি প্রদত্ত প্রোভাইডার দ্বারা প্রাপ্ত হয়েছে। dmarc@yourdomain.com-কে আপনার চাহিদামতো ইমেল ঠিকানা দিয়ে রিপ্লেস করুন যেটিতে আপনি সেই রিপোর্টগুলো পেতে চান।

SendGrid-এ ডাইনামিক টেমপ্লেট তৈরি করা

আমরা আজ যে টুলটি বানাব, সেটি SendGrid-এর ডাইনামিক টেমপ্লেট ফিচার ব্যবহার করে ইমেলের সাবজেক্ট এবং বডি টেক্সট সেট করে। এটি সেট আপ করতে, সাইড নেভিগেশন মেনু থেকে "Email API" অপশনটি সিলেক্ট করুন, তারপর "Dynamic Templates" বেছে নিন।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

ডাইনামিক টেমপ্লেটের জন্য সেটিং মেনু

আপনি একটি স্ক্রিন দেখবেন যেখানে প্রথম ডাইনামিক টেমপ্লেট তৈরি করার প্রম্পট থাকবে। "Create a Dynamic Template" অপশনটি সিলেক্ট করুন।

আপনার নতুন টেমপ্লেটের একটি নাম দিন: "freeCodeCamp SendGrid Tutorial"। SendGrid এই টেমপ্লেটটি উপলব্ধ টেমপ্লেটের তালিকায় যোগ করবে। টেমপ্লেটটি সিলেক্ট করুন Template ID দেখতে (এটি নোট করে রাখুন, কারণ পরে টুল बनाने সময় এটিই লাগবে) এবং "Add Version" বাটনে ক্লিক করুন।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

নতুন যোগ করা টেমপ্লেটের প্রিভিউ

দেখানো স্ক্রিন থেকে "Blank Template" সিলেক্ট করুন, তারপর "Code Editor" বেছে নিন। এখন আপনি এডিটর ভিউ দেখবেন। SendGrid-এর এডিটর HTML ব্যবহার করে ইমেল বডি বানায় — তবে আমরা টুল বানाते সময় প্লেইন টেক্সট ভার্সন পাঠাব।

ফিলহাল, এডিটরের কন্টেন্ট নিচের কোড দিয়ে রিপ্লেস করুন:

<p>This is a test email used with the freeCodeCamp SendGrid tutorial</p> <p>Unsubscribe: {{{unsubscribeId}}}</p>
আমাদের টুল প্লেইনটেক্সট ইমেল পাঠাবে, তাই এক্সট্রা HTML 보일ারপ্লেট অপ্রয়োজন।

আপনি লক্ষ্য করবেন আমরা {{{unsubscribeId}}} যোগ করেছি। SendGrid-এর টেমপ্লেট Handlebars ব্যবহার করে ডাইনামিক্যালি ভ্যালু রিপ্লেস করে — আমরা টুল বানाते সময় এই ফিচারটি লিভারেজ করব।

এখন উপরের বাম থেকে সেটিংস অপশনটি সিলেক্ট করুন — আপনি ঐচ্ছিকভাবে আপনার টেমপ্লেট ভার্সনকে একটি নাম দিতে পারেন, কিন্তু "Subject" ফিল্ডটি হলো যা আমরা মডিফাই করতে চাই। এই মানটি {{{subject}}} সেট করুন যাতে আমাদের টুল থেকে সাবজেক্ট ভ্যালু ডাইনামিক্যালি লোড হয়।

ডাইনামিক টেমপ্লেট টেস্ট করতে, উপরের মেনু থেকে "Test Data" অপশনটি সিলেক্ট করুন। এডিটরে এই JSON ডেটা ইনসার্ট করুন:

{ "unsubscribeId": "1", "subject": "Testing emails!" }
মনে রাখবেন JSON-এ কীগুলো কোডে র‍্যাপ করা আবশ্যক!

আপনি এখন স্ক্রিনের ডান পাশের প্রিভিউতে এই ভ্যালুগুলো টেমপ্লেটে রিফ্লেক্ট হয়েছে দেখবেন। Save বাটনে ক্লিক করে পরিবর্তনগুলো সেভ করা ভুলবেন না!

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

এডিটর এবং প্রিভিউ স্ক্রিন যেখানে টেমপ্লেট ভ্যালুগুলো ডাইনামিক্যালি লোড হচ্ছে

SendGrid-এ API Key জেনারেট করা

SendGrid অ্যাকাউন্ট কনফিগার করার চূড়ান্ত ধাপ হলো আমাদের টুলের জন্য একটি API key জেনারেট করা।

উপরের বাম কোণে ব্যাক অ্যারোতে ক্লিক করে মূল SendGrid পেজে ফিরে যান। তারপর "Settings" এবং "API keys" সিলেক্ট করুন। "Create API Key" বেছে নিন একটি নতুন কী জেনারেট করতে। আপনি ঐচ্ছিকভাবে "Full Access" দিতে পারেন আপনার কীকে, কিন্তু এই টিউটোরিয়ালের জন্য শুধু "Mail Send" অ্যাক্সেস যথেষ্ট।

আপনার কীতে একটি বর্ণনামূলক নাম দিন যাতে পরে এই স্ক্রিনে আসলে এর উদ্দেশ্য মনে থাকে। পারমিশন কনফিগার হলে "Create and View" সিলেক্ট করুন কী জেনারেট করতে — এটিকে 어딘ো সেফ জায়গায় সেভ করুন কারণ আপনি আবার এটা দেখতে পারবেন না।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

Mail Send পারমিশন ইনেবল করা Create API স্ক্রিন

ইমেল টুল বানানোর পদ্ধতি

এখন কিছু ইমেল পাঠানোর কোড লিখার সময়। আপনি আমাদের লাইভ অ্যাপ্লিকেশনের কোড দেখতে পারেন, কিন্তু এই টিউটোরিয়ালের জন্য আমরা কিছুটা সরলীকৃত ভার্সন বানাব যা প্রায়মারি ফোকাস SendGrid API ব্যবহার করার ওপর থাকবে।

কাস্টম ইমেল ক্যাম্পেইন স্ক্রিপ্টের জন্য প্রয়োজনীয় সফটওয়্যার

এই প্রজেক্টের সাথে কাজ করতে আপনাকে নিচের টুলগুলো ইনস্টল থাকতে হবে:

  • Node.js — LTS ভার্সন রিকমেন্ডেড
  • একটি IDE, যেমন VSCode বা Atom

আপনি ঐচ্ছিকভাবে ভার্সন কন্ট্রোলের জন্য git চাইতে পারেন।

আমাদের লাইভ টুল MongoDB Atlas ক্লাস্টার ব্যবহার করে, কিন্তু আমাদের টিউটোরিয়াল উদাহরণে তা ব্যবহার করব না। আপনি যদি MongoDB-এ পরিচিত না হন, তবে freeCodeCamp-এর ক্যুরিকুলামে MongoDB সেট আপ এবং ব্যবহার করার চমৎকার একটি সেকশন রয়েছে।

প্রজেক্ট ইনিশিয়ালাইজ করার পদ্ধতি

এই প্রজেক্টে কাজ করার জন্য একটি ডিরেক্টরি (ফোল্ডার) তৈরি করুন। তারপর সেই ফোল্ডারটি আপনার এডিটর এবং টার্মিনাল দিয়ে খুলুন।

শুরু করতে, আমাদের এটিকে একটি Node প্রজেক্ট হিসেবে সেট আপ করতে হবে। দ্রুততম পদ্ধতি হলো টার্মিনালে npm init চালানো। এটি package.json তৈরি করার প্রক্রিয়ায় গাইড করবে যা একটি Node অ্যাপ্লিকেশনের কোর ফাইল।

ডিফল্ট ভ্যালুগুলো আমাদের অ্যাপ্লিকেশনের জন্য ঠিক কাজ করবে, কিন্তু scripts সেকশনটি মডিফাই করতে হবে:

 "scripts": { "build": "tsc", "send": "node ./prod/send.js" },
npm init একটি test স্ক্রিপ্ট তৈরি করে — এটি আমাদের প্রজেক্টের জন্য রিমুভ করা যাবে।

build স্ক্রিপ্টটি আমাদের TypeScript কে JavaScript-এ কম্পাইল করতে ব্যবহৃত হবে, এবং send স্ক্রিপ্টটি আমাদের অ্যাপ্লিকেশন চালাবে।

এরপর TypeScript ইনস্টল এবং সেট আপ করব। আপনি যদি TypeScript-এ পরিচিত না হন, তবে এটি এসেনশিয়ালি JavaScript-এর একটি সুপারসেট যা শক্তিশালী টাইপ ডেফিনিশন এবং কম্পাইল-টাইম এরর চেকিং দেয়।

আপনার প্রজেক্টে TypeScript ইনস্টল করতে টার্মিনালে npm install --save-dev typescript চালান। (--save-dev ফ্ল্যাগটি এটিকে ডেভেলপমেন্ট ডিপেন্ডেন্সি হিসেবে সেভ করে — TypeScript রানটাইমে প্রয়োজন নেই তাই প্রোডাকশন এনভায়রনমেন্টে ক্লিন আপ করা যায়)।

TypeScript-এর নিজস্ব কনফিগারেশন ফাইল প্রয়োজন যাতে সেটি কী রুল ফলো করবে JavaScript ফাইলগুলো জেনারেট করার সময়। আপনার প্রজেক্টের রুট ডিরেক্টরিতে 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/ আমাদের কম্পাইল্ড JavaScript ফাইলগুলো ইগনোর করবে। আমরা এই ফোল্ডারটি আমাদের ইমেল লিস্টের জন্যও ব্যবহার করব, তাই প্রাইভেট আইডেনটিফাইয়েবল ইনফরমেশন অকস্মাতে কমিট হওয়া থেকে বাঁচাতে এটি গুরুত্বপূর্ণ।

আপনার রুট প্রজেক্ট ডিরেক্টরিতে একটি .env ফাইল তৈরি করুন। আমরা এই ফাইল মাধ্যমে নিচের এনভায়রনমেন্ট ভেরিয়েবলগুলো লোড করব:

SENDGRID_API_KEY= SENDGRID_FROM= SENDGRID_TEMPLATE_ID= MAIL_SUBJECT=
যখন ভ্যালুগুলো পূরণ করবেন, ডাবল কোডে র‍্যাপ করুন। এবং = সাইনের চারপাশে স্পেস না দিন!
  • SENDGRID_API_KEY হওয়া উচিত পূর্বের ধাপে জেনারেট করা API key।
  • SENDGRID_FROM হওয়া উচিত আপনার ইমেল ঠিকানা (এই ঠিকানাটি from ফিল্ডের জন্য ব্যবহার হবে)।
  • SENDGRID_TEMPLATE_ID হওয়া উচিত আগে তৈরি করা ডাইনামিক টেমপ্লেটের id স্ট্রিং।
  • MAIL_SUBJECT হবে আপনি যেই ইমেলগুলো পাঠাবেন তাদের সাবজেক্ট লাইন। ফিলহাল এটিকে "fCC Tutorial Email" সেট করুন।

শেষে, আপনার রুট প্রজেক্ট ডিরেক্টরিতে একটি src ফোল্ডার তৈরি করুন, এবং সেটির ভিতরে একটি send.ts ফাইল তৈরি করুন।

ডিপেন্ডেন্সি ইনস্টল করার পদ্ধতি

প্রথমে sendgrid Node.js প্যাকেজটি ইনস্টল করতে হবে। এই প্যাকেজটি SendGrid API-এর একটি র‍্যাপার এবং API কল করার প্রক্রিয়াকে স্ট্রিমলাইন করে ইমেল পাঠাতে। npm install @sendgrid/mail চালান এই প্যাকেজটি ইনস্টল করতে।

তারপর আমাদের কয়েকটি ডেভেলপমেন্ট ডিপেন্ডেন্সি প্রয়োজন। npm install --save-dev dotenv @types/node চালান।

  • dotenv আমাদেরকে .env ফাইল থেকে লোকালি এনভায়রনমেন্ট ভেরিয়েবল লোড করতে দেবে।
  • @types/node Node.js-এর টাইপ ডেফিনিশন প্রদান করে — TypeScript এই ডেফিনিশনগুলোর ওপর নির্ভর করে বিল্ট-ইন মেথড এবং ফাংশনগুলোর স্ট্রাকচার বুঝতে।

লজিক লেখার পদ্ধতি

এখন আমরা আমাদের /src/send.ts ফাইলে কাজ করব — এখানেই আমরা আমাদের অ্যাপ্লিকেশনের মূল লজিক বানাচ্ছি। আমরা আমাদের প্যাকেজগুলো থেকে প্রয়োজনীয় ভ্যালুগুলো ইম্পোর্ট করে শুরু করব।

প্রথমে dotenv প্যাকেজটি লোড করব এবং এনভায়রনমেন্ট ভেরিয়েবলগুলো পার্স করব।

import dotenv from "dotenv"; dotenv.config();
dotenv শুধু লোকাল ডেভেলপমেন্টের জন্য প্রয়োজন — Heroku এবং Repl.it-এর মতো অধিকাংশ অনলাইন হোস্ট এনভায়রনমেন্ট ভেরিয়েবল নেটিভলি হ্যান্ডেল করতে পারে

dotenv.config() কলটি আমাদের .env ফাইল পড়ে এবং ভ্যালুগুলো process.env Node অবজেক্টে লোড করে।

এরপর SendGrid প্যাকেজ থেকে প্রয়োজনীয় মডিউলগুলো ইম্পোর্ট করব:

import sgMail, { MailDataRequired } from "@sendgrid/mail";
TypeScript অটোমেটিক্যালি ইম্পোর্ট করতে পারে, কিন্তু ম্যানুয়ালি ইম্পোর্ট করা ভালো প্র্যাকটিস।

sgMail হলো প্রায়মারি API র‍্যাপার, এবং MailDataRequired হলো একটি টাইপ ডেফিনিশন যা আমাদের লাগবে।

শেষে, ফাইল হ্যান্ডলিং-এর জন্য কিছু বিল্ট-ইন Node ফিচার ইম্পোর্ট করব:

import path from "path"; import { createWriteStream, readFile } from "fs";
{ syntax } প্যাকেজ থেকে স্পেসিফিক মডিউল ইম্পোর্ট করার জন্য।
  • path আমাদের ইমেল লিস্ট ফাইলগুলো লোকেট করতে রিলেটিভ পাথ দিয়ে ব্যবহার হবে
  • fs সেই ফাইলগুলো পড়তে এবং লিখতে ব্যবহার হবে

লজিক বানানো শুরু করা যাক! আমাদের অ্যাপ্লিকেশন কিছু এসেনশিয়াল ভ্যালুর ওপর নির্ভর করে যেগুলো .env ফাইলে সেট থাকতে হবে, তাই আমরা শুরু করব ভ্যালিডেট করে যে সেই ভেরিয়েবলগুলো সঠিকভাবে সেট আছে। যদি কোনোটি মিসিং থাকে, আমরা অ্যাপ্লিকেশনটি আর্লি এক্সিট করব যাতে ইমেল পাঠানোর সময় এরর থ্রো না করে।

// এখানে আমরা একটি বৈধ API key চেক করছি const apiKey = process.env.SENDGRID_API_KEY; if (!apiKey) { console.error("Missing SendGrid Key"); process.exit(1); } // এখানে আমরা একটি বৈধ from ঠিকানা চেক করছি const fromAddress = process.env.SENDGRID_FROM; if (!fromAddress) { console.error("Missing sender email address!"); process.exit(1); } // এখানে আমরা একটি ডাইনামিক টেমপ্লেট ID চেক করছি const sgTemplate = process.env.SENDGRID_TEMPLATE_ID; if (!sgTemplate) { console.error("Missing SendGrid Template ID"); process.exit(1); } // এখানে আমরা মেইল সাবজেক্ট চেক করছি, কিন্তু যদি মিসিং থাকে // তবে আমাদের এক্সিট করতে হবে না। বরং একটি ফলব্যাক ভ্যালু ব্যবহার করব। const subjectValue = process.env.MAIL_SUBJECT || "Fallback value - check your env!";
|| সিন্ট্যাক্স কোডকে বলে যে যদি process.env.MAIL_SUBJECT undefined বা falsy হয়, তবে স্ট্রিংটি ব্যবহার কর।

আপনি যে process.exit(1) কলটি প্রতিটি কন্ডিশন চেকে দেখছেন, সেটি Node-কে বলে প্রসেস (আমাদের অ্যাপ্লিকেশন) টার্মিনেট করতে এক্সিট কোড 1 দিয়ে। এটি ইঙ্গিত করে যে আমাদের অ্যাপ্লিকেশন এই চেকগুলো থেকে যেকোনো একটা ফেল হয়ে Краশ করেছে।

SendGrid-এর জন্য API key সেট করতে হবে। আপনার এনভায়রনমেন্ট ভেরিয়েবল লজিকের নিচে, key সেট করার ফাংশন কলটি যোগ করুন।

// এখানে আমরা SendGrid API key সেট করছি sgMail.setApiKey(apiKey);

আগে বড় যাওয়ার আগে, টার্মিনালে npm run build চালান — এটি একটি prod ফোল্ডার তৈরি করবে যাতে আমাদের কম্পাইল্ড JavaScript থাকবে। এখন আপনাকে নিচের ফাইল স্ট্রাকচার দেখতে মিলবে:

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

টিউটোরিয়ালের এই পয়েন্টে ফাইল ট্রি

এই পয়েন্টে, আপনি যদি git ব্যবহার করেন, তবে খুব নিশ্চিত হোন যে prod ফোল্ডার আপনার রিপোজিটরিতে কমিট হবে না।

prod ফোল্ডারের ভিতরে একটি validEmails.csv ফাইল তৈরি করুন। আমাদের অ্যাপ এই ফাইলটি পড়ে ইমেল লিস্ট তৈরি করবে। ফাইলটি নিচের কন্টেন্ট দিয়ে ইনিশিয়ালাইজ করুন (আপনার আসল ইমেল ঠিকানা দিয়ে your@email.com রিপ্লেস করুন):

email,unsubscribeId your@email.com,1 iama@fake.email,2
.csv ফাইলগুলোতে কমার চারপাশে স্পেস নেই।

এখন এই কন্টেন্টকে ইমেল লিস্টে পার্স করার কোড লিখি! আপনার src/send.ts ফাইলে এই কোডটি যোগ করুন:

// এখানে আমরা আমাদের ভ্যালিড ইমেল ফাইলের ফাইল পাথ কনক্যাট করছি const filePath = path.join(__dirname + "/../validEmails.csv"); // এখান থেকে আমরা ফাইল পড়তে শুরু করছি! readFile(filePath, "utf8", (err, data) => { if (err) { console.error(err); return; } console.log(data) });
এই প্রক্রিয়ায় আমরা ES6 অ্যারো ফাংশন সিন্ট্যাক্স ব্যবহার করছি। আপনি চাইলে function ডিক্লেরেশনও ব্যবহার করতে পারেন।

এখন npm run build এবং npm run send চালালে আপনার টার্মিনালে আমাদের validEmail.csv ফাইলের কন্টেন্ট দেখতে পাবেন। আপনি চাইলে বর্তমান প্রগ্রেস এখান পর্যন্ত দেখতে পারেন।

বাড়িয়ে চলুন! এখন আমাদের সেই স্ট্রিংকে অবজেক্টের একটি অ্যারে-এ পার্স করতে হবে যাতে আমরা সেটি ইটারেট করে ইমেল মেসেজ বানাতে পারি। আমাদের কলব্যাক ফাংশনটি আপডেট করুন:

// এখান থেকে আমরা ফাইল পড়তে শুরু করছি! readFile(filePath, "utf8", (err, data) => { if (err) { console.error(err); return; } // এখানে আমরা ডেটাকে অবজেক্ট অ্যারে-এ পার্স করছি const emailList = data .split("\n") .slice(1) .map((el) => { const [email, unsubscribeId] = el.split(","); return { email, unsubscribeId }; }); });
[email, unsubscribeId] ডিস্ট্রাকচারিং অ্যাপ্লাই করে স্প্লিট অ্যারের ভ্যালুগুলো সেই দুটি ভেরিয়েবলে অ্যাসাইন করে।
  • .split("\n") স্ট্রিংকে লাইন ব্রেক দিয়ে স্প্লিট করে। নোট: আপনি যদি উইন্ডোজে থাকেন, তবে আপনার validEmails.csv-এর end-of-line সেটিং CRLF থেকে LF-এ চেঞ্জ করতে হতে পারে (উইন্ডোজ এক্সট্রা লাইন ব্রেক ক্যারেক্টার যোগ করে যা আমাদের ডেটা হ্যান্ডলিং-এ প্রভাব ফেলে)
  • .slice(1) সেই অ্যারের প্রথম এলিমেন্টটি রিমুভ করে (আমাদের email,unsubscribeId লাইন)।
  • আমাদের map ফাংশনটি প্রতিটি email,unsubscribeId স্ট্রিংকে একটি {email, unsubscribeId} অবজেক্ট-এ কনভার্ট করে।

এই পার্সিং ফাংশনের এন্ড রেজাল্ট হবে একটি অবজেক্ট অ্যারে যেটিতে email এবং unsubscribeId প্রপার্টি থাকবে — স্ট্রিং চেয়ে অনেক স্মুথর কাজ করতে।

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

পার্সিং ফাংশন থেকে আউটপুট উদাহরণ

এখন কিছু ইমেল পাঠানোর সময়। আপনার পার্সিং ফাংশনের নিচে (তবে এখনো readFile কলব্যাকের ভিতরে) আমাদের ইটেরেশন মেথডের স্ট্রাকচার যোগ করুন। আমরা অ্যারেতে প্রতিটি ভ্যালু এক্সেস করতে চাই, তাই .forEach অ্যাপ্রোচ ব্যবহার করব।

 // এখানে আমরা emailList অ্যারে ইটারেট করছি emailList.forEach((user) => {});
user প্যারামিটারটি হবে একটি {email, unsubscribeId} অবজেক্ট। আমরা এটিকে user বললাম কারণ এটি ফুল অ্যাপ্লিকেশনে একটি freeCodeCamp userdata অবজেক্টকে রিপ্রেজেন্ট করে।

.forEach-এর কলব্যাকের ভিতরে, আমরা সেই মেসেজ অবজেক্টটি কনস্ট্রাক্ট করতে পারি যা SendGrid API এক্সপেক্ট করে।

 // এখানে আমরা emailList অ্যারে ইটারেট করছি emailList.forEach((user) => { // এটি হলো SendGrid-এর প্রয়োজনীয় মেসেজ অবজেক্ট const message: MailDataRequired = { to: user.email, from: fromAddress, subject: subjectValue, text: "This goes away!", templateId: sgTemplate, dynamicTemplateData: { subject: subjectValue, unsubscribeId: user.unsubscribeId } } });

আগে বড় যাওয়ার আগে, এই মেসেজ অবজেক্টটিকে নজরদারি করি। আমরা আগে ইম্পোর্ট 했던 MailDataRequired এখানে টাইপ ডেফিনিশন হিসেবে ব্যবহার করা হয়েছে, তাই TypeScript আমাদের সতর্ক করবে যদি আমরা কোনো রিকোয়ার্ড প্রপার্টি মিস করি। সৌভাগ্য থেকে, আমাদের সব রিকোয়ার্ড প্রপার্টি আছে। কিন্তু এগুলো কী মানে?

  • to: ইমেল পাঠানো ঠিকানা। এটি আমাদের validEmails.csv ফাইলের প্রতিটি লাইন থেকে email হবে
  • from: ইমেল পাঠানো ঠিকানা। এটি আমাদের .env-এ আগে সেট করা হয়েছে (এটি হওয়া উচিত আপনার ইমেল ঠিকানা)।
  • subject: এই ফিল্ডটি রিকোয়ার্ড নয়, কিন্তু একটি ফলব্যাক ভ্যালু দিয়ে থাকে যদি ডাইনামিক টেমপ্লেট আমাদের সাবজেক্ট সঠিকভাবে পার্স না করে।
  • text: এই টেক্সট ভ্যালু টেমপ্লেট দ্বারা ওভাররাইট হয়। তবুও এটি ব্যবহার করা গুরুত্বপূর্ণ। SendGrid ইমেল পাঠাতে পারে plaintext বা html হিসেবে — html প্রপার্টির বদলে text প্রপার্টি ব্যবহার করে আমরা নিশ্চিত করি আমাদের টেমপ্লেট plaintext হিসেবে পাঠানো হয়। ইমেল প্রোভাইডাররা আরো সম্ভাব্য HTML মেসেজকে স্প্যাম হিসেবে ফ্ল্যাগ করে, তাই এটি আমাদের ডেলিভারিবিলিটি রেট বাড়াতে সাহায্য করে।
  • templateId: এটি হলো SendGrid-এর যে ডাইনামিক টেমপ্লেটটি ইমেলে ব্যবহার করবে তার ID।
  • dynamicTemplateData: এই হলো সেই ভ্যালুগুলো যা আমাদের Handlebars স্ট্রিংসের সাথে করেসপন্ড করে যা আমরা আগে ডাইনামিক টেমপ্লেটে সেট করেছিলাম।

বাড়িয়ে চলুন! আমাদের পরবর্তী ধাপ হলো এই কনস্ট্রাক্ট করা মেসেজটি পাঠানো। মেসেজ অবজেক্টের নিচে (তবে এখনো .forEach কলব্যাকের ভিতরে) আমাদের সেন্ড কলটি যোগ করি:

 // এখানে আমরা যে মেসেজটি কনস্ট্রাক্ট করলাম সেটি পাঠাচ্ছি! sgMail.send(message);

এটি আমাদের validEmails.csv-এ থাকা প্রতিটি ইমেলে মেসেজ পাঠাবে। দুর্ভাগ্য, আমাদের কোড সাইলেন্টলি রান করবে এবং আমরা জানতে পারব না প্রতিটি পাঠানো সফল হয়েছে কিনা। এরর হ্যান্ডলিং যোগ করি।

.send() কলটি একটি Promise রিটার্ন করে, তাই আমরা .then().catch() ব্যবহার করে রিটার্ন হ্যান্ডল করতে পারি।

 // এখানে আমরা যে মেসেজটি কনস্ট্রাক্ট করলাম সেটি পাঠাচ্ছি! sgMail.send(message) .then(() => { // এখানে আমরা সফল সেন্ড রিকোয়েস্ট লগ করছি console.info(`Message send success: ${user.email}`) }) .catch((err) => { // এখানে আমরা এরর হওয়া সেন্ড রিকোয়েস্ট লগ করছি console.error(err); console.error(`Message send failed: ${user.email}`) });
আপনি async/awaitও ব্যবহার করতে পারেন, কিন্তু এটি একটি কেস যেখানে .then.catch বেশি স্পষ্ট

এখন npm run build এবং npm run send চালালে আপনার ইনবক্সে একটি সুন্দর ইমেল দেখতে পাবেন!

এই পয়েন্টে, আপনার কাছে একটি ফাংশনাল ইমেল পাঠানো অ্যাপ্লিকেশন আছে। অভিনন্দন! আপনি এখান পর্যন্ত আমাদের প্রগ্রেস দেখতে পারেন।

আगे পড়ুন বাউন্সড ইমেল হ্যান্ডলিং এবং সেন্ড ফেইলচারের জন্য অতিরিক্ত লজিক কীভাবে করা যায়, যা আমরা পরবর্তীতে আলোচনা করব।

SendGrid-এ বাউন্সড ইমেল হ্যান্ডল করার পদ্ধতি

আপনি লক্ষ্য করেছেন হতে পারে iama@fake.email একদম রিয়েল ইমেল ঠিকানা নয়। SendGrid প্রতিদিন আপনার পिछলের দিনের এক্টিভিটির জন্য বাউন্সড রিপোর্ট জেনারেট করে।

প্রতিটি বাউন্সড ইমেল আপনার SendGrid রেপুটেশনকে ক্ষতি করে এবং ইমেল প্রোভাইডাররা আপনার মেইলকে স্প্যাম হিসেবে مار্ক করতে পারে। তাই, আমাদের জানা বাউন্সিং ঠিকানাগুলোতে পাঠানো থেকে বাধা দিতে লজিক যোগ করতে হবে।

আপনার prod ফোল্ডারে একটি bouncedEmails.csv ফাইল তৈরি করুন (এটি আপনার validEmails.csv-এর পাশে থাকবে)। এখানে unsubscribeId ভ্যালু প্রয়োজন নেই, তাই নিচের কন্টেন্ট দিয়ে ইনিশিয়ালাইজ করুন:

email iama@fake.email
ডেমোই সুবিধার্থে ফেক ইমেলটি যোগ করা হয়েছে

এখন আবার আমাদের send.ts ফাইলে। লাইন ৩৮-এ, আমাদের বিদ্যমান filePath ডিক্লেরেশনের নিচে, নতুন bouncedEmails.csv ফাইলের পাথ কনফিগার করুন।

// এখানে আমরা CSV ফাইলগুলোর ফাইল পাথ কনক্যাট করছি const filePath = path.join(__dirname + "/validEmails.csv"); const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
__dirname এই ফাইলের বর্তমান ডিরেক্টরি রিফার করে (আমাদের কেসে, send.ts ফাইল)।

বাড়িয়ে চলুন! এখন আমাদের সেটি পড়তে হবে। এই ফাইল পাথ ডিক্লেরেশনের ঠিক নিচে (আমাদের বিদ্যমান readFile কলের আগে), বাউন্সড ফাইল পড়ার লজিক যোগ করুন।

// বাউন্স লিস্ট পড়ুন, অ্যারে-এ পার্স করুন 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 ফাংশনের ভিতরে, ব্লক করা ইমেলগুলো স্কিপ করার লজিক যোগ করুন (এটি মেসেজ অবজেক্ট কনস্ট্রাক্ট করার আগে যোগ করব যাতে অপ্রয়োজনীয় ভেরিয়েবল তৈরি না হয়)।

 // এখানে আমরা emailList অ্যারে ইটারেট করছি emailList.forEach((user) => { // এখানে আমরা চেক করছি ইমেলটি বাউন্স করা হয়েছে কিনা 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 চালালে আপনার টার্মিনালে এই আউটপুট দেখতে পাবেন:

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

স্কিপ করা ইমেল এবং সফল ইমেলের কনসোল আউটপুট উদাহরণ

এখান পর্যন্ত আমাদের প্রগ্রেস দেখুন।

SendGrid-এ ফেইল্ড ইমেল ক্যাপচার করার পদ্ধতি

বর্তমানে আমাদের অ্যাপ্লিকেশন ইমেল পাঠানো ব্যর্থ হলে এরর লগ করে। ছোট ইউজ কেসের জন্য এটি কাজ করতে পারে, কিন্তু অ্যাপ্লিকেশন স্কেল আপ করলে সেই ফেইলচারগুলো আইডেন্টিফাই করা এবং আবার পাঠানোর চেষ্টা করা একদম কঠিন হয়ে যাবে।

বরং, আমরা আমাদের অ্যাপ্লিকেশনকে সেই ইমেলগুলো একটি নতুন ফাইলে সেভ করতে দিতে পারি।

আপনার prod ফোল্ডারে একটি failedEmails.csv ফাইল তৈরি করুন। এই ফাইলটি খালি থাকতে পারে। আমরা হেডার রো যোগ করার কোড লিখব।

আমাদের send.ts ফাইলে ফিরে যান, লাইন ৩৮-এ আমাদের পাথ ডিক্লেরেশনগুলোতে। আমাদের নতুন failedEmails.csv-এর জন্য একটা পাথ যোগ করুন:

// এখানে আমরা CSV ফাইলগুলোর ফাইল পাথ কনক্যাট করছি const filePath = path.join(__dirname + "/validEmails.csv"); const bouncePath = path.join(__dirname + "/bouncedEmails.csv"); const failedPath = path.join(__dirname + "/failedEmails.csv");

আমাদের অন্যান্য পাথের বিপরীতে, এই পাথটি একটি write অপারেশনের জন্য ব্যবহার হবে। যেহেতু আমরা ইমেলগুলো প্রসেস হওয়ার সাথে সাথে συνεχে লিখতে চাই, আমাদের একটি স্ট্রিম তৈরি করতে হবে। এই পাথ ডিক্লেরেশনগুলোর ঠিক নিচে, স্ট্রিমটি তৈরি করুন এবং ইনিশিয়াল হেডার রো যোগ করুন।

// এখানে আমরা ফেইল্ড ইমেলের জন্য রাইট স্ট্রিম তৈরি করছি const failedStream = createWriteStream(failedPath); // এখানে আমরা হেডার রো যোগ করছি failedStream.write("email,unsubscribeId\n")

এখন আমাদের এরর হ্যান্ডলিং লজিক উন্নত করি এই নতুন স্ট্রিমকে অন্তর্ভুক্ত করে। send কলটির এরর হ্যান্ডলিং-এ একটি অন্য write অপারেশন যোগ করুন।

 // এখানে আমরা যে মেসেজটি কনস্ট্রাক্ট করলাম সেটি পাঠাচ্ছি! sgMail .send(message) .then(() => { // এখানে আমরা সফল সেন্ড রিকোয়েস্ট লগ করছি console.info(`Message send success: ${user.email}`); }) .catch((err) => { // এখানে আমরা এরর হওয়া সেন্ড রিকোয়েস্ট লগ করছি console.error(err); console.error(`Message send failed: ${user.email}`); // এবং এখানে আমরা সেই ইমেলটি failedEmails.csv-এ যোগ করছি failedStream.write(`${user.email},${user.unsubscribeId}\n`) });
কনসোল স্টেটমেন্টগুলো রাখা হচ্ছে যাতে স্ক্রিপ্ট রান হওয়ার সময় ফিডব্যাক দেখতে পাই।

এটি email এবং unsubscribeId-কে আমাদের নতুন failedEmails.csv-এ সঠিক ফরম্যাটে লিখবে — যা আমাদের ডেটা validEmails.csv-এ কপি করে আবার পাঠানোর চেষ্টা করতে দিবে।

অভিনন্দন! আপনি এখন একটি সফল এবং সম্পূর্ণ ফাংশনাল টুল বানিয়ে ফেলেছেন যা ইমেল ব্লাস্ট পাঠাতে পারে। আপনি সম্পূর্ণ কোড দেখতে পারেন যদি আপনার কাজ কনফার্ম করতে চান। কিন্তু পড়তে থাকুন কয়েকটি অপশনাল, "nice to have" ফিচারের জন্য।

আপনার ইমেল টুলের জন্য অপশনাল ফিচার

যেহেতু আমাদের টুল CLI-ভিত্তিক (অর্থাৎ এটি কমান্ড-লাইন ইন্টারফেস বা টার্মিনালে ব্যবহার হয়), তাই ইউজার ফিডব্যাক বেশি নেই। আমরা কিছু অডিশনাল কনসোল ফাংশন ব্যবহার করে স্ক্রিপ্টের প্রগ্রেস সম্পর্কে আরও তথ্য দিতে পারি।

কয়েকটি "চেকপয়েন্ট" যোগ করি। আমাদের এনভায়রনমেন্ট ভেরিয়েবল ভ্যালিডেশনের আগে, একটি মেসেজ প্রিন্ট করি যে স্ক্রিপ্ট শুরু হয়েছে এবং ভেরিয়েবলগুলো চেক করছে:

console.info('Script started. Validating environment variables...')
console.info ইঙ্গিত করে এটি একটি ইনফরমেশনাল মেসেজ

তারপর, আমাদের ভ্যালিডেশনের পর, একটি সাকসেস মেসেজ প্রিন্ট করি।

// এখানে আমরা SendGrid API key সেট করছি sgMail.setApiKey(apiKey); console.info('Variables confirmed!')

আমাদের বাউন্সড ফাইল পড়ার ফাংশনে, আমরা স্টার্ট, ফেইলচার, এবং সাকসেসের জন্য কিছু মেসেজ যোগ করতে পারি।

console.info('Reading bounced email list...') // বাউন্স লিস্ট পড়ুন, অ্যারে-এ পার্স করুন 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...') // এখান থেকে আমরা ফাইল পড়তে শুরু করছি! readFile(filePath, "utf8", (err, data) => { if (err) { console.error(err); console.error('Failed to read send list!') return; }

এখন, অপারেশন কমপ্লিট হলে একটি মেসেজ প্রিন্ট করা খুব ভালো হতো। কিন্তু আমরা যদি .forEach লুপের পর একটি console.info যোগ করি, তবে এটি ইমেলগুলো পাঠা শেষ হওয়ার আগে প্রিন্ট হবে!

এটি হয় কারণ .send মেথড একটি নেটওয়ার্ক কল তৈরি করে এবং একটি Promise রিটার্ন করে, এবং সেটি রিজল্ভ/রিজেক্ট হওয়ার আগে আমাদের ইটেরেশন শেষ হয়ে যেতে পারে।

তাই বরং আমরা একটি কাউন্টার বানাতে পারি যেটি পাঠানো ইমেলের সংখ্যা এবং মোট ইমেলের সংখ্যা ট্র্যাক করবে। আমাদের .forEach লুপের ঠিক আগে, এই ভেরিয়েবলগুলো যোগ করুন:

 // এখানে আমরা কাউন্টিং এর জন্য ভেরিয়েবল তৈরি করছি const emailTotal = emailList.length; let emailCount = 0;
.length-কে একটি ভেরিয়েবলে অ্যাসাইন করে, আমরা প্রতিটি ইটেরেশনে সেটি পড়তে হয় না।

আমরা বাউন্সড ইমেলগুলোকেও প্রসেসড হিসেবে কাউন্ট করব, যদিও আমরা সেগুলো স্কিপ করছি।

 // এখানে আমরা emailList অ্যারে ইটারেট করছি emailList.forEach((user) => { // এখানে আমরা চেক করছি ইমেলটি বাউন্স করা হয়েছে কিনা 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; } }

শেষে আমাদের লজিক যোগ করতে হবে দেখতে যে আমরা যে ইমেলটি পাঠালাম সেটি শেষ ইমেল কিনা। এই লজিকটি সেন্ড কলটির সাকসেস এবং এরর হ্যান্ডলারে যাবে:

 // এখানে আমরা যে মেসেজটি কনস্ট্রাক্ট করলাম সেটি পাঠাচ্ছি! sgMail .send(message) .then(() => { // এখানে আমরা সফল সেন্ড রিকোয়েস্ট লগ করছি console.info(`Message send success: ${user.email}`); // এখানে আমরা ইমেল কাউন্ট হ্যান্ডল করছি emailCount++; if (emailCount === emailTotal) { console.info( `Sending complete! Sent ${emailTotal} emails. Have a nice day!` ); } }) .catch((err) => { // এখানে আমরা এরর হওয়া সেন্ড রিকোয়েস্ট লগ করছি console.error(err); console.error(`Message send failed: ${user.email}`); // এবং এখানে আমরা সেই ইমেলটি failedEmails.csv-এ যোগ করছি failedStream.write(`${user.email},${user.unsubscribeId}\n`); // এখানে আমরা ইমেল কাউন্ট হ্যান্ডল করছি emailCount++; if (emailCount === emailTotal) { console.info( `Sending complete! Sent ${emailTotal} emails. Have a nice day!` ); } });

এতে আমাদের অ্যাপ পুরোপুরি কমপ্লিট! আপনি npm run build এবং npm run send স্ক্রিপ্টগুলো চালালে আপনার টার্মিনালে এই আউটপুট দেখতে পাবেন:

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

কমপ্লিটেড অ্যাপ্লিকেশনের কনসোল আউটপুট উদাহরণ।

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

SendGrid API দিয়ে ইমেল নিউজলেটার পাঠান: সম্পূর্ণ ধাপে ধাপে টিউটোরিয়াল

টেস্ট ইমেল রেজাল্টের স্যাম্পল ইমেজ

আপনি আমাদের ফাইনাল কোড এখানে দেখতে পারেন, বা ফ্রিকোডক্যাম্পের জন্য বানানো এক্সটেন্ডেড ভার্সনটি দেখতে পারেন।

  1. বড় ভিডিও ফাইল ইমেইল দিয়ে শেয়ার করুন: ধাপে ধাপে গাইড

  2. SendGrid ব্যাখ্যা: SMTP ইমেইল পাঠানো এবং নিউজলেটার সেটআপ মাস্টার করুন

  3. Vue.js-এ EmailJS ব্যবহার করে কন্ট্যাক্ট ফর্ম ইমেল পাঠান: ধাপে ধাপে গাইড

  4. বেনামী ইমেইল পাঠান: গোপনীয়তা রক্ষার ধাপে ধাপে গাইড