This is a 100 Days challenge to learn a new language (Python). 100 Days of Code - The Complete Python Pro Bootcamp
I will post some notes to motivate myself to finish this challenge.
Setting up a Google Account
In order to use Gmail SMTP Server,  we need to change some settings of Google Accounts
We can enable "less secure apps" feature in Google and our python code can use this account's credential to send out emails.
Unfortunately, it is no longer available.
The alternative way is to use an App Password.
An App Password is a 16-digit passcode that gives a less secure app or device permission to access your Google Account. App Passwords can only be used with accounts that have 2-Step Verification turned on.
After enabling 2-Step Verification, we can see 'App passwords' option under Signing in to Google section.
Then we can create app passwords to be used by our python code instead of google account password.
smtplib module
Ex:
  import smtplib
  GMAIL_SMTP_SERVER_ADDRESS = "smtp.gmail.com"
  GMAIL_SMTP_TLS_PORT = 587
  MY_EMAIL_ADDRESS = "your_account@gmail.com"
  # Create a connection to SMTP Provider
  connection = smtplib.SMTP(
    host=GMAIL_SMTP_SERVER_ADDRESS, 
    port=GMAIL_SMTP_TLS_PORT
  )
  # Make this connection secure
  connection.starttls()
  # Login with your Google App Password
  connection.login(user=MY_EMAIL_ADDRESS, password="your_app_password")
  # Send an email
  connection.sendmail(
      from_addr=MY_EMAIL_ADDRESS,
      to_addrs="your_receiver@gmail.com",
      msg="Subject: Python smtplib exp\n\nHello World!\n",
  )
  # Close connection
  connection.close()
Result:
Good Article to read:
datetime module
Ex:
  import datetime as dt
  # Return the current local date and time.
  now = dt.datetime.now()
  # <class 'datetime.datetime'>
  print(type(now))
  # 2022-11-01 02:55:54.186915
  print(now)
  # 2022
  print(now.year)
  # 11
  print(now.month)
  # 1
  print(now.day)
  # Return day of the week, where Monday == 0 ... Sunday == 6.
  # 1
  print(now.weekday())
  # Create a custom datetime
  my_birthday = dt.datetime(year=1999, month=12, day=1)
  # 1998-12-01 00:00:00
  print(my_birthday)
Challenge - Send Motivational Quotes on Mondays via Email
#1 Use datetime module to determine if the current day is Monday
#2 Open 'quotes.txt' file to get the all quotes
#3 Use random module to pick one quote randomly
#4 Use smtplib to send out Monday Motivation
quotes.txt
"When you arise in the morning think of what a privilege it is to be alive,
  to think, to enjoy, to love..."  - Marcus Aurelius
"Either you run the day or the day runs you." - Jim Rohn
Ex:
  import random
  import datetime as dt
  import smtplib
  GMAIL_SMTP_SERVER_ADDRESS = "smtp.gmail.com"
  GMAIL_SMTP_TLS_PORT = 587
  MY_EMAIL_ADDRESS = "your_account@gmail.com"
  def get_quote():
      """Open quotes.txt and randomly pick one quote"""
      # Open file
      with open("quotes.txt") as file:
          # Use random module to pick one quote
          quote = random.choice(file.readlines())
      return quote
  def is_monday():
      """Check if the current day is Monday"""
      now = dt.datetime.now()
      return now.weekday() == 0
  def send_email(message):
      """Send an email with message"""
      # Create a connection to SMTP Provider
      with smtplib.SMTP(
          host=GMAIL_SMTP_SERVER_ADDRESS, port=GMAIL_SMTP_TLS_PORT
      ) as connection:
          # Make this connection secure
          connection.starttls()
          # Login with your Google App Password
          connection.login(
            user=MY_EMAIL_ADDRESS, 
            password="your_app_password"
          )
          # Send an email
          connection.sendmail(
              from_addr=MY_EMAIL_ADDRESS, 
              to_addrs="your_receiver@gmail.com", 
              msg=message
          )
  # if it is Monday, then we will send a quote to motivate ourselves
  if is_monday():
      quote = get_quote()
      send_email(f"Subject: Monday Motivation\n\n{ quote }\n")
Project - Automated Birthday Wisher
#1 Fill out bithdays.csv with 'name,email,year,month,day' format
#2 Use pandas module to read csv
#3 Use list comprehension for filtering to get the birthdays which match today
#4 Open file and use random module to get the letter template
#5 Use smtplib module to send out birthday emails
letter_templates/letter_1.txt: (1~3)
  Dear [NAME],
  Happy birthday!
  All the best for the year!
  Frank
birthdays.csv
  name,email,year,month,day
  Mom,mom@your_email_provider,2022,11,01
  Dad,dad@your_email_provider,2022,11,02
Ex:
  import datetime as dt
  import pandas
  import random
  import smtplib
  GMAIL_SMTP_SERVER_ADDRESS = "smtp.gmail.com"
  GMAIL_SMTP_TLS_PORT = 587
  MY_EMAIL_ADDRESS = "your_account@gmail.com"
  now = dt.datetime.now()
  birthdays_data_frame = pandas.read_csv("birthdays.csv")
  def send_email(email_address, message):
      """Send an email with message"""
      # Create a connection to SMTP Provider
      with smtplib.SMTP(
          host=GMAIL_SMTP_SERVER_ADDRESS, port=GMAIL_SMTP_TLS_PORT
      ) as connection:
          # Make this connection secure
          connection.starttls()
          # Login with your Google App Password
          connection.login(user=MY_EMAIL_ADDRESS, 
            password="your_app_password")
          # Send an email
          connection.sendmail(
              from_addr=MY_EMAIL_ADDRESS, 
              to_addrs=email_address, 
              msg=message
          )
  def get_content_from_an_random_letter():
      """Get random letter content"""
      # Pick a random letter
      random_letter_path = 
        f"letter_templates/letter_{random.randint(1,3)}.txt"
      # Open letter template file and return its content
      with open(random_letter_path) as file:
          return file.read()
  # List Comprehension
  # Get the birthdays if its date match today
  match_birthdays = [
      row
      for (_index, row) in birthdays_data_frame.iterrows()
      if row["month"] == now.month and row["day"] == now.day
  ]
  # Loop through birthdays and send emails
  for person in match_birthdays:
      # Generate birthday message randomly by template
      message = get_content_from_an_random_letter().replace("[NAME]", 
        person["name"])
      # Send an email
      send_email(person["email"], 
        f"Subject: Happy Birthday\n\n{ message }\n")





No comments:
Post a Comment