E-mail versturen vanuit LangChain
Voeg Wesender toe als LangChain-tool zodat je agent e-mails kan versturen als onderdeel van een keten of graph.
Vereisten
- Wesender-account met geverifieerd verzenddomein
- API-sleutel (WESENDER_API_KEY)
- Node.js 18 of nieuwer
- LangChain 0.3 of nieuwer (npm: @langchain/core, @langchain/openai)
Stap 1: Installeer de benodigde packages
Installeer LangChain, de Wesender SDK en Zod voor schema-validatie.
npm install @langchain/core @langchain/openai @wesender/node zod Stap 2: Definieer de Wesender-tool
Gebruik de tool()-functie uit @langchain/core/tools om een gestructureerde tool te maken. Het Zod-schema beschrijft de parameters die de LLM kan invullen.
import { tool } from "@langchain/core/tools"
import { z } from "zod"
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
export const sendEmailTool = tool(
async ({ from, to, subject, html }) => {
await emailClient.emails.send({ from, to, subject, html })
return "E-mail verstuurd naar " + to
},
{
name: "send_email",
description: "Verstuur een e-mail via Wesender",
schema: z.object({
from: z.string().describe("Afzenderadres op je geverifieerde domein"),
to: z.string().describe("Ontvanger-e-mailadres"),
subject: z.string().describe("Onderwerpregel"),
html: z.string().describe("HTML-inhoud van het bericht"),
}),
}
) Stap 3: Koppel de tool aan een agent
Geef de tool mee aan een LangChain-agent. De agent beslist zelf wanneer hij de tool aanroept op basis van de conversatie.
import { createOpenAIFunctionsAgent, AgentExecutor } from "langchain/agents"
import { ChatOpenAI } from "@langchain/openai"
import { ChatPromptTemplate } from "@langchain/core/prompts"
import { sendEmailTool } from "./tools"
const llm = new ChatOpenAI({ model: "gpt-4o", temperature: 0 })
const prompt = ChatPromptTemplate.fromMessages([
["system", "Je bent een behulpzame assistent die taken uitvoert."],
["human", "{input}"],
["placeholder", "{agent_scratchpad}"],
])
const agent = await createOpenAIFunctionsAgent({ llm, tools: [sendEmailTool], prompt })
const executor = new AgentExecutor({ agent, tools: [sendEmailTool] })
const result = await executor.invoke({
input: "Stuur een samenvatting van de dagelijkse updates naar jan@jouwdomein.nl",
})
console.log(result.output) Volledig voorbeeld
Hier is de volledige implementatie in agent.ts:
import { tool } from "@langchain/core/tools"
import { createOpenAIFunctionsAgent, AgentExecutor } from "langchain/agents"
import { ChatOpenAI } from "@langchain/openai"
import { ChatPromptTemplate } from "@langchain/core/prompts"
import { z } from "zod"
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
// Wesender als gestructureerde LangChain-tool
const sendEmailTool = tool(
async ({ from, to, subject, html }) => {
try {
await emailClient.emails.send({ from, to, subject, html })
return "E-mail verstuurd naar " + to
} catch (err) {
return "Verzending mislukt: " + String(err)
}
},
{
name: "send_email",
description: "Verstuur een transactionele e-mail via Wesender",
schema: z.object({
from: z.string().describe("Afzenderadres op je geverifieerde domein"),
to: z.string().describe("Ontvanger-e-mailadres"),
subject: z.string().describe("Onderwerpregel"),
html: z.string().describe("HTML-inhoud van het bericht"),
}),
}
)
// Agent met de tool
const llm = new ChatOpenAI({ model: "gpt-4o", temperature: 0 })
const prompt = ChatPromptTemplate.fromMessages([
["system", "Je bent een behulpzame assistent. Gebruik send_email om e-mails te versturen."],
["human", "{input}"],
["placeholder", "{agent_scratchpad}"],
])
const agent = await createOpenAIFunctionsAgent({ llm, tools: [sendEmailTool], prompt })
const executor = new AgentExecutor({ agent, tools: [sendEmailTool], verbose: false })
const result = await executor.invoke({ input: process.argv[2] ?? "Stuur een testmail naar test@jouwdomein.nl" })
console.log(result.output) Bezorgstatussen via webhooks
LangChain kan bezorg-, bounce- en klachtsignalen ontvangen via webhooks. Configureer een webhook-endpoint in je LangChain-workflow dat POST-verzoeken van Wesender accepteert. Zie Webhooks instellen voor de volledige configuratiestappen en het payload-formaat.
Veelgestelde vragen
Werkt dit ook met LangGraph?
Ja. Je kunt sendEmailTool direct doorgeven als tool in een LangGraph-graph. Voeg hem toe aan de tools-lijst van een ToolNode en bind hem aan je LLM via llm.bindTools([sendEmailTool]).
Kan ik ook een Python-versie gebruiken?
Ja. Installeer langchain en wesender via pip. Maak een StructuredTool met from_function() en een Pydantic-model als args_schema. De Wesender Python SDK gebruikt wesender.Client(api_key=...).emails.send(...).
Hoe voorkom ik dat de agent twee keer dezelfde mail verstuurt?
LangChain biedt geen ingebouwde idempotentie. Voeg een controle toe in de tool-handler: sla een hash van (to, subject, tijdstip) op in een database en sla de verzending over als de hash al bestaat.