First send via SMTP
You need
Section titled “You need”- A project with a connected domain and an approved sender address.
- An SMTP credential for that project: a username and a password shown once. SMTP credentials only send; they can’t call the API.
- The SMTP host name shown on the project’s SMTP page.
Settings
Section titled “Settings”| Setting | Value |
|---|---|
| Host | shown in your dashboard |
| Port | 587 with STARTTLS, or 465 with implicit TLS |
| Encryption | required, TLS 1.2 or newer; keep certificate verification on |
| Authentication | PLAIN or LOGIN, only after TLS |
| From | must exactly match your approved sender address |
Example with Nodemailer
Section titled “Example with Nodemailer”import nodemailer from 'nodemailer';
const transport = nodemailer.createTransport({ host: process.env.WENEED_SMTP_HOST, port: 587, secure: false, // STARTTLS is negotiated on 587; use 465 with secure: true for implicit TLS requireTLS: true, auth: { user: process.env.WENEED_SMTP_USER, pass: process.env.WENEED_SMTP_PASS },});
await transport.sendMail({ from: 'Your App <hello@yourdomain.com>', to: 'person@example.com', subject: 'Welcome', text: 'Thanks for signing up.', headers: { 'X-Email-Idempotency-Key': 'signup-7f3c2a91-welcome' },});A 250 reply means the message is stored and queued, not delivered.
Avoid duplicates
Section titled “Avoid duplicates”Ordinary mail clients retry on their own. If the connection drops after you sent the message but
before the 250 arrived, a retry can create a second message. Add the
X-Email-Idempotency-Key header (16 to 128 printable characters) so a retry of the same message is
recognised. See Retries and duplicates.
What SMTP doesn’t do
Section titled “What SMTP doesn’t do”One recipient per message, no attachments, and no sent folder or inbox. Full limits are in the SMTP reference.