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

বাশ দিয়ে S3 ইমেইল রিট্রিভাল অটোমেট করুন: SES মেসেজ ডাউনলোড ও ভিউ

যে আর্টিকেলে পড়তে পারবেন, আমার gầnে ইমেইল সার্ভারের সাথে কিছু সমস্যা হয়েছিল এবং আমি ইমেইল অ্যাডমিনিস্ট্রেশন আউটসোর্স করলাম আমাজনের সিম্পল ইমেইল সার্ভিস (SES)-এ।

उस সমাধানের সমস্যা ছিল যে SES নতুন মেসেজগুলো একটি S3 বাকেটে সংরক্ষণ করত, এবং AWS ম্যানেজমেন্ট কনসোল ব্যবহার করে S3 বাকেটের ফাইলগুলো পড়া খুব দ্রুত বোরিং (stale) হয়ে যাচ্ছিল।

তাই আমি একটি বাশ স্ক্রিপ্ট লিখলাম নতুন মেসেজগুলো ডাউনলোড, সঠিকভাবে সংরক্ষণ, এবং ভিউ করার প্রক্রিয়া অটোমেট করার জন্য।

যদিও আমি এই স্ক্রিপ্টটি আমার উবুন্টু লিনাক্স ডেস্কটপের জন্য লিখেছিলাম, এটি ম্যাকওএস বা উইন্ডোজ ১০-এ উইন্ডোজ সাবসিস্টেম ফর লিনাক্স (WSL) দিয়ে খুব কম পরিবর্তন দিয়ে চালানো যাবে।

এখানে সম্পূর্ণ স্ক্রিপ্টটি একসাথে দেওয়া হলো। একটু thờiয় নিতে পারেন এটি ওভারভিউ করার জন্য, তারপর আমি ধাপে ধাপে এক্সপ্লেইন করব।

#!/bin/bash # Retrieve new messages from S3 and save to tmpemails/ directory: aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount # Set location variables: tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/ # Create new directory to store today's messages: today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today" # Give the message files readable names: for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done # Open new files in Gedit: for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done

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

aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount

বেশক, এটি তখনই কাজ করবে যদি আপনি ইতিমধ্যে আপনার লোকাল সিস্টেমের জন্য AWS CLI ইনস্টল ও কনফিগার করে থাকেন। যদি এখনও না করে থাকেন তবে এখনই করুন।

cp কমান্ড মানে "কপি" (copy), --recursive CLI-কে বলে একাধিক অবজেক্টেও অপারেশন প্রয়োগ করতে, s3://bucket-name আমার বাকেটকে পয়েন্ট করে (আপনার বাকেটের নাম নিশ্চিতভাবেই ভিন্ন হবে), /home/david... লাইনটি হলো আبسোলিউট ফাইলসিস্টেম অ্যাড্রেস যেখানে আমি মেসেজগুলো কপি করতে চাই, এবং --profile আর্গুমেন্ট CLI-কে বলে আমার একাধিক AWS একাউন্টের মধ্যে কোনটিকে রেফার করছি।

পরবর্তী সেকশন দুটি ভেরিয়েবল সেট করে যা স্ক্রিপ্টের বাকি অংশে ফাইলসিস্টেম লোকেশন স্পেসিফাই করা খুব সহজ করে দেবে।

tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/

লক্ষ্য করুন tmp_file_location ভেরিয়েবলের মান একটি এস্টেরিস্ক (asterisk) দিয়ে শেষ হয়েছে। এর কারণ হচ্ছে আমি সেই ডিরেক্টরির ভিতরের ফাইলগুলোকে রেফার করতে চাই, ডিরেক্টরিটি নিজে নয়।

আমি .../emails/ হায়ারার্কিতে একটি নতুন পারমানেন্ট ডিরেক্টরি তৈরি করব যাতে পরবর্তীতে মেসেজগুলো খুঁজে পাওয়া সহজ হয়। এই নতুন ডিরেক্টরির নাম হবে বর্তমান তারিখ।

today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"

আমি প্রথমে today নামে একটি নতুন শেল ভেরিয়েবল তৈরি করি যা date +"%m_%d_%Y" কমান্ডের আউটপুট দিয়ে পপুলেট হবে। date নিজে পুরো ডেট/টাইমস্ট্যাম্প আউটপুট করে, কিন্তু এরপরে যা আসে ("%m_%d_%Y") সেটি আউটপুটকে একটি সহজ এবং আরও পঠনীয় ফরম্যাটে রূপান্তর করে।

তারপর আমি সেই নামে একটি ডিরেক্টরির অস্তিত্ব টেস্ট করি - যা ইঙ্গিত করবে যে আমি ইতিমধ্যে সেই দিন ইমেইল পেয়েছি এবং, সেজন্য, ডিরেক্টরি পুনরায় তৈরি করার দরকার নেই। যদি এমন একটি ডিরেক্টরি নাই (||), তবে mkdir সেটি আমার জন্য তৈরি করবে। আপনি যদি এই টেস্ট না করেন, তবে আপনার কমান্ডités অ্যাঞ্জয়িং (annoying) এরর মেসেজ রিটার্ন করতে পারে।

যেহেতু আমাজন SES আমার S3 বাকেটে ড্রপ করা প্রতিটি মেসেজকে বদসूरत এবং অনরিডেবল (unreadable) নাম দেয়, আমি এখন ডাইনামিক্যালি সেগুলো রিনেম করব এবং একই সাথে সেগুলো তাদের নতুন হোমে (আমি যা ডেটেড ডিরেক্টরি তৈরি করলাম সেখানে) মুভ করব।

for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done

for...do...done লুপ $tmp_file_location ভেরিয়েবল দ্বারা রিপ্রেজেন্ট করা ডিরেক্টরির প্রতিটি ফাইল পড়বে এবং সেটিকে আমি তৈরি করা ডিরেক্টরিতে (যেটি $base_location ভেরিয়েবল এবং $today-এর বর্তমান মান দিয়ে রিপ্রেজেন্ট করা হয়েছে) মুভ করবে।

একই অপারেশনের অংশ হিসেবে, আমি সেটি একটি নতুন নাম দেব, স্ট্রিং "email" এবং rand কমান্ড দিয়ে জেনারেট করা একটি র‍্যান্ডম নম্বর। আপনাকে র‍্যান্ডম নম্বর জেনারেটর ইনস্টল করতে হতে পারে: উবুন্টুতে সেটি হবে apt install rand।

স্ক্রিপ্টের একটি পূর্বের ভার্সন ছোট, সিকোয়েনশিয়াল (sequential) নম্বর দিয়ে নাম তৈরি করত যা count=1...count=$((count+1)) লজিক দিয়ে for লুপের ভেতরে ইনক্রিমেন্ট হতো। সেটি তখন পর্যন্ত ভালো কাজ করত যতক্ষণ না আমি একই দিনে একাধিক ব্যাচে মেসেজ পেতাম। যদি সেটি হয়, তবে নতুন মেসেজগুলো সেটি দিনের ডিরেক্টরিতে পুরনো ফাইলগুলো ওভাররাইট করত।

আমার rand কমান্ড গাণিতিকভাবে ওভারল্যাপিং নম্বর দুই ফাইলে অ্যাসাইন করতে পারে কিন্তু, যেহেতু rand ডিফল্ট রেঞ্জ ১ থেকে ৩২,৫৭৬ পর্যন্ত ব্যবহার করে, আমি সেটি রিস্ক নেওয়ার ইচ্ছুক।

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

আমার নিজের সিস্টেমে tree কমান্ড চালালে দেখতে পাচ্ছি পাঁচটি মেসেজ 02_27_2020 ডিরেক্টরিতে সংরক্ষিত হয়েছে, এবং একটি আরও 02_28_2020-এ (এই ফাইলগুলো স্ক্রিপ্টের পুরনো ভার্সন দিয়ে জেনারেট হয়েছিল, তাই সিকোয়েনশিয়ালি নম্বর দেওয়া হয়েছিল)।

বর্তমানে tmpemails-এ কোনো ফাইল নেই - কারণ mv কমান্ড ফাইলগুলো তাদের নতুন লোকেশনে মুভ করে দিয়েছে, পিছনে কিছুই রেখেনি।

$ tree . ├── emails │   ├── 02_27_2020 │   │   ├── email1 │   │   ├── email2 │   │   ├── email3 │   │   ├── email4 │   │   ├── email5 │   └── 02_28_2020 │   └── email1 └── tmpemails

স্ক্রিপ্টের চূড়ান্ত সেকশন প্রতিটি নতুন মেসেজ আমার পছন্দের ডেস্কটপ টেক্সট এডিটর (Gedit)-এ ওপেন করে। এটি একটি সাদৃশ্য for...do...done লুপ ব্যবহার করে, এইবার নতুন ডিরেক্টরির ( "today" কমান্ড দিয়ে রেফারেন্সড) প্রতিটি ফাইলের নাম পড়ে এবং সেটি Gedit-এ ওপেন করে। ডিরেক্টরি লোকেশনের শেষে যোগ করা এস্টেরিস্কটি লক্ষ্য করুন।

for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done

এখনও একটা কাজ বাকি। যদি আমি আমার S3 বাকেট ক্লিন আউট (clean out) না করি, তবে এটি প্রতিবার স্ক্রিপ্ট চালালে সমস্ত জমা মেসেজ ডাউনলোড করবে। এটি উত্তরোত্তর ম্যানেজ করা কঠিন করে দেবে।

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

#!/bin/bash # Delete all existing emails aws s3 rm --recursive s3://bucket-name/ --profile myaccount
  1. মাইক্রোসফট এজ ব্রাউজারে ব্যবহারকারীদের ফাইল ডাউনলোড বাধা দেওয়ার পদ্ধতি

  2. লিনাক্সে শেয়ারড ডিরেক্টরিতে ফাইল ম্যানেজ করার জন্য Sticky Bit ব্যবহার করা

  3. উইন্ডোজে অফলাইন ম্যাপস মাস্টার করুন: ধাপে ধাপে গাইড

  4. AWS দিয়ে ভিডিও ফাইল কার্যকরভাবে কনভার্ট করুন: ধাপে ধাপে গাইড