De AI agent leest je email en op basis van de inhoud wordt de email verplaatst naar een 'DevOps', 'Important' of 'Info' folder.
Ik kwam laatst een vraag tegen om een e-mail agent de maken die e-mails gecategoriseerd met n8n.
Natuurlijk was ik benieuwd hoe ik dit kon maken met Xelflow.
Stappenplan
Na wat nadenken kwam ik tot de volgende process:
Ophalen e-mail uit mailbox
Als e-mail bestaat deze dan naar een AI agent sturen
Waarbij de AI agent 2 opdrachten meekrijgt:
Categoriseren van de e-mail en aanroepen flow voor het verplaatsen van de e-mail naar de juiste folder
Aanroepen van flow voor het opslaan van de redenering van de AI agent
Xelflow heeft geen build-in steps om e-mail te lezen en naar een folder te verplaatsen. Voor de meeste functionaliteiten die niet in Xelflow zitten is het maken van een Azure function een goede optie.
We hebben dus voor de goede werking van de AI agent de volgende componenten nodig:
Een Azure function om e-mail te lezen en naar een folder te verplaatsen
Een Azure function om een e-mail naar een folder te verplaatsen
In Xelflow een flow om een bovenstaande e-mail lees Azure function te gebruiken en naar een AI agent te sturen
In Xelflow een flow om een bovenstaande e-mail verplaats Azure function te gebruiken
In Xelflow een flow om de redenering van de AI agent te documenteren
De Azure function voor het lezen en verplaatsen van e-mail
Het maken van een Azure function voor het lezen en verplaatsen van e-mail is relatief makkelijk. Ik heb ImapFlow in een nodejs Azure function gebruikt. Voor het lezen van de e-mail haal ik de envelop en de tekst of html inhoud op en geef deze als json terug. Standaard wordt de laatste e-mail in de Inbox teruggeven.
Voor het verplaatsen van de e-mail heb ik een seq nummer en de folder naam nodig en geef ik alleen succes message of fout message terug. Beide functies hebben natuurlijk de authenticatie gegevens van de mail box nodig.
import { ImapFlow } from 'imapflow';
const readMail = async function (context, req) {
context.log('ReadMail processed a request.');
BigInt.prototype['toJSON'] = function () {
return this.toString()
}
const body = req.body;
const client = new ImapFlow({
host: body.host,
port: body.port,
secure: true,
auth: {
user: body.username,
pass: body.password
}
});
try {
await client.connect();
console.log('Connected successfully');
let lock = await client.getMailboxLock('INBOX');
try {
let message = await client.fetchOne(body.seq ?? '*', {flags: true, internalDate: true, size: true, envelope: true, bodyStructure: true});
if (!message) {
console.log('No message found for the given sequence number or last message');
context.res = {
status: 204,
body: {
message: 'No message found for the given sequence number or last message'
}
};
return;
}
let textPart = findPartByType(message.bodyStructure, 'text/plain');
if (!textPart) {
textPart = findPartByType(message.bodyStructure, 'text/html');
}
let { meta, content } = await client.download(message.uid, textPart, { uid: true });
let chunks = [];
for await (let chunk of content) {
chunks.push(chunk);
}
message.text = Buffer.concat(chunks).toString('utf-8');
context.res = {
status: 200,
body: {
message
}
};
} finally {
lock.release();
}
} catch (error) {
context.log.error('Error reading mail:', error);
context.res = {
status: 500,
body: {
message: 'Error reading mail',
error: error.message
}
};
} finally {
if (client && client.isConnected) {
await client.logout();
console.log('Disconnected from IMAP server');
}
}
};
function findPartByType(node, contentType) {
if (node.type === contentType) {
return node.part || '1';
}
if (node.childNodes) {
for (let child of node.childNodes) {
let found = findPartByType(child, contentType);
if (found) return found;
}
}
return null;
}
export { readMail };
De Xelflow flow voor het aanroepen van de Azure function en aanroepen van de AI agent
Het event voor het aanroepen van de Xelflow flow wordt gescheduled voor elke 10 min en gebruikt admin user rechten. De Xelfow flow heeft de volgende stappen:
Aanroepen van de Azure function
Aanroepen van de AI agent met de output van de Azure function
De AI agent heeft toegang tot 2 andere functies: een functie om de e-mail te verplaatsen en een functie de redenatie op te slaan in de database. De system prompt voor de AI agent is als volgt:
"You are a helpful assistant, helping to categorize emails. In the chat you will receive an json representation of an email. Based on the information in the email make a choice where to move the email. When the email is a DevOps email move the email to the 'DevOps' mailbox. When the email has an action in it, like payment of a invoice or a question for a reply move or something else that would make the email important. Move the email to the 'Important' mailbox. All other emails move to the 'Info' mailbox. You can move an email with the MoveEmail event. After moving the email call the SaveEmailAction with the reason why the email is moved to a specific mailbox. Use ListEvents to get the details of the events."
De events en de system prompt zijn onderdeel van the step authenticatie. Met de ListEvents tool kan de AI de details van de beschikbare events ophalen. Met CallEvent kan de AI dan een event aanroepen. Voor deze AI agent gebruik ik gpt-4.1-mini via Azure Foundry
De Xelflow flow voor het aanroepen van de Azure function voor verplaatsen van de e-mail
Deze flow is simpel en bestaat uit 2 stappen:
Aanroepen van de Azure function met de e-mail en folder als parameter uit het aanroepende event
Ja, het is mogelijk om een e-mail agent te maken met Xelflow. Een extra Azure functie is nodig, maar verder zijn alle stappen makkelijk en overzichtelijk.
Xelflow
Xelflow is een op workflows gebaseerd platform waarmee je snel web applicaties en AI agents kan maken.