Why Automate Your Tasks?
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. ?
The Beauty of Automation
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?
- Flexibility: Modular code can easily adapt to changing requirements.
- Reusability: Write once, use forever.
- Maintainability: Small, independent chunks of code are easier to debug and improve.
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!
Let’s Build an Email Automation Agent
Goals
When a new email arrives, we want to:
- Read the email and extract relevant information.
- Use an LLM to determine its category from a predefined list.
- Create Gmail labels (if they don’t already exist).
- Update the email’s labels to reflect the assigned category.
Getting Started
Prerequisites
Step 1: Enable Gmail API
- Go to the Google Cloud Console and enable the Gmail API.
- Set up OAuth credentials for a desktop application. Follow these steps to download your google-credentials.json file and place it in your project directory.
Step 2: Install Ollama
Download Ollama to run a local LLM. Once installed, download a model:
ollama pull mistral
Step 3: Install Dependencies
Install the required Node.js libraries:
ollama pull mistral
Writing the Code
1. Authenticate with Google API
Set up an OAuth connection to Gmail:
npm install -S @google-cloud/local-auth googleapis openai
2. Create Gmail Labels
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;
3. Read Emails
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; }
4. Decrypt relevants infos
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; }) ); }
5. Use an LLM for Categorization
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; }
Putting It All Together
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.
Go further
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!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Java and JavaScript are different programming languages, each suitable for different application scenarios. Java is used for large enterprise and mobile application development, while JavaScript is mainly used for web page development.

JavaScriptcommentsareessentialformaintaining,reading,andguidingcodeexecution.1)Single-linecommentsareusedforquickexplanations.2)Multi-linecommentsexplaincomplexlogicorprovidedetaileddocumentation.3)Inlinecommentsclarifyspecificpartsofcode.Bestpractic

The following points should be noted when processing dates and time in JavaScript: 1. There are many ways to create Date objects. It is recommended to use ISO format strings to ensure compatibility; 2. Get and set time information can be obtained and set methods, and note that the month starts from 0; 3. Manually formatting dates requires strings, and third-party libraries can also be used; 4. It is recommended to use libraries that support time zones, such as Luxon. Mastering these key points can effectively avoid common mistakes.

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScriptispreferredforwebdevelopment,whileJavaisbetterforlarge-scalebackendsystemsandAndroidapps.1)JavaScriptexcelsincreatinginteractivewebexperienceswithitsdynamicnatureandDOMmanipulation.2)Javaoffersstrongtypingandobject-orientedfeatures,idealfor

Event capture and bubble are two stages of event propagation in DOM. Capture is from the top layer to the target element, and bubble is from the target element to the top layer. 1. Event capture is implemented by setting the useCapture parameter of addEventListener to true; 2. Event bubble is the default behavior, useCapture is set to false or omitted; 3. Event propagation can be used to prevent event propagation; 4. Event bubbling supports event delegation to improve dynamic content processing efficiency; 5. Capture can be used to intercept events in advance, such as logging or error processing. Understanding these two phases helps to accurately control the timing and how JavaScript responds to user operations.

JavaScripthassevenfundamentaldatatypes:number,string,boolean,undefined,null,object,andsymbol.1)Numbersuseadouble-precisionformat,usefulforwidevaluerangesbutbecautiouswithfloating-pointarithmetic.2)Stringsareimmutable,useefficientconcatenationmethodsf

If JavaScript applications load slowly and have poor performance, the problem is that the payload is too large. Solutions include: 1. Use code splitting (CodeSplitting), split the large bundle into multiple small files through React.lazy() or build tools, and load it as needed to reduce the first download; 2. Remove unused code (TreeShaking), use the ES6 module mechanism to clear "dead code" to ensure that the introduced libraries support this feature; 3. Compress and merge resource files, enable Gzip/Brotli and Terser to compress JS, reasonably merge files and optimize static resources; 4. Replace heavy-duty dependencies and choose lightweight libraries such as day.js and fetch
