Install
openclaw skills install @atom00blue/drin-send-emailSend a transactional email through Drin reliably. Use when the user or agent needs to send an email (notification, receipt, OTP, alert, password reset, reply) via the Drin email API — covers picking a verified sending domain, composing the message, sending it, and handling suppressed/rate-limited errors. Works through the @drin00/mcp tools, the drin CLI, the drin SDK, or the raw /v1 REST API.
openclaw skills install @atom00blue/drin-send-emailDrin sends transactional email over an HTTP API (and SMTP). You authenticate
with a single API key (Authorization: Bearer <key>). Use this skill any time
you need to actually deliver an email.
from domainYou can only send from a verified domain. Never guess the domain.
list_domains with status: "verified".drin domains list --status verified.GET /v1/domains?status=verified.Use any verified domain for the from local part, e.g. notifications@<domain>.
If there are no verified domains, stop and tell the user to verify one (see the
drin-email-best-practices skill) — or use the shared onboarding domain, which
in test mode can only deliver to the account owner's own address.
Required: from, to, and content (html and/or text, or a templateId
data). Always include a text part alongside html for deliverability and
accessibility.Addresses are objects { "email": "...", "name": "..." }. The MCP tools and CLI
also accept the string form "Name <email>".
send_email:
{
"from": "Acme <notifications@acme.com>",
"to": "user@example.com",
"subject": "Your receipt",
"html": "<p>Thanks for your order.</p>",
"text": "Thanks for your order.",
"idempotencyKey": "order-1042-receipt"
}
drin send --from "Acme <notifications@acme.com>" --to user@example.com --subject "Your receipt" --text "Thanks"POST /v1/emails
Authorization: Bearer $DRIN_API_KEY
Content-Type: application/json
{ "from": {"email":"notifications@acme.com"}, "to": [{"email":"user@example.com"}],
"subject": "Your receipt", "html": "<p>…</p>", "text": "…" }
A success returns { "id": "...", "status": "queued" } (or "scheduled"). The
send is asynchronous; track delivery with get_email/GET /v1/emails/:id or
webhooks.
idempotencyKey (or Idempotency-Key header) on
retryable sends (receipts, OTPs). It is honored for 24h per sender, so a retry
never double-sends.X-Drin-Sender header / sender field / DRIN_SENDER env / --sender).scheduledAt to an ISO-8601 time to send later.templateId + data instead of inline html/text to
render a saved template server-side.send_batch / POST /v1/emails/batch.reply_email /
POST /v1/emails/:id/reply so threading headers are set automatically.422 validation_error — fix the payload (often from not on a verified
domain, or missing content). The param field names the offender.409 suppressed — the recipient is on the suppression list (prior hard bounce
or complaint). Do not work around it; report it. Check with
list_suppressions.429 rate_limited — back off and retry after Retry-After seconds.401 authentication_error — the key is wrong/revoked, or an account-wide key
was used without naming a sender.Report the real outcome. If a send was queued, say so with the id; if it failed, quote the error rather than claiming success.