পাইথন দিয়ে বন্ধুদের জন্মদিনে উইশ করো অটোমেটিকভাবে ইমেইল সেন্ড করে

Arnob Das
6 min readApr 27, 2021

--

পাইথন দিয়ে বন্ধুদের জন্মদিনে উইশ করো অটোমেটিকভাবে ইমেইল সেন্ড করে

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

* পিসিতে পাইথন ইনস্টল থাকতে হবে।

* যেকোনো একটা কোড এডিটর ইনস্টল থাকতে হবে।(Recommended : Pycharm Or Vs Code)

* কোড এডিটরে নতুন একটি পাইথন প্রজেক্ট খুলতে হবে।

* এক্সেল ফাইল রিড করার জন্যে প্রজেক্টে দুইটা প্যাকেজ ইনস্টল করতে হবে।

চলুন শুরু করা যাক। প্রথমেই আমরা আমাদের কোড এডিটরে প্রজেক্ট এর টার্মিনাল থেকে দুইটা কম্যান্ড দিয়ে প্যাকেজগুলো ইনস্টল করবো।

pip install pandas
pip install openpyx

এবার আমরা আমাদের প্রজেক্টে নতুন একটা পাইথন ফাইল তৈরী করবো main.py নামে। ফাইলটা ওপেন করে আমরা pandas, datetime, smtplib প্যাকেজগুলো ইম্পোর্ট করে নিবো। smtblib প্যাকেজ নিয়ে আমরা আরেকটুপরে কথা বলবো।

import pandas as pd
import datetime
import smtplib

এরপর আমরা দুইটা ফাংশন তৈরী করবো। একটা হবে আমাদের মেইন ফাংশন এবং আরেকটা ফাংশন হবে sendEmail নামে যেটা দিয়ে আমরা ইমেইল সেন্ড করবো। আমাদের মেইন ফাংশন কাজটা কিভাবে করবে সেটা নিয়ে আমরা একটু এখানে বিস্তারিত ভাবে বোঝা শুরু করি। প্রথমে আমরা pandas এর read_excel মেথড ব্যবহার করে আমাদের এক্সসেল ফাইল থেকে ডাটাগুলো রিড করবো। এরপর আমরা datetime মেথড ব্যবাহার করে আজকের ডেট স্ট্রিং ফরম্যাটে today নামক একটা ভ্যারিয়েবল এর মধ্যে রাখবো এবং yearNow নামের আরেকটা ভ্যারিয়েবলের মধ্যে বর্তমান বছর স্ট্রিং ফরম্যাটে রাখবো। জন্মদিনে আমরা তো শুধু মাস এবং দিন নিয়ে হিসাব করি কিন্তু বর্তমান বছর নিয়ে কেন কাজ করতিছি সেটা এখন আমরা বোঝার চেষ্টা করি।

আমরা আমাদের এক্সেল ফাইল এর মধ্যে year নামে একটা ফিল্ড রেখেছি যেটা ফাঁকা রাখা হয়েছে। এর কারণ হলো আমরা তো আমাদের এই প্রজেক্টটা অটোমেটিক্যালি রান করানোর জন্যে সার্ভারে হোস্ট করবো এবং সার্ভারে সবসময় কোডটা রান হবে। এখন আমাদের কোনো বন্ধুর জন্মদিন যদি আজকে হয় তাহলে আজকের তারিখে অর্থাৎ আজকে রাত বারোটায় যখন প্রথম সার্ভার এ কোডটা রান হবে তখন একবার আমার বন্ধুর কাছে ইমেইল যাবে। তারপর পরের সেকেন্ডে কোডটা আবার রান হবে এবং দেখবে যে আজকের তারিখ এবং ওই বন্ধুর জন্মদিনের তারিখ একই। সুতরাং আবার কোডটা রান হবে এবং আবার ইমেইল পাঠায়ে দিবে। কিন্তু এভাবে চলতে থাকলে আমাদের বন্ধুর ইমেইল বক্স শুধু জন্মদিনের জন্যে পাঠানো ইমেইল দিয়েই ভরে যাবে। সেটা আমরা চাইনা। তাই আমরা যেটা করবো সেটা হলো আমরা কোডে বলে দিবো যে তুমি কোড রান করার সময় দুইটা

if __name__ == “__main__”:

df = pd.read_excel(“data.xlsx”)
today = datetime.datetime.now().strftime(“%d-%m”)
yearNow = datetime.datetime.now().strftime(“%Y”)
writeIndex = []
for index, item in df.iterrows():
bday = item[‘Birthday’].strftime(“%d-%m”)
if (today == bday) and yearNow not in str(item[‘Year’]):
sendEmail(item[‘Email’], item[‘Subject’], item[‘Message’])
writeIndex.append(index)

for i in writeIndex:
year = df.loc[i, ‘Year’]
df.loc[i, ‘Year’] = str(year) + ‘, ‘ + str(yearNow)

df.to_excel(‘data.xlsx’, index=False)

জিনিস খেয়াল করবা। প্রথমে খেয়াল করবা আজকের তারিখ এবং আমার কোনো বন্ধুর জন্মদিনের তারিখ একই কিনা। যদি একই হয় তাহলে sendEmail ফাংশনটা কল করার আগে আরেকটা জিনিস দেখবা যে এই বছরের নামটা এক্সেল ফাইল এর year ফিল্ডে আছে কিনা। কারণ এখন থেকে আমরা যে বছরের জন্যে ইমেইল সেন্ড করবো সেই বছরটা excel ফাইলের year ফিল্ডে to_excel মেথড দ্বারা এন্ট্রি করে দেব। তাহলে প্রতিবছর বন্ধুদের কাছে জন্মদিনের জন্যে আমাদের কোড থেকে একটার বেশি আর মেইল যাবে না। কারণ প্রথমবার তারিখের মিল পেয়ে কোডটা মেইল পাঠাবে এবং সাথে excel ফাইলটাও year ফিল্ডে এ বছরের নাম এন্ট্রি করে আপডেট করে দিবে। পরেরবার যখন কোডটা আবার রান হবে তখন তারিখের মিল থাকলেও কোড দেখবে যে এই বছরের নাম year ফিল্ডে আছে। সেইজন্যে সে আর sendEmail ফাংশনটা কল করবে না। তাই প্রতি বছর আমাদের কোড থেকে বন্ধুদের জন্মদিনে একটার বেশি ইমেইলও যাবে না। আমরা এখানে year ফিল্ডটা আপডেট করতিছি কিভাবে সেটা হয়তো অনেকেই ভাবতেছ। কাজটা খুব সহজ। আমরা লক্ষ্য করলেই দেখবো যে writeIndex নামে আমরা একটা ফাঁকা array নিয়েছি। এটা নেওয়ার কারণ হলো আমরা যে বন্ধুদের জন্মদিনে ইমেইল পাঠিয়ে এক্সেল ফাইলে তাদের ফিল্ডটা আপডেট করবো সেইসব বন্ধুদের নাম এক্সেল ফাইলের কত নম্বর সারিতে আছে সেটা আমরা writeIndex এ পাঠায়ে দিবো। পরবর্তীতে আমরা writeIndex এর ওপর for loop চালায়ে যেসব বন্ধুদের জন্মদিন আজকে তাদের জন্যে আলাদা আলাদা সারি পাবো এবং সেই সারিতে আমরা একটা আইটেম খুঁজবো যে আইটেম এর নাম “Year”. সেই আইটেম এর মধ্যে আগে থেকে যদি কোনো বছর থাকে তাহলে আমরা আগের বছরের সাথে এবারের বছর তা যোগ করে দিবো। আর আগে থেকে কোনো বছর এন্ট্রি করা না থাকলে আমরা এবারের বছরটাই এন্ট্রি করে দিবো। তারপর আমরা আমাদের নির্দিষ্ট বন্ধুর জন্যে “Year” ফিলড আর নতুন value টা pandas এর to _excel মেথডের সাহায্যে এন্ট্রি করে দিবো। খুবই মজার না বিষয়টা???

এবার আমরা দেখবো আমাদের sendEmail ফাংশনটা কিভাবে কাজ করবে। sendEmail ফাংশনে তিনটা আর্গুমেন্ট নেওয়া হয়েছে যেগুলা হলো to, sub, msg . অর্থাৎ ইমেইলটা যে বন্ধুর কাছে সেন্ড হবে সেই বন্ধুর ইমেইল এড্রেস (to), ইমেইলের সাবজেক্ট কিহবে সেটা (sub) এবং ইমেইলে কি মেসেজ পাঠানো হবে সেটা (msg) এর মধ্যে নেওয়া হবে। sendEmail ফাংশনটা যেহেতু আমরা মেইন ফাংশন থেকে কল করবো এবং এক্সেল এর ডাটাও মেইন ফাংশন থেকেই রিড করবো তাই মেইন ফাংশন থেকে sendEmail ফাংশনটা কল করার সময় আমরা আর্গুমেন্টগুলো sendEmaill ফাংশন এর মধ্যে পাঠায়ে দিবো। এখন ইমেইল কোন বন্ধুর কাছে যাবে সেটা তো গেলো। কিন্তু কিভাবে যাবে সেটা এখন একটু বোঝার চেষ্টা করি।

GMAIL_ID = ‘’
GMAIL_PSWD = ‘’
def sendEmail(to, sub, msg):
print(f”Email to {to} sent with subject: {sub} and message {msg}”)
s = smtplib.SMTP(‘smtp.gmail.com’, 587)
s.starttls()
s.login(GMAIL_ID, GMAIL_PSWD)
s.sendmail(GMAIL_ID, to, f”Subject: {sub}\n\n{msg}”)
s.quit()

আমরা আমাদের প্রজেক্টে ইমেইল পাঠানোর জন্যে আমরা smtplib এর জিমেইল প্রোটোকল ব্যবহার করবো। আর সেইজন্যে আমাদেরকেও ইমেইল পাঠানের জন্যে জিমেইল ব্যবহার করতে হবে। আমরা প্রথমে GMAIL_ID এবং GMAIL_PSWD নামের দুইটা ভ্যারিয়েবলের মধ্যে আমাদের জিমেইল আইডি এবং জিমেইলের পাসওয়ার্ড রেখে দিবো। এবার আমরা sendMail ফাংশন এর smtp.gmail.com এর মাধ্যমে SMTP এর জিমেইল হোস্ট তৈরী করে নিবো পোর্ট নম্বর 587 দিয়ে। এরপর আমরা ttls সেশন শুরু করবো ইমেইল পাঠানের জন্যে। কিন্তু ইমেইল পাঠানের জন্যে আমাদের তো লগইন করতে হবে প্রথমে। তাই আমরা smtp এর লগইন মেথডের মাধ্যমে আর্গুমেন্ট হিসেবে GMAIL_ID এবং GMAIL_PSWD দিয়ে লগইন করবো। লগইন করার পর আমাদের প্রথম কাজ হলো আমাদের যে বন্ধুর আজ জন্মদিন সেই বন্ধুর মেইল এড্ড্রেসে ইমেইল পাঠানো। সুতরাং আমরা এখন আমাদের সবচেয়ে গুরুত্বপূর্ণ কাজটা করবো যেটা হলো ইমেইল সেন্ড করা। সেটার জন্যে আমরা আবার smtp এর sendmail মেথডের মাদ্ধমে আর্গুমেন্ট হিসেবে বন্ধুর ইমেইল এড্রেস, সাবজেক্ট এবং মেসেজ আর্গুমেন্ট থেকে নিয়ে ইমেইল পাঠায়ে দিবো। ইমেইল সেন্ড করার পর আমাদের আরো একটা কাজ করতে হবে। সেটা হলো ইমেইল পাঠানের পর আমরা তো smtplib কে এমনি এমনি আমাদের কোডে বসায়ে রাখবোনা। ইমেইল পাঠানের কাজ শেষ হলে আমরা smtplib কে বন্ধ করে দিবো। সেটার জন্যে আমরা আর একটা লাইন লিখবো যেটাতে আমরা smtp এর quit() মেথডকে কল করে smtp কে বন্ধ করে দিবো। ব্যাস!!! তাহলেই আমাদের পুরো প্রজেক্ট তা কমপ্লিট।

আমাদের বোঝার সুবিধার জন্যে পুরো কোডটা এখানে রাখা হলো:

import pandas as pd
import datetime
import smtplib

GMAIL_ID = ‘’
GMAIL_PSWD = ‘’

def sendEmail(to, sub, msg):
print(f”Email to {to} sent with subject: {sub} and message {msg}”)
s = smtplib.SMTP(‘smtp.gmail.com’, 587)
s.starttls()
s.login(GMAIL_ID, GMAIL_PSWD)
s.sendmail(GMAIL_ID, to, f”Subject: {sub}\n\n{msg}”)
s.quit()

if __name__ == “__main__”:

df = pd.read_excel(“data.xlsx”)
today = datetime.datetime.now().strftime(“%d-%m”)
yearNow = datetime.datetime.now().strftime(“%Y”)
writeIndex = []
for index, item in df.iterrows():
bday = item[‘Birthday’].strftime(“%d-%m”)
if (today == bday) and yearNow not in str(item[‘Year’]):
sendEmail(item[‘Email’], item[‘Subject’], item[‘Message’])
writeIndex.append(index)

for i in writeIndex:
year = df.loc[i, ‘Year’]
df.loc[i, ‘Year’] = str(year) + ‘, ‘ + str(yearNow)

df.to_excel(‘data.xlsx’, index=False)

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

এই প্রজেক্ট নিয়ে কিছু গুরুত্বপূর্ণ কথা :

এক্সেল ফাইলে শুধুমাত্র বন্ধুদের জন্মদিনের তারিখ বাদে সকল ডাটা টেক্সট ফরম্যাটে নিতে হবে। প্রজেক্টটা রান করার সময় অবশ্যই Microsoft Excel সফটওয়্যারটা বন্ধ রাখতে হবে।

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

আশা করি তোমাদের কাছে প্রজেক্ট খুবই মজার হবে। সো, আর দেরি না করে কোড করা শুরু করে দাও। হ্যাপি কোডিং !!!

Github: https://github.com/arnob-das/birthday-wish-automation

Excel: https://docs.google.com/spreadsheets/d/13xfaFJ7Q65E-x2FR5WKwzipea3JtNWQdJ1ziAc1-cfo/edit?fbclid=IwAR2fqtrvX24DQDN49QWvZltFVq6psKil7TQWYs2KtEtD3flR_4ulbJqL740#gid=1514365586

--

--