Skip to main content

Automatic Birthday mail sending with Python

 The first thing we do is import six libraries: 

Apart from this, Also create an Excel sheet for containing records like this: NameEmailContactBirthday, 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:


# import required packages import pandas as pd import datetime import smtplib import time import requests from win10toast import ToastNotifier # your gmail credentials here GMAIL_ID = 'your_email_here' GMAIL_PWD = 'your_password_here' # for desktop notification toast = ToastNotifier() # define a function for sending email def sendEmail(to, sub, msg): # conncection 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 funtion 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 code if __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)





Comments

Popular posts from this blog

INSTALLING PYTHON (Anaconda)

 IN WINDOWS :  Download the Anaconda installer (TIP : IF IMAGES ARE BLURRED , TAP ON THEM FOR FULL SCREEN IMAGE) 1] Click the link the download will be started! 2]  Double click the downl oaded file to launch. 3] Click NEXT 4]  Read the licensing terms and click “I Agree”. 5] Select an install for “Just Me” 6] Select a destination folder to install Anaconda and click the Next button   7] Choose whether to add Anaconda to your PATH environment variable. We recommend not adding Anaconda to the PATH environment variable, since this can interfere with other software. Instead, use Anaconda software by opening Anaconda Navigator or the Anaconda Prompt from the Start Menu. 8] Choose whether to register Anaconda as your default Python. Unless you plan on installing and running multiple versions of Anaconda or multiple versions of Python, accept the default and leave this box checked 9] Click the Install button. If you want to watch the packages Anaconda is installing, c...

Jumble Words Game!

Jumbled word game :  Jumbled word is given to player, player has to rearrange the characters of the word to make a correct meaningful word. As we know this GUI code required Pyqt5 Module so before getting into code make sure to install pyqt5 in your system using the command, pip install pyqt5 You can use as many words you want to make the game more interesting or complicated. Code : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 18...

Flip Tiles. Memory Game!

CODE : Check Out Our Instagram Page : Instagram.com/Python.Coderss   # import modules from random import * from turtle import * # set the screen screen = Screen() #choose background color screen.bgcolor("yellow") # define the function # for creating a square section # for the game def Square(x, y): up() goto(x, y) down() color('white', 'green') begin_fill() for count in range(4): forward(50) left(90) end_fill() # define functionn to # keep a check of index number def Numbering(x, y): return int((x + 200) // 50 + ((y + 200) // 50) * 8) # define function def Coordinates(count): return (count % 8) * 50 - 200, (count // 8) * 50 - 200 # define function # to make it interactive # user click def click(x, y): spot = Numbering(x, y) mark = state['mark'] if mark is None or mark == spot or tiles[mark] != tiles[spot]: state['mark'] = spot else: hide[spot] = False hide[mark] = False state[...