Send email with n8n
An HTTP Request node, and the whole API is available to a workflow.
You need a verified sending domain and an API key from Settings › API Keys. If neither exists yet, the quickstart covers both in a couple of minutes.
Send
{
"method": "POST",
"url": "https://sending.dev/api/v1/emails",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({
from: 'Acme <[email protected]>',
to: $json.email,
subject: 'Welcome',
html: '<p>You are in.</p>',
idempotencyKey: 'welcome-' + $json.id
}) }}"
}A successful call answers 202 with the message id: accepted and queued, not yet delivered. Delivery, opens, bounces and complaints arrive later, on webhooks or in the dashboard.
What changes in n8n
Create a Header Auth credential with name Authorization and value Bearer sk_..., so the key lives in the credential store rather than inside the workflow JSON people export and share.
The thing that catches people
n8n re-runs a workflow from the failed node when you retry it. Build the idempotency key from a field of the item, never from a timestamp or a random value, or every retry is another email.
Next
- All the fields: cc and bcc, reply-to, attachments, templates, scheduling.
- Webhooks: delivery, bounce and complaint events, signed with HMAC.
- Domains: SPF, DKIM and MAIL FROM, and why sending is refused until they are in place.
- MCP: the same operations as tools, when the one writing the code is an agent.