Automatic Birthday mail sending with Python - GeeksforGeeks

25 Jan, 2022
Are you bored with sending birthday wishes to your friends or do you forget to send wishes to your friends or do you want to wish them at 12 AM but you always fall asleep? Why not automate this simple task by writing a Python script.
The first thing we do is import six libraries: 
pandas
datetime
smtplib
time
requests
win10toast
Apart from this, Also create an Excel sheet for containing records like this: Name, Email, Contact, Birthday, and Year. 
Approach:
For the sending email part, We define a sendEmail() function which will start a Gmail session, send the email, and quit the session.
For the SMS part, we must have an account on www.fast2sms.com from where we will get an API key. This API key is used to send SMS over mobile numbers using your account on fast2sms then We create a sendsms() function which will verify the API key and send SMS.
In the driver code section, we read the data from Excel sheet and match today’s date with any of the birthdays. If there is a match, we call the sendEmail() and sendsms() functions and also we add the current year in the Excel sheet. Also, we have used ToastNotifier from win10toast library to show desktop notifications once the e-mail and SMS has been sent successfully.
Below is the implementation:
Python
# import required packagesimport pandas as pdimport datetimeimport smtplibimport timeimport requestsfrom win10toast import ToastNotifier # your gmail credentials hereGMAIL_ID = 'your_email_here'GMAIL_PWD = 'your_password_here' # for desktop notificationtoast = ToastNotifier() # define a function for sending emaildef sendEmail(to, sub, msg):       # connection to gmail    gmail_obj = smtplib.SMTP('smtp.gmail.com', 587)         # starting the session    gmail_obj.starttls()             # login using credentials    gmail_obj.login(GMAIL_ID, GMAIL_PWD)           # sending email    gmail_obj.sendmail(GMAIL_ID, to,                   f"Subject : {sub}\n\n{msg}")         # quit the session    gmail_obj.quit()          print("Email sent to " + str(to) + " with subject "          + str(sub) + " and message :" + str(msg))         toast.show_toast("Email Sent!" ,                     f"{name} was sent e-mail",                     threaded = True,                     icon_path = None,                     duration = 6)     while toast.notification_active():        time.sleep(0.1) # define a function for sending sms       def sendsms(to, msg, name, sub):       url = "https://www.fast2sms.com/dev/bulk"    payload = f"sender_id=FSTSMS&message={msg}&language=english&route=p&numbers={to}"         headers = {        'authorization': "API_KEY_HERE",        'Content-Type': "application/x-www-form-urlencoded",        'Cache-Control': "no-cache",        }     response_obj = requests.request("POST", url,                                data = payload,                                headers = headers)    print(response_obj.text)    print("SMS sent to " + str(to) + " with subject :" +          str(sub) + " and message :" + str(msg))         toast.show_toast("SMS Sent!" ,                     f"{name} was sent message",                     threaded = True,                     icon_path = None,                     duration = 6)     while toast.notification_active():        time.sleep(0.1) # driver codeif __name__=="__main__":         # read the excel sheet having all the details    dataframe = pd.read_excel("excelsheet.xlsx")           # today date in format : DD-MM    today = datetime.datetime.now().strftime("%d-%m")         # current year in format : YY    yearNow = datetime.datetime.now().strftime("%Y")         # writeindex list    writeInd = []                                                       for index,item in dataframe.iterrows():               msg = "Many Many Happy Returns of the day dear " + str(item['NAME'])                        # stripping the birthday in excel        # sheet as : DD-MM        bday = item['Birthday'].strftime("%d-%m")                        # condition checking        if (today == bday) and yearNow not in str(item['Year']):                            # calling the sendEmail function            sendEmail(item['Email'], "Happy Birthday",                      msg)                            # calling the sendsms function            sendsms(item['Contact'], msg, item['NAME'],                    "Happy Birthday")                           writeInd.append(index)                                      for i in writeInd:               yr = dataframe.loc[i,'Year']                 # this will record the years in which        # email has been sent        dataframe.loc[i,'Year'] = str(yr) + ',' + str(yearNow)                 dataframe.to_excel('excelsheet.xlsx',                index = False)
sumitgumber28
sagartomar9927
Python-projects
python-utility
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python Dictionary
How to Install PIP on Windows ?
Enumerate() in Python
Different ways to create Pandas Dataframe
Python String | replace()
Reading and Writing to text files in Python
*args and **kwargs in Python
Create a Pandas DataFrame from Lists
Check if element exists in list in Python
How To Convert Python Dictionary To JSON?