Hi all ?! As an app developer, I’m excited to share how you can create simple yet powerful agents to automate your daily tasks.
? Like many of you, I receive an overwhelming number of emails every day. Despite my best efforts, achieving the elusive Inbox Zero remains a challenge. Sorting through emails like order confirmations and shipping updates is tedious and time-consuming.
But here’s the good news: automation can save the day!
? I’ve written a basic script leveraging AI to help automate email categorization—and you can, too.
In this article, I’ll share reusable code snippets to help you build your own automation agents tailored to your needs. ?
There are countless tools, including no-code platforms, that can handle entire processes for you. However, I prefer breaking tasks into modular code snippets. Why?
By taking an incremental approach, you can gradually replace manual steps with automated ones.
?? My go-to tool for prototyping scripts is Znote—a notebook with live coding and AI that helps me track and enhance my workflows. Give it a try, or use your favorite IDE!
When a new email arrives, we want to:
Download Ollama to run a local LLM. Once installed, download a model:
ollama pull mistral
Install the required Node.js libraries:
ollama pull mistral
Set up an OAuth connection to Gmail:
npm install -S @google-cloud/local-auth googleapis openai
Use this function to create labels and retrieve their IDs:
// google-api.js const fs = require("fs"); const path = require("path"); const { authenticate } = require("@google-cloud/local-auth"); const { google } = require("googleapis"); class GoogleAPI { constructor(credentialFilename) { this.TOKEN_PATH = path.join(__dirname, `token-${credentialFilename}`); this.CREDENTIALS_PATH = path.join(__dirname, credentialFilename); this.SCOPES = [ "https://mail.google.com/", "https://www.googleapis.com/auth/gmail.modify", ]; } async authorize() { const loadSavedCredentials = () => { try { const content = fs.readFileSync(this.TOKEN_PATH); return google.auth.fromJSON(JSON.parse(content)); } catch { return null; } }; const saveCredentials = (client) => { const keys = JSON.parse(fs.readFileSync(this.CREDENTIALS_PATH)); fs.writeFileSync( this.TOKEN_PATH, JSON.stringify({ type: "authorized_user", client_id: keys.installed.client_id, client_secret: keys.installed.client_secret, refresh_token: client.credentials.refresh_token, }) ); }; let client = await loadSavedCredentials(); if (!client) { client = await authenticate({ scopes: this.SCOPES, keyfilePath: this.CREDENTIALS_PATH, }); if (client.credentials) saveCredentials(client); } return client; } } module.exports = GoogleAPI;
Extract details from message api:
async function createAndGetLabels(labelsToCreate) { const google = await getGoogleClient(); const gmail = google.gmail({ version: "v1" }); const existingLabels = (await gmail.users.labels.list({ userId: "me" })).data.labels || []; const labelsMap = new Map(); for (const label of labelsToCreate) { const existing = existingLabels.find((l) => l.name === label); if (existing) { labelsMap.set(label, existing.id); } else { const res = await gmail.users.labels.create({ userId: "me", requestBody: { name: label }, }); labelsMap.set(label, res.data.id); } } return labelsMap; }
Extract meaningful details from emails:
async function readEmails(gmail, maxResults = 10) { const res = await gmail.users.messages.list({ userId: "me", labelIds: ["INBOX"], maxResults }); return Promise.all( res.data.messages.map(async ({ id }) => { const email = await gmail.users.messages.get({ userId: "me", id }); return email.data; }) ); }
Integrate Ollama or OpenAI to classify emails:
function extractMailInfos(mail) { // Define the headers to extract const relevantHeaders = ["Date", "Subject"]; // Extract and structure the relevant headers const headers = mail.payload.headers .filter(header => relevantHeaders.includes(header.name)) .reduce((accumulator, header) => { accumulator[header.name] = header.value; return accumulator; }, {}); // Add the unique mail ID directly to the headers object headers.id = mail.id; return headers; }
Here’s how everything works together:
async function classifyEmail(prompt) { const { OpenAI } = require("openai"); const openai = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "not-needed" }); const response = await openai.chat.completions.create({ model: "mistral", temperature: 0.3, messages: [{ role: "user", content: prompt }], }); return response.choices[0].message.content.trim(); }
? That’s it! Your inbox is now smarter and more organized.
But why stop here? Explore more advanced examples for reading email content, sending drafts, and building everything you need for fully automated responses.
For more automation ideas and reusable scripts, check out Znote.
Let’s turn your daily tasks into something fun and efficient! ?
The above is the detailed content of Build an AI-Powered Email Agent with Reusable Code. For more information, please follow other related articles on the PHP Chinese website!