SMTP
Use Make Sender from any SMTP client or library instead of the REST API.
Overview
Messages sent over SMTP are queued and DKIM-signed exactly like REST API submissions. The size limit is 25 MB.
HostPortEncryptionAuthentication- SMTP credentials: Create them in your account settings. They belong to the account and work for all its verified domains. Create separate ones for each application or environment.
- A verified domain: Verify the domain of the sender address you want to use.
Sending via SMTP
# Install brew install swaks # Send email swaks --auth --tls \ --server smtp.makesender.no:2525 \ --au your_username \ --ap your_password \ --to recipient@example.com \ --from sender@example.com \ --h-Subject: "Hello from SMTP" \ --body 'This is a test message'
curl -v --ssl-reqd smtp://smtp.makesender.no:2525 \ --mail-from "sender@example.com" \ --mail-rcpt "recipient@example.com" \ --user "your_username:your_password" \ -T /path/to/message.txt
Job ID
When a message is accepted, the reply to DATA includes the ID it was queued under. The same ID is set as the X-Job-ID header on the delivered e-mail and as job-id in webhook events, so you can match them to your own records. Most libraries expose this final reply: Net::SMTP#send_message returns it in Ruby, and Nodemailer has it as info.response.
250 2.0.0 Ok: queued as 3714
Custom headers
Pass extra settings in X-Make-* headers. Make Sender reads them and removes them before the message is relayed.
X-Make-Template-NameX-Make-TrackX-Make-Track-OpensX-Make-Track-ClicksX-Make-VariablesX-Make-Template-VariablesX-Make-Recipient-VariablesX-Make-Recipient-Variables: {"alice@example.com": {"name": "Alice"}, "bob@example.com": {"name": "Bob"}}Message-ID and header passthrough
Your Message-ID is kept as it is, so threading and deduplication keep working. If it is missing, one is generated (<…@makesender.no>). All recipients of a submission share it, and it is included as message-id in webhook events.
The message is rebuilt before it is relayed, so not every header is kept:
- Kept: From, To, Cc, Subject, your own
X-*headers,In-Reply-To, References, List-* (includingList-Unsubscribe-Postfor RFC 8058 one-click unsubscribe), Precedence and Auto-Submitted. - Rewritten: From keeps its display name and local part. With "rewrite From to top domain" turned on, only the domain part changes. The envelope sender is only used when From is missing or not on the authenticated domain.
- Generated:
Message-IDif missing, Date,MIME-Version, Content-*, Received,Return-PathandDKIM-Signature. Bcc recipients come from the envelope and are never written to a header.
Rate limits and errors
Limits apply to connections per IP, failed logins per IP per hour, and message size (25 MB).
421501535552553Character encodings
Send UTF-8. The server advertises 8BITMIME and SMTPUTF8, but addresses must be ASCII. Internationalised mailboxes (EAI) are not relayed. A non-ASCII address is refused with 553 5.6.7, or with 501 when it appears in the To, Cc or From header.
Header text is more forgiving. Display names and Subject should be UTF-8 or RFC 2047 encoded, and raw ISO-8859-1 or Windows-1252 bytes are converted rather than refused. Bodies are converted from the charset in Content-Type, and an 8-bit text part without a declared charset must be UTF-8.
Troubleshooting and security
- Connection refused: Allow outbound connections to port 2525 and check the host name.
- Authentication failures: Check that the credential is active and that the username matches the SMTP credentials page.
- TLS errors: Use STARTTLS on port 2525, not SMTPS on 465. Your client must support TLS 1.2.
- Keep credentials safe: Never commit them to version control. Use environment variables or a secret store, and rotate them regularly.
Limitations
- SMTP does not cover everything the REST API can do.
- Batch operations are more limited than in the REST API.
- Delivery status in real time requires webhooks.