← Back to Blog

Email Sending For New Contracts

Email Sending For New Contracts To accomplish this task, you'll need to follow these steps: Set up the Gmail API : This involves creating a project on Google Cloud, enabling the Gmail API, and obtaining the necessary credentials.

Email Sending For New Contracts

To accomplish this task, you'll need to follow these steps:

  • Set up the Gmail API: This involves creating a project on Google Cloud, enabling the Gmail API, and obtaining the necessary credentials.

  • Write a script to send emails using the Gmail API.

  • Integrate OpenAI's GPT-3.5 to update your CV text.

  • Ensure the text in the CV gets updated every three emails.

Here is a step-by-step guide along with the necessary code:

Step 1: Set up the Gmail API

Follow this guide to set up the Gmail API and get your credentials. You will need the credentials.json file.

Step 2: Install Required Libraries

You will need to install the following libraries:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib openai

Step 3: Write the Script

Here is a Python script that combines all the steps:

import os
import pickle
import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import openai

Set up OpenAI API key

openai.api_key = 'YOUR_OPENAI_API_KEY'

If modifying these SCOPES, delete the file token.pickle.

SCOPES = ['https://www.googleapis.com/auth/gmail.send']

def get_gmail_service():
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
return service

def create_message_with_attachment(sender, to, subject, message_text, file):
message = MIMEMultipart()
message['to'] = to
message['from'] = sender
message['subject'] = subject

msg = MIMEText(message_text)
                message.attach(msg)
                
                with open(file, 'rb') as f:
                    mime_application = MIMEApplication(f.read(), _subtype="pdf")
                    mime_application.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))
                    message.attach(mime_application)
                
                raw = base64.urlsafe_b64encode(message.as_bytes())
                return {'raw': raw.decode()}
                

def send_message(service, user_id, message):
try:
message = service.users().messages().send(userId=user_id, body=message).execute()
print('Message Id: %s' % message['id'])
return message
except Exception as error:
print('An error occurred: %s' % error)
return None

def update_cv_text(cv_text, iteration):
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"Update the following CV text to improve it:\n\n{cv_text}",
temperature=0.5,
max_tokens=500
)
return response.choices[0].text.strip()

def main():
service = get_gmail_service()
sender = '[email protected]'
to = '[email protected]'
subject = 'Updated CV'
message_text = 'Please find attached my updated CV.'

cv_file = 'cv.pdf'
                cv_text = "Your initial CV text here"
                email_count = 0
                
                while True:
                    if email_count % 3 == 0:
                        cv_text = update_cv_text(cv_text, email_count)
                        with open('cv.txt', 'w') as f:
                            f.write(cv_text)
                        # Convert the updated text to PDF (requires additional code/library)
                
                    message = create_message_with_attachment(sender, to, subject, message_text, cv_file)
                    send_message(service, 'me', message)
                    email_count += 1
                

if name == 'main':
main()

Notes:

  • Updating the CV and Converting to PDF: The code updates the CV text using OpenAI GPT-3.5 and writes it to a text file. You will need an additional library to convert the updated text to a PDF. Libraries like FPDF or ReportLab can be used for this purpose.

  • Google API Credentials: Ensure you have your credentials.json file in the same directory as your script.

  • OpenAI API Key: Replace 'YOUR_OPENAI_API_KEY' with your actual OpenAI API key.

  • Email and Attachment: Update sender, to, subject, message_text, and cv_file with appropriate values.

This script updates the CV text every three emails and sends it as an attachment using the Gmail API. You can run the script and monitor the email count to ensure the CV gets updated as intended.


To execute the provided Python script in Visual Studio Code (VS Code) on Windows, follow these steps:

1. Install Visual Studio Code

2. Install Python

  • Download and install Python from the official Python website.

  • Ensure you check the option to add Python to your PATH during the installation process.

3. Install Required Extensions in VS Code

  • Open VS Code.

  • Go to the Extensions view by clicking the Extensions icon in the Activity Bar on the side of the window or by pressing Ctrl+Shift+X.

  • Search for and install the "Python" extension provided by Microsoft.

4. Install Required Python Packages

  • Open a terminal in VS Code by selecting View > Terminal or by pressing Ctrl+ (backtick).

  • Run the following command to install the required packages:

pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client openai

5. Set Up Your Project

  • Create a new folder for your project.

  • Inside this folder, create a new file named main.py and paste the provided code into this file.

6. Prepare Google API Credentials

  • Follow the steps to create a project and OAuth 2.0 credentials on the Google Cloud Console.

  • Download the credentials.json file and place it in your project folder.

7. Replace OpenAI API Key

  • Replace 'YOUR_OPENAI_API_KEY' with your actual OpenAI API key in the code.

8. Run the Script

  • In the terminal, navigate to your project folder if you haven't already:

cd path/to/your/project

  • Run the script using Python:

python main.py

Explanation of the Code

Imports

import os
import pickle
import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import openai

  • Import necessary libraries for handling files, email composition, Google authentication, and OpenAI API.

Set up OpenAI API key

openai.api_key = 'YOUR_OPENAI_API_KEY'

  • Configure the OpenAI API key.

Gmail API Scopes

SCOPES = ['https://www.googleapis.com/auth/gmail.send']

  • Define the scope of permissions for Gmail API.

Get Gmail Service

def get_gmail_service():
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
return service

  • Authenticate and authorize the application to use Gmail API. Save and reuse credentials.

Create Email Message with Attachment

def create_message_with_attachment(sender, to, subject, message_text, file):
message = MIMEMultipart()
message['to'] = to
message['from'] = sender
message['subject'] = subject

msg = MIMEText(message_text)
                message.attach(msg)
                
                with open(file, 'rb') as f:
                    mime_application = MIMEApplication(f.read(), _subtype="pdf")
                    mime_application.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))
                    message.attach(mime_application)
                
                raw = base64.urlsafe_b64encode(message.as_bytes())
                return {'raw': raw.decode()}
                
  • Create an email with an attachment, encode it, and prepare it for sending.

Send Email Message

def send_message(service, user_id, message):
try:
message = service.users().messages().send(userId=user_id, body=message).execute()
print('Message Id: %s' % message['id'])
return message
except Exception as error:
print('An error occurred: %s' % error)
return None

  • Send the email using the Gmail API service.

Update CV Text Using OpenAI

def update_cv_text(cv_text, iteration):
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"Update the following CV text to improve it:\n\n{cv_text}",
temperature=0.5,
max_tokens=500
)
return response.choices[0].text.strip()

  • Use OpenAI to generate an improved version of the CV text.

Main Function

def main():
service = get_gmail_service()
sender = '[email protected]'
to = '[email protected]'
subject = 'Updated CV'
message_text = 'Please find attached my updated CV.'

cv_file = 'cv.pdf'
                cv_text = "Your initial CV text here"
                email_count = 0
                
                while True:
                    if email_count % 3 == 0:
                        cv_text = update_cv_text(cv_text, email_count)
                        with open('cv.txt', 'w') as f:
                            f.write(cv_text)
                        # Convert the updated text to PDF (requires additional code/library)
                
                    message = create_message_with_attachment(sender, to, subject, message_text, cv_file)
                    send_message(service, 'me', message)
                    email_count += 1
                

if name == 'main':
main()

  • Main function to get Gmail service, create and send emails, and periodically update the CV text using OpenAI.

REFERENCES

Sure! Here are some references for various topics related to your blog post. Make sure to adapt them to fit the context and content of your blog.

General Python Programming

  • Python Software Foundation. (2024). Python 3.11 Documentation. Retrieved from https://docs.python.org/3/

  • Barry, P. (2023). Head First Python: A Brain-Friendly Guide. O'Reilly Media.

Using Google APIs in Python

Email Handling in Python

OpenAI API

Automating Tasks with Python

  • Al Sweigart. (2019). Automate the Boring Stuff with Python: Practical Programming for Total Beginners. No Starch Press.

  • McKinney, W. (2022). Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython. O'Reilly Media.

Setting Up Development Environments

General Software Development Practices

  • Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.

  • Fowler, M. (2018). Refactoring: Improving the Design of Existing Code. Addison-Wesley.

Git and Version Control

  • Chacon, S., & Straub, B. (2014). Pro Git. Apress. Retrieved from https://git-scm.com/book/en/v2

  • Loeliger, J., & McCullough, M. (2012). Version Control with Git: Powerful Tools and Techniques for Collaborative Software Development. O'Reilly Media.

These references should provide a strong foundation for your blog post, covering essential topics related to Python programming, using Google APIs, handling emails, utilizing the OpenAI API, and setting up your development environment.

Why do this in Python ?

email sending for 1


Imported from rifaterdemsahin.com · 2024