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

Go এবং AWS-এ সার্ভারলেস ইমেল সাবস্ক্রিপশন লিস্ট বানান

এই আর্টিকেলে আমি শেয়ার করব কীভাবে আমি ইমেল কনফার্মেশন সহ একটি সাবস্ক্রিপশন সাইন-আপ ফ্লো তৈরি করলাম যা খারাপ নয়। আপনিও করতে পারেন।

এটি একশনে দেখতে চাইলে, আপনি এখন victoria.dev-এ আমার ইমেল লিস্টে সাবস্ক্রাইব করতে পারেন।

এখন, আমি দেখাব কীভাবে আমি এটি বানালাম।

Simple Subscribe পরিচিতি

আপনি যদি নিজের মেইলিং লিস্ট বা নিউজলেটার ম্যানেজ করতে চান, তবে আপনি আপনার নিজের AWS রিসোর্সগুলোর ওপর Simple Subscribe সেট আপ করতে পারেন ইমেল ঠিকানা সংগ্রহ করতে।

এই ওপেন সোর্স API Go-তে লেখা হয়েছে, এবং AWS Lambda-এ রান করে। আপনার সাইটের ভিজিটররা আপনার লিস্টে সাইন আপ করতে পারবে, যা একটি DynamoDB টেবিলে সংরক্ষিত থাকবে, যেটি আপনি আপনার সুবিধামতো কোয়েরি বা এক্সপোর্ট করতে পারবেন।

কেউ যখন সাইন আপ করবে, তারা একটি ইমেল পাবে তাদের সাবস্ক্রিপশন কনফার্ম করার জন্য। এটিকে কখনো "double opt-in" বলা হয়, যদিও আমি "verified" শব্দটি পছন্দ করি।

Simple Subscribe সার্ভারলেস ইনফ্রাস্ট্রাকচারে কাজ করে এবং একটি AWS Lambda ব্যবহার করে সাবস্ক্রিপশন, কনফার্মেশন, এবং আনসাবস্ক্রাইব রিকোয়েস্ট হ্যান্ডেল করে।

আপনি Simple Subscribe প্রজেক্টটি, এর সম্পূর্ণ ওপেন-সোর্স কোডসহ, GitHub-এ পাবেন। আমি আপনাকে কোডটি খুলে ফলো করার পরামর্শ দিচ্ছি!

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

ভেরিফাইড সাবস্ক্রিপশন ফ্লো বানানোর পদ্ধতি

একটি নন-ভেরিফাইড ইমেল সাইন-আপ প্রসেস সহজ। কেউ আপনার ওয়েবসাইটের একটি বক্সে তাদের ইমেল দেয়, তারপর সেই ইমেল আপনার ডাটাবেসে চলে যায়।

তবে, যদি আমি আপনাকে ইউজার ইনপুটে বিশ্বাস না করার বিষয়ে কিছু শিখিয়েছি, তবে নন-ভেরিফাইড সাইন-আপ প্রসেসের'idea আপনার হ্যাকলস উত্থান করা উচিত। স্প্যাম স্যান্ডউইচে ভাজা হলে খুব ভালো লাগে, কিন্তু এটি আপনার AWS বিল বাড়াতে শুরু করলে মজা নেই।

আপনি CAPTCHA বা পাজল কৌশল ব্যবহার করতে পারেন ইট-ইজ-এ-হিউম্যান ভেরিফিকেশনের জন্য, কিন্তু এগুলো যথেষ্ট ঘর্ষণ সৃষ্টি করে আপনার সম্ভাব্য সাবস্ক্রাইবারদের বিরত করতে।

বরং, একটি কনফার্মেশন ইমেল আড্রেসের সঠিকতা এবং ইউজার সেন্টিয়েন্স (user sentience) উভয় নিশ্চিত করতে সাহায্য করতে পারে।

ইমেল কনফার্মেশন সহ একটি সাবস্ক্রিপশন ফ্লো বানাতে, সিঙ্গল-রেসপন্সিবিলিটি ফাংশন তৈরি করুন যেগুলো প্রতিটি লজিক্যাল স্টেপ সन्तুষ্ট করে। সেগুলো হলো:

  1. একটি ইমেল ঠিকানা গ্রহণ করুন এবং রেকর্ড করুন।
  2. সেই ইমেল ঠিকানার সাথে যুক্ত একটি টোকেন জেনারেট করুন এবং রেকর্ড করুন।
  3. টোকেনসহ একটি কনফার্মেশন ইমেল সেই ইমেল ঠিকানায় পাঠান।
  4. ইমেল ঠিকানা এবং টোকেন উভয়সহ একটি ভেরিফিকেশন রিকোয়েস্ট গ্রহণ করুন।

এই লক্ষ্যগুলো অর্জনের জন্য, Simple Subscribe অফিসিয়াল AWS SDK for Go ব্যবহার করে DynamoDB এবং SES-এর সাথে ইন্টারঅ্যাক্ট করে।

প্রতিটি স্টেজে, ডেটা কী রকম দেখে এবং কীভাবে সংরক্ষিত হয় সেটি বিবেচনা করুন। এটি "কেউ যদি দুবার সাবস্ক্রাইব করার চেষ্টা করে?" বা হাজার মডেলিং যেন "কেউ যদি তার নয় এমন একটি ইমেল দিয়ে সাবস্ক্রাইব করে?" এর মতো সমস্যা হ্যান্ডেল করতে সাহায্য করতে পারে।

প্রস্তুত? আসুন প্রতিটি ধাপ ব্রেক ডাউন করি এবং দেখি কীভাবে ম্যাজিকটি হয়।

সাবস্ক্রাইবিং

সাবস্ক্রিপশন প্রসেস শুরু হয় একটি বিনীত ওয়েব ফর্ম দিয়ে, যেমন আমার সাইটের মেইন পেজে থাকা ফর্ম। type="email" required অ্যাট্রিবিউটসহ একটি ফর্ম ইনপুট ব্রাউজারের সাহায্যে ভ্যালিডেশন করতে সাহায্য করে। সাবমিট হলে, ফর্মটি Simple Subscribe সাবস্ক্রিপশন এন্ডপয়েন্টে একটি GET রিকোয়েস্ট পাঠায়।

Simple Subscribe এই এন্ডপয়েন্টে একটি GET রিকোয়েস্ট পায় যাতে কোয়েরি স্ট্রিং-এ ইচ্ছুক সাবস্ক্রাইবারের ইমেল থাকে। এরপর এটি একটি id ভ্যালু জেনারেট করে এবং email এবং id দুটো আপনার DynamoDB টেবিলে যোগ করে।

টেবিল আইটেমটি এখন এমন দেখাবে:

emailconfirmidtimestamp
subscriber@example.comfalseuuid-xxxxx2020-11-01 00:27:39

confirm কলামটি, যেটি একটি বুলিয়ান ধারণ করে, ইঙ্গিত করে যে আইটেমটি একটি সাবস্ক্রিপশন রিকোয়েস্ট যা এখনো কনফার্মড নয়। ডাটাবেসে একটি ইমেল ঠিকানা ভেরিফাই করতে, আপনাকে সঠিক আইটেমটি খুঁজে বের করে confirm-কে true করতে হবে।

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

উদাহরণস্বরূপ, কেউ যদি একই ইমেল ঠিকানার জন্য পরের সাবস্ক্রিপশন রিকোয়েস্ট করে, আপনি কীভাবে হ্যান্ডেল করবেন?

আপনি বলতে পারেন, "একটি নতুন লাইন আইটেম তৈরি করুন নতুন id দিয়ে।" তবে, এটি সার্ভারলেস অ্যাপ্লিকেশন ডাটাবেস রিকোয়েস্ট ভলিউম দ্বারা পেইড হলে সেরা কৌশল নাও হতে পারে।

যেহেতু DynamoDB Pricing নির্ভর করে কত ডেটা আপনি আপনার টেবিলে রিড এবং রাইট করছেন, অতিরিক্ত ডেটা জমা না দিয়ে আপডেট করা সুবিধাজনক।

এটি ধরে, সাবস্ক্রিপশন রিকোয়েস্ট একই ইমেলের জন্য পাওয়া গেলে, একটি আপডেট অপারেশন করা প্রুডেন্ট হবে নতুন লাইন যোগ করার বদলে।

Simple Subscribe আসলে একই ফাংশন ব্যবহার করে ডাটাবেস আইটেম বা অ্যাড করতে বা আপডেট করতে। এটিকে সাধারণত "update or insert" বলা হয়।

SQLite-এর মতো ডাটাবেসে এটি UPSERT সিন্ট্যাক্স দিয়ে করা হয়। DynamoDB-এর কেসে, আপনি একটি আপডেট অপারেশন ব্যবহার করেন। Go SDK-এর জন্য, এর সিন্ট্যাক্স হলো UpdateItem।

যখন একটি ডুপ্লিকেট সাবস্ক্রিপশন রিকোয়েস্ট পাওয়া যায়, ডাটাবেস আইটেমটি শুধু email-এর ওপর ম্যাচ করা হয়। যদি একটি বিদ্যমান লাইন আইটেম পাওয়া যায়, এর id এবং timestamp ওভাররাইড হয়, যা বিদ্যমান ডাটাবেস রেকর্ড আপডেট করে এবং ডুপ্লিকেট রিকোয়েস্ট দিয়ে আপনার টেবিল ফ্লাড হওয়া থেকে বাঁচায়।

ইমেল ঠিকানা ভেরিফাই করার পদ্ধতি

ফর্ম সাবমিট করার পর, ইচ্ছুক সাবস্ক্রাইবারটি SES-থেকে একটি ইমেল পাবে যাতে একটি লিংক থাকবে। এই লিংকটি টেবিল থেকে email এবং id ব্যবহার করে বানানো হয়, এবং ফরম্যাটটি হলো:

<BASE_URL><VERIFY_PATH>/?email=subscriber@example.com&id=uuid-xxxxx 

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

লিংকটি ভিজিট করলে আপনার ভেরিফিকেশন এন্ডপয়েন্টে একটি রিকোয়েস্ট যায় যাতে email এবং id কোয়েরি স্ট্রিং-এ থাকে।

এবারের জন্য, ইনকামিং email এবং id ভ্যালু দুটোই ডাটাবেস রেকর্ডের সাথে তুলনা করা গুরুত্বপূর্ণ। এটি যাচাই করে যে কনফার্মেশন ইমেলের প্রাপকই রিকোয়েস্টটি করছে।

ভেরিফিকেশন এন্ডপয়েন্ট নিশ্চিত করে যে এই ভ্যালুগুলো ডাটাবেসের একটি আইটেমের সাথে ম্যাচ করে, তারপর একটি আরো আপডেট অপারেশন করে confirm-কে true সেট করে, এবং টাইমস্ট্যাম্প আপডেট করে। আইটেমটি এখন এমন দেখাবে:

emailconfirmidtimestamp
subscriber@example.comtrueuuid-xxxxx2020-11-01 00:37:39

ইমেল কোয়েরি করার পদ্ধতি

আপনি এখন আপনার টেবিল কোয়েরি করে আপনার ইমেল লিস্ট বানাতে পারেন। আপনার ইমেল পাঠানোর সমাধানের উপর নির্ভর করে, আপনি এটি ম্যানুয়ালি করতে পারেন, অন্য একটি Lambda দিয়ে, বা এমনকি কমান্ড লাইন থেকে।

যেহেতু অনুরোধকৃত সাবস্ক্রিপশন (যেখানে confirm হলো false) এর ডেটা কনফার্মড সাবস্ক্রিপশনের পাশাপাশি টেবিলে সংরক্ষিত থাকে, কোয়েরি করার সময় এই ডেটা ডিফারেনশিয়েট করা গুরুত্বপূর্ণ। আপনাকে নিশ্চিত করতে হবে আপনি শুধু সেই ইমেলগুলো রিটার্ন করছেন যেখানে confirm হলো true।

আনসাবস্ক্রাইব লিংক প্রদান করার পদ্ধতি

ইমেল ঠিকানা ভেরিফাই করার মতোই, Simple Subscribe email এবং id-কে আর্গুমেন্ট হিসেবে ব্যবহার করে আপনার DynamoDB টেবিল থেকে একটি আইটেম ডিলিট করার ফাংশনে যাতে একটি ইমেল ঠিকানা আনসাবস্ক্রাইব করা যায়।

লোকেদের আপনার লিস্ট থেকে নিজেদের রিমুভ করতে দিতে, আপনাকে প্রতিটি ইমেলে একটি URL দিতে হবে যাতে তাদের email এবং id কোয়েরি স্ট্রিং হিসেবে আনসাবস্ক্রাইব এন্ডপয়েন্টে থাকে। এরকম কিছু হবে:

<BASE_URL><UNSUBSCRIBE_PATH>/?email=subscriber@example.com&id=uuid-xxxxx 

লিংকটি ক্লিক করলে, কোয়েরি স্ট্রিং আনসাবস্ক্রাইব এন্ডপয়েন্টে পাস হবে। যদি প্রদত্ত email এবং id ডাটাবেস আইটেমের সাথে ম্যাচ করে, সেই আইটেমটি ডিলিট হয়ে যাবে।

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

আপনার ডেটার যত্ন নেওয়ার পদ্ধতি

একবার আপনি অন্যের ডেটা গ্রহণ করার সিদ্ধান্ত নিলে, সেটির যত্ন নেওয়া আপনার দায়িত্ব হয়। এটি আপনার বানানো সব জিনিসের জন্য প্রযোজ্য। Simple Subscribe-এর জন্য, এটার মানে আপনার ডাটাবেসের সিকিউরিটি মেইনটেইন করা, এবং পিরিয়ডিক্যালি আপনার টেবিল প্রুন করা।

confirm যেখানে false এবং timestamp নির্দিষ্ট সময়ের চেয়ে পুরনো সেখানে ডাটাবেস আইটেম খুঁজে বের করে একটি ক্লিনিং ফাংশন সেট আপ করা ভালো Idee যেটি রেগুলার শিডিউলে রান করে। এটি ম্যানুয়ালি, একটি AWS Lambda ফাংশন দিয়ে, বা কমান্ড লাইন ব্যবহার করে অর্জন করা যেতে পারে।

ক্লিন আপ করতে, ডাটাবেস আইটেম খুঁজুন যেগুলোর confirm হলো false এবং timestamp একটি নির্দিষ্ট পয়েন্টের চেয়ে পুরনো। আপনার ইউজ কেস এবং রিকোয়েস্ট ভলিউমের উপর নির্ভর করে, আপনি যে ফ্রিকোয়েন্সিতে ক্লিন আপ করতে চান সেটি ভিন্ন হবে।

আপনার ইউজ কেসের উপর নির্ভর করে, আপনি আপনার ডেটার ব্যাকআপ রাখতে চাইতে পারেন। আপনি যদি ডেটা ইন্টিগ্রিটি নিয়ে খুব চিন্তিত হন, তবে DynamoDB-এর On-Demand Backup বা Point-in-Time Recovery এক্সপ্লোর করতে পারেন।

আপনার স্বাধীন সাবস্ক্রাইবার বেস বানান

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

আমি আপনাকে আজই Simple Subscribe দিয়ে আপনার সাবস্ক্রাইবার বেস বানাতে উৎসাহিত করছি। আমার অধিকাংশ কাজের মতো, এটি ওপেন সোর্স এবং আপনার ব্যক্তিগত ব্যবহারের জন্য ফ্রি। GitHub রিপোজিটরিতে কোডে ডুবিয়ে পড়ুন বা SimpleSubscribe.org-এ আরও জানুন।

আপনি যদি এই পোস্টটি পছন্দ করেন, আমি জানতে চাই। হাজার হাজার মানুষের সাথে victoria.dev-এ শিখুন। আরও এমন প্রজেক্টের জন্য ভিজিট করুন বা RSS-এ সাবস্ক্রাইব করুন।

  1. ক্লাউডফ্লেয়ার ওয়ার্কার্স এবং সার্ভারলেস রেডিস দিয়ে কাস্টম ওয়েইটিং রুম তৈরি করুন - ট্রাফিক সার্জ নিয়ন্ত্রণ

  2. Next.js-এ SendGrid API ব্যবহার করে কন্ট্যাক্ট ফর্ম তৈরি করুন: ধাপে ধাপে গাইড

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

  4. গিটহাব মার্কেটপ্লেসে আপনার অ্যাপ পাবলিশ করুন: লিস্টিং ও ভিজিবিলিটির ধাপে ধাপে গাইড