Skip to main content

skrybe emails

Send email without building a campaign first.

CommandDescription
emails sendSend or schedule an email to addresses or lists
emails send-transactionalSend one email to one address immediately

emails send​

skrybe emails send --subject <subject> --from-name <name> --from-email <email> \
--reply-to <email> --html-text <html|file://path> \
(--to <email>... | --list <list-id>...) [options]

Sends an email to up to 250 addresses, or to lists, now or at a scheduled time. Behind the scenes the API creates a campaign; it appears in the dashboard with the subject as its title. Without --list, the addresses are added to a new list and the campaign is sent to that list.

FlagDescription
--subject <subject>Subject line, also used as the campaign title. Required
--from-name <name>The From name. Required
--from-email <email>The From address. Its domain must be allowed for the brand. Required
--reply-to <email>The Reply-To address. Required
--html-text <html>HTML body, or file:// and a path to it. Required
--plain-text <text>Plain text body, or file:// and a path to it
--to <email>Recipient. Repeatable, up to 250
--list <list-id>Send to this list instead. Repeatable
--recipient-variables <json>Per-recipient values as JSON, or file:// and a path to a JSON file
--query-string <query>Appended to links, e.g. Google Analytics tags
--track-opens <mode>0 off, 1 on, 2 anonymous
--track-clicks <mode>0 off, 1 on, 2 anonymous
--schedule <date-time>Schedule it, e.g. "June 15, 2027 6:05pm". Minutes in steps of 5
--timezone <tz>Timezone for --schedule, e.g. America/New_York. Defaults to the brand's timezone

The CLI requires at least one --to or --list, and refuses more than 250 --to addresses before sending anything. It does not ask for confirmation.

--recipient-variables is a JSON object keyed by email address. Each key becomes a value you can use in the body:

vars.json
{
"ada@example.com": { "first": "Ada" },
"grace@example.com": { "first": "Grace" }
}
skrybe emails send \
--subject 'Your invite' --from-name Acme --from-email hello@acme.test --reply-to hello@acme.test \
--html-text file://invite.html \
--to ada@example.com --to grace@example.com \
--recipient-variables file://vars.json

The CLI checks that the JSON parses and is an object before sending, and fails with a usage error naming the flag if not.

Output: the API's message and the new campaign's ID. Under --output json: {"message": "...", "campaign_id": "..."}.

note

The API docs for this endpoint say to is required even when list_ids is passed, and that list_ids takes numeric list IDs. The CLI accepts --list without --to. If a list-only send is refused, add a --to address.

API: api/emails/send.php

emails send-transactional​

skrybe emails send-transactional --to <email> --subject <subject> \
(--html-body <html|file://path> | --plain-body <text|file://path>) [options]

Sends one email to one address and delivers it immediately: nothing is queued or scheduled, and no list or campaign is created. Suited to one-time codes, password resets and alerts.

FlagDescription
--to <email>Recipient. Required
--subject <subject>Subject line. Required
--html-body <html>HTML body, or file:// and a path to it
--plain-body <text>Plain text body, or file:// and a path to it
--from-name <name>Override the brand's From name
--from-email <email>Override the brand's From address
--reply-to <email>Override the brand's Reply-To address

At least one of --html-body and --plain-body is required.

skrybe emails send-transactional \
--to ada@example.com --subject 'Your sign-in code' \
--from-email no-reply@acme.test \
--plain-body 'Your code is 481 516.'

Output: the API's message and the message ID. Under --output json: {"message": "Email sent successfully.", "message_id": "..."}.

note

The API docs for this endpoint say a request without from_email is refused, even though the CLI's help describes --from-email as an override. Pass --from-email with an address on one of the brand's allowed domains.

API: api/emails/send-transactional.php