Mailjet
Mailjet (part of Sinch) is a European email platform for both transactional and marketing email. Its data is hosted in the EU by default and it has a usable free plan, which makes it popular with European small businesses.
Choose Mailjet when you want an EU-based provider with a free tier, or you already send newsletters through Mailjet and want transactional mail from the same account. For purely transactional sending with the strongest deliverability focus, see Postmark; for EU hosting with a developer API, Mailgun EU. Comparison: services overview.
Prerequisites
Section titled “Prerequisites”- A Mailjet account (new accounts may go through a short activation review).
- A validated sender: add your domain in Account settings → Senders & Domains → Add domain and authenticate it (SPF + DKIM), or at least validate the single From address.
- An API key pair (API key + secret key). Mailjet keys are not scoped by permission, so the least-privilege option is a dedicated sub-account key: Account settings → REST API → API Key Management → Create a sub-account API key. A sub-account has its own senders, stats and quota, and can be revoked without touching your main key.
Connect in Frontmail
Section titled “Connect in Frontmail”- Open Email services → Add service → Mailjet.
- Fill in the fields:
| Field | Where to find it | Example |
|---|---|---|
| API key | Account settings → REST API → API Key Management | a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 |
| Secret key | Same page (click to reveal; can be regenerated) | f6e5d4c3b2a1… |
| Webhook username | Optional – username you put into the webhook URL (see below) | frontmail |
| Webhook password | Optional – matching password | long-random-string |
| Max emails per second | Optional; default 10/s | 5 |
- Click Verify & save – Frontmail calls the Mailjet API with the key pair.
- The service is saved once the check passes. Both keys are encrypted with AWS KMS envelope encryption.
DNS: SPF, DKIM and DMARC
Section titled “DNS: SPF, DKIM and DMARC”Mailjet shows the values under Senders & Domains → your domain → Authentication settings:
; SPF – merge with your existing SPF record (only one per domain!)example.com. TXT "v=spf1 include:spf.mailjet.com ~all"
; DKIMmailjet._domainkey.example.com. TXT "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD…"
; Domain ownership (only when Mailjet asks for it)mailjet._a1b2c3d4.example.com. TXT "a1b2c3d4e5f6…"
; DMARC_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"- If you already have
v=spf1 include:_spf.google.com ~all, change it tov=spf1 include:_spf.google.com include:spf.mailjet.com ~all– don’t add a second SPF record. - Mailjet’s envelope sender is its own bounce domain, so DMARC alignment relies on DKIM – make sure DKIM shows OK.
- Start DMARC with
p=none, tighten later.
Regions
Section titled “Regions”Frontmail talks to api.mailjet.com. Mailjet stores data in the EU by default. Mailjet also operates a separate US infrastructure (api.us.mailjet.com) for accounts created there – Frontmail currently supports only the default endpoint, so use an account created on the standard (EU) platform.
Sandbox & limits
Section titled “Sandbox & limits”- Free plan: 200 emails per day, 6,000 per month.
- Paid plans lift the daily cap and bill per month.
- New accounts can be put under review by Mailjet’s compliance team if bounce or complaint rates are high; sending is blocked until the review ends.
- Mailjet’s
SandboxModeAPI flag validates messages without sending them; Frontmail doesn’t use it.
Webhooks (delivery tracking)
Section titled “Webhooks (delivery tracking)”Mailjet calls these Event notifications (webhooks).
-
Copy the webhook URL from the service page in Frontmail (copy button):
https://api.frontmail.dev/webhooks/providers/mailjet/<token> -
Recommended: protect it with Basic auth. Mailjet has no separate auth field, so put the credentials into the URL and enter the same values in the Frontmail fields Webhook username / Webhook password:
https://frontmail:long-random-string@api.frontmail.dev/webhooks/providers/mailjet/<token> -
In Mailjet open Account settings → Event notifications (webhooks) and paste the URL for these events:
| Mailjet event | Frontmail event |
|---|---|
| Sent (accepted by the recipient’s server) | delivered |
Bounce – hard_bounce: true |
bounced – added to the suppression list |
| Bounce – soft, Blocked | recorded as a soft bounce |
| Spam | complained – added to the suppression list |
| Open | opened |
| Click | clicked |
- Mailjet sends a test call when you save; the event should appear in the service’s event log.
Signature verification: Mailjet does not sign event payloads. The secret token in the URL identifies the service, and if you set a webhook password, Frontmail rejects every request whose Basic auth does not match.
Frontmail sets Mailjet’s CustomID to the Frontmail message ID so events match the right message.
Common errors
Section titled “Common errors”- auth – the service is broken (wrong API key/secret, 401/403, sender or domain not validated, account blocked). The service is marked
unhealthy; the owner gets an email and a dashboard banner. A fallback service on the template takes over; without one the credit is refunded and the message waits in the hold queue asheld_service_error, and is sent automatically after you fix the service (re-checked on save and by the daily health check). - permanent – this message can’t be sent (invalid recipient, 400 validation). Fallback service if configured, otherwise
failedand the credit refunded. - transient – 5xx, 429, timeouts. Retried with exponential backoff; after the last attempt
failedand refunded.
| Mailjet response | Class | What to do |
|---|---|---|
401 – API key authentication/authorization failure |
auth | Check the API key and secret key pair; regenerate if needed. |
403 – Forbidden / account blocked or under review |
auth | Check the Mailjet dashboard and contact Mailjet support. |
400 – “The sender … is not validated / not authorized” |
auth | Validate the From address or domain in Senders & Domains (in the right sub-account). |
400 mj-0013 – “… is an invalid email address” |
permanent | See invalid recipient. |
400 – other validation errors (subject too long, attachment too big) |
permanent | Fix the template; see HTML templates. |
429 – Too many requests |
transient | Rate or daily limit hit; Frontmail retries. Lower Max emails per second. |
500 / 503, timeout |
transient | Mailjet outage – Frontmail retries. |
Checklist
Section titled “Checklist”- Domain added and authenticated in Mailjet (SPF include +
mailjet._domainkey) - One merged SPF record; DMARC
p=none - Dedicated sub-account API key pair
- Test connection passes
- Event notification URL with Basic auth credentials, same values in Frontmail
- Events enabled: sent, bounce, blocked, spam (+ open, click)
- Daily volume within your plan’s limit