DEV Community

Fahad Ali Khan
Fahad Ali Khan

Posted on

Implementing and Integrating Email Automation in a Python Timesheet Project

Below is the updated blog post with the links you’ve provided integrated into the discussion. You can adjust formatting as needed.


Blog Post: Implementing and Integrating Email Automation in a Python Timesheet Project

Date: December 8, 2024

Author: Your Name

Introduction

This past week, I took on my first real contribution to a Python-based codebase. Although I’ve done a Python course about a year ago, my skills were quite rusty. Before jumping into this project, I spent about 10 hours on a quick Python crash course from FreeCodeCamp (link) just to refresh my memory on the basics—control structures, data types, standard libraries, and best practices. This preparatory work was necessary because I was about to dive into a code repository that automated certain administrative tasks, and I needed to ensure I was up to speed.

Context and Challenges

I’ve been juggling multiple commitments: I’m taking 5 other courses and currently going through internship interviews, so time management has been extremely tough. My goals with these PRs (pull requests) were initially modest—just build a strong foundational understanding of the project’s architecture, and then make incremental contributions. In the spirit of continuous improvement and measuring my progress from my initial baseline (“0.2” confidence level), I set out to do the following:

  • Understand the existing timesheet automation code.
  • Add a module that generates email data (emailDataGenerator).
  • Integrate a new module to send automated emails upon completing the timesheet updates (sendEmail).

This blog post focuses on detailing my contributions for each PR, the process I followed, what I learned, and how I measured my progress in terms of complexity and comfort working with Python code.

Issue #2 and #3: Foundations for Email Data Generation and Sending

These two issues defined the scope of what I needed to achieve: first, create and integrate an email data generator, and second, actually send emails after the timesheet updates.

PR #4: Introducing Email Data Generation

Link to PR: PR #4

My first PR involved creating a function emailDataGenerator that returns a structured list containing email details such as the recipient email, subject line, current date, and week range. Before starting, I had limited knowledge of Python’s datetime module and date handling. I spent a couple of hours experimenting with datetime, trying to figure out how to compute weekly date ranges (e.g., from Monday to Sunday) and formatting dates using strftime.

What I Did:

  • Created a separate file email_generator.py.
  • Implemented emailDataGenerator(receiver, subject, sender) which returns [receiverEmail, subject, current_date, current_week_range, salutations].
  • Used datetime.now(), timedelta, and strftime to produce human-readable date formats.

What I Learned:

  • How to modularize Python code: Separating logic into multiple files makes it cleaner and more maintainable.
  • Gained confidence in handling date operations in Python.
  • This boosted my comfort from a self-assessed “0.2” (very unsure) to about “0.5” (somewhat confident) with Python, as I had successfully written and integrated a non-trivial function.

Measuring Success:

  • The PR was merged without major requests for changes.
  • I was able to run the script and see the generated email data printed out, confirming correctness.

PR #5: Sending Automated Emails After Timesheet Updates

Link to PR: PR #5

The second PR involved more complexity: actually sending emails. I introduced sendEmail(emailData, receiverEmail) using Python’s smtplib and email.message.EmailMessage. This required understanding SMTP, configuring an email server (e.g., Gmail SMTP), and handling authentication. Since this was my first time doing anything email-related in Python, I did the following:

  • Created a new module email_sender.py.
  • Implemented sendEmail that took the structured emailData from emailDataGenerator and dispatched an email via SMTP.
  • Handled errors by returning "email not sent" if any exceptions occurred, or True if the sending was successful.
  • Integrated this into timesheet.py so that after the Excel timesheet is generated and saved, the script calls emailDataGenerator, then passes that data to sendEmail.

What I Learned:

  • How to work with smtplib to establish a secure connection using starttls().
  • The importance of securing credentials. I learned that hardcoding passwords isn’t ideal and considered environment variables or other credential stores for a more secure approach.
  • Improved confidence in debugging since my first attempts at sending emails failed due to authentication errors, and I learned to read stack traces and documentation carefully.
  • This experience bumped my comfort from “0.5” to about “0.7”. I’m not a Python guru yet, but I’m a lot more comfortable troubleshooting issues and reading official Python documentation now.

Measuring Success:

  • After merging the PR, I tested the workflow end-to-end: update timesheet, generate data, send email.
  • Verified that an actual email landed in the test recipient’s inbox. That felt incredibly rewarding and concrete.

Process and Time Management Reflections

Time management was a big challenge. I’m juggling multiple courses and internship interviews. However, I managed to be more structured this time:

  • Block scheduling: Dedicated a 3-hour block specifically for Python work on weekends.
  • Small milestones: First, just make sure emailDataGenerator worked independently. Next, ensure sendEmail worked with dummy data before integrating with the main code.
  • Continuous Review: Writing about my process in blog posts helped me clarify my thoughts. Explaining things often reveals gaps or suggests improvements.

By writing this progress report, I’ve recognized how explaining the code and process forced me to better understand it. Every difficulty I faced became clearer once I wrote it down.

How I Measured My Progress from 0.2

Initially, I considered myself at a 0.2 comfort level with Python because I had little recent hands-on experience. After these PRs:

  • Comfort with Python syntax & structures: Moved from uncertain to fairly confident.
  • Using third-party libraries: I learned to integrate smtplib, email.message, datetime, and openpyxl more seamlessly.
  • Contributing to a codebase with specific domain logic: I now know how to do weekly date calculations and integrate them into a workflow.

Overall, I’ve gone from 0.2 to about 0.7 in terms of confidence. I’m still not an expert, but I’m significantly more comfortable than before, especially with debugging, modular code design, and handling external libraries.

Links and References

Conclusion

This series of PRs taught me that incremental learning and improvement, combined with reflective writing, can significantly accelerate skill development. I’m pleased with how I integrated emailDataGenerator and sendEmail into the timesheet automation pipeline, and I know that as I take on more complex features, I’ll continue to measure and celebrate my progress—one PR at a time.

Top comments (0)