Skip to main content
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 by fileId. 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. Async action.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’s with: 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