mcpField
E
extension-email

extension-email

github.com/caffeinelabsDevelopment228.6k installsUpdated 1w ago
Repository

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

  1. 01Send service and transactional emails
  2. 02Send an individual message to each recipient
  3. 03Return explicit success or error results

Use cases

  1. 01Send order confirmations
  2. 02Send one-off notifications

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/caffeinelabs/skills --skill extension-email

After installing, type/extension-emailin Claude Code to confirm it loaded.

Details

From the project README

Email — 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.

Comments

Markdown supported