About extension-email
A Caffeine AI skill for sending service and transactional emails from a backend canister. It sends each recipient an individual message and returns success or error results without throwing on failure.
Key features
- 01Send service and transactional emails
- 02Send an individual message to each recipient
- 03Return explicit success or error results
Use cases
- 01Send order confirmations
- 02Send one-off notifications
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ caffeinelabs/ skills --skill extension-emailAfter installing, type/extension-emailin Claude Code to confirm it loaded.
Details
From the project READMEEmail — Service/Transactional
Service/transactional email extension for Caffeine AI.
Overview
This skill adds support for sending service and transactional emails from the backend canister. Use sendServiceEmail for order confirmations, notifications, and similar one-off emails.
Backend
This component is for sending service/transactional emails.
There is the prefabricated module mo:caffeineai-email/emailClient.mo which cannot be modified.
- Use the sendServiceEmail function.
- Each recipient is sent an individual email
- It returns a SendResult which is #ok if the email is sent successfully otherwise #err(error) with the error text.
- A failed send never throws. Every failure, a gateway error included, comes back as
#err.
module {
public type SendResult = {
#ok;
#err : Text;
};
public func sendServiceEmail(
fromUsername : Text,
recipients : [Text],
subject : Text,
htmlBody : Text,
) : async SendResult;
};
Usage for sendServiceEmail:
import Runtime "mo:core/Runtime";
import EmailClient "mo:caffeineai-email/emailClient";
actor {
public func sendOrderConfirmationEmail(recipientEmailAddress : Text, username : Text, orderReference : Text) : async () {
let result = await EmailClient.sendServiceEmail(
"no-reply",
[recipientEmailAddress],
"Order " # orderReference # " confirmed",
"Hello " # username # ",\nYour order " # orderReference # " has been confirmed. Your items will ship tomorrow.",
);
switch (result) {
case (#ok) {};
case (#err(error)) {
Runtime.trap("Failed to send order confirmation email: " # error);
};
};
};
};
Upgrading from the previous version
An app built with caffeineai-email 0.3.x re-pins with mops add [email protected]. sendServiceEmail and sendRawEmail keep their signatures. Every send now goes through the mail gateway with the settings the platform injects on every deploy (INTEGRATIONS_GATEWAY_URL / INTEGRATIONS_GATEWAY_API_KEY); the transport canister and INTEGRATIONS_CANISTER_ID are no longer used, and a send without those settings returns #err instead of falling back. Apps that use verification, marketing or calendar email follow the upgrade sections of those skills.
An app built with caffeineai-email 0.2.x re-pins with mops add [email protected]. sendServiceEmail and sendRawEmail keep their signatures; every send now carries an idempotency key, so a retried outcall is sent and charged once. Apps that use verification or marketing email follow the upgrade sections of those skills.