action.email, Send an email with optional attachments via a selected email server. At most 10 recipients combined across to, cc, and bcc.
Use Send Email when a workflow should deliver a result to people: a filled
spreadsheet, an extracted summary, or a short status note. Recipients, subject,
and body are authored on the step. The From address and transport come from the
email server you select — there is no workspace default and no fallback.
Choose a server
with.server is required and must be a stable ems_… id. Create one or more
servers in Settings → Email servers (cloud and on-prem are the same), or
through the email servers guide via API, CLI, or SDK.
Each organization can keep several Resend and SMTP servers; pick the one this
step should use. The step does not send through platform invite or inbound
Resend configuration.
Publishing fails if the id is missing, deleted, or disabled. At run time a
deleted server fails the step as not found, and a disabled server fails as
disabled — the run is not redirected to another server.
Message limits
The body is plain text (at most 50KiB). Attachments must be files created earlier in the same run, referenced byfileId. Files from other runs are
rejected. You can attach at most 10 files totaling 12MiB. to, cc, and bcc
accept at most 10 recipients combined. A recipient field can be a single
address, a comma-separated list of addresses, a template that resolves to one
or many addresses, or a nonempty array. Template expressions count as one
recipient at authoring time.
Pair it with JSON to XLSX when the email
should include a workbook:
filename on an attachment is optional. Omit it to keep the stored file name.
You can also pass a bare file id string instead of an object.
Delivery, evals, and cancellation
Sending email is a side effect, so this step is not durably retried. See Workflows → Retries. Evaluation runs skip delivery, so evaluating a workflow cannot send mail to real recipients. Asyncaction.invoke-workflow children inherit that
suppression; the child run keeps the target workflow’s trigger type. A skipped
step still returns the email output object, with messageId and provider set
to null and serverId set to the selected server, so later steps and eval
comparisons can read the shape without treating a message as sent.
Each send is budgeted at 30 seconds. Cancelling the run aborts an in-flight
send.
SMTP does not provide provider-side idempotency. If a worker stops after the
relay accepts a message but before the run records success, delivery status is
unknown and resuming the run may send a duplicate. Resend deduplicates the same
step attempt with a stable idempotency key.
Configuration
Configuration goes inside the step’swith: block.
string
required
Outbound email server id (
ems_…)string | array<string>
required
Primary recipient(s). String, comma-separated list, or nonempty string array. Combined with cc and bcc, at most 10 recipients.
string | array<string>
Carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and bcc, at most 10 recipients.
string | array<string>
Blind carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and cc, at most 10 recipients.
string
Reply-To address (supports template expressions)
string
required
Email subject
string
required
Plain-text email body (max 50KiB)
array<string | object>
Optional same-run attachments as { fileId, filename? } or a bare fileId string (12MiB combined)
Output
Email server that sent (or would have sent) the message
Provider message id. Null when delivery was skipped (evaluation runs).
Email provider that sent the message. Null when delivery was skipped.
Normalized To recipients
Normalized Cc recipients
Normalized Bcc recipients
Number of attachments sent
Total attachment size in bytes