← Back to Skills
Productivity

mailchannels

ttulttul By ttulttul 👁 8 views ▲ 0 votes

Send email via MailChannels Email API and ingest signed

GitHub
---
name: mailchannels-email-api
description: Send email via MailChannels Email API and ingest signed delivery-event webhooks into Clawdbot (Moltbot).
homepage: https://docs.mailchannels.net/email-api/
metadata: {"moltbot":{"emoji":"📨","requires":{"env":["MAILCHANNELS_API_KEY","MAILCHANNELS_ACCOUNT_ID"],"bins":["curl"]},"primaryEnv":"MAILCHANNELS_API_KEY"}}
---

# MailChannels Email API (Send + Delivery Events)

## Environment

Required:
- `MAILCHANNELS_API_KEY` (send in `X-Api-Key`)
- `MAILCHANNELS_ACCOUNT_ID` (aka `customer_handle`)

Optional:
- `MAILCHANNELS_BASE_URL` (default: `https://api.mailchannels.net/tx/v1`), `MAILCHANNELS_WEBHOOK_ENDPOINT_URL`

## Domain Lockdown (DNS)

Create a TXT record for each sender domain:
- Host: `_mailchannels.<your-domain>`
- Value: `v=mc1; auid=<YOUR_ACCOUNT_ID>`

## API Quick Reference
Base URL: `${MAILCHANNELS_BASE_URL:-https://api.mailchannels.net/tx/v1}`
- Send: `POST /send`
- Send async: `POST /send-async`
- Webhook: `POST /webhook?endpoint=<url>`, `GET /webhook`, `DELETE /webhook`, `POST /webhook/validate`
- Public key: `GET /webhook/public-key?id=<keyid>`

## Sending Email
Minimum payload fields: `personalizations`, `from`, `subject`, `content`.
Use `/send` for normal traffic and `/send-async` for queued/low-latency; both produce webhooks.
Persist MailChannels correlation IDs (e.g., `request_id`).

## Delivery Events (Webhooks)
MailChannels POSTs a JSON array. Common fields: `email`, `customer_handle`, `timestamp`, `event`, `request_id`.
Bounce fields often include: `recipients`, `status`, `reason`, `smtp_id`.

## Moltbot Hooks Routing
1) Enable hooks in `~/.clawdbot/moltbot.json`.
2) Map `/hooks/<path>` to an agent action via `hooks.mappings` and optional transform.
3) Enroll the public endpoint in MailChannels `/webhook?endpoint=...`.

## Webhook Signature Verification
Headers: `Content-Digest`, `Signature-Input`, `Signature`.
Steps:
- Parse `Signature-Input` (name, `created`, `alg`, `keyid`).
- Reject stale `created` values.
- Fetch public key by `keyid`.
- Recreate the RFC 9421 signature base.
- Verify ed25519 signature (avoid hand-rolling).
Also verify JSON body is an array and every event has `customer_handle == MAILCHANNELS_ACCOUNT_ID`.

## Correlation + State Updates
Store your internal message ID + MailChannels IDs (e.g., `request_id`, `smtp_id`).
Update delivery state from events: `processed`, `delivered`, `soft-bounced`, `hard-bounced`, `dropped`.
Operational tips: respond 2xx quickly, process async, store raw events, dedupe retries.
productivity

Comments

Sign in to leave a comment

Loading comments...