SMTP
Send through Email Bump from anything with an SMTP setting.
View as Markdown ↗Connection settings
SMTP is a first-class way to send with Email Bump, not a shim. If a tool has a host, port, username and password field, it can send through you — your own application, a framework's mailer, a CMS, a helpdesk, CI, monitoring and alerting, a CRM, or a desktop mail client.
Mail sent this way goes through the same checks and the same log as the API: it appears under Transactional with opens, clicks and bounces attached, counts against the same allowance, and obeys the same sending-domain rules. Nothing is second class about it.
Settings
Hostsmtp.emailbump.comrequiredThe same host for every workspace.
Port587requiredSTARTTLS. Use 2587 if your host blocks 587 (some cloud providers do), or 465 for implicit TLS.
UsernameemailbumprequiredFor an all-access key, put your project id here instead — it's in Settings → SMTP, and see below for when it's needed.
Passwordebk_…requiredAny Email Bump API key. Create one under API keys; keys are shown once.
TLS is required. The server does not offer AUTH until the connection is encrypted, so a misconfigured client cannot send your key in the clear.
The From address must use one of your verified sending domains — the same rule the API follows. Before you have verified one, the shared testing domain works so you can try things out; once you verify your own, the shared domain is no longer accepted, because its reputation is pooled across every workspace and mail from it delivers worse than mail from you. Messages may be up to 40 MB, attachments included.
Which project does it send from?
A project key is bound to one project, so there is nothing to choose: leave the username as emailbump. An all-access key is not bound to one, and is resolved in this order:
- If the owner belongs to a single project, that one — nothing to configure.
- Otherwise the
Fromdomain decides. A verified domain belongs to exactly one project, so[email protected]can only mean the project that verifiedacme.com. - If that still doesn't settle it — every project is on the shared testing domain, which is identical everywhere — put the project id in the username:
Username: 111f9258-6b77-4edb-a9f3-14bc66118b14
Password: ebk_your_keyYour project id is in Settings → SMTP, next to these connection details, with a button to copy it. You are only ever asked for it in that last case, and the error you get names your projects and their ids too, so you can copy one straight out of the reply.
Connect your app
The same four settings everywhere. These are the ones people ask for most; anything else with an SMTP box works the same way.
WordPress (WP Mail SMTP)
Mailer: Other SMTP
SMTP Host: smtp.emailbump.com
Encryption: TLS
SMTP Port: 587
Auth: On
Username: emailbump
Password: ebk_your_keyDjango
# settings.py
import os
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.emailbump.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "emailbump"
EMAIL_HOST_PASSWORD = os.environ["EMAILBUMP_API_KEY"]
DEFAULT_FROM_EMAIL = "Acme <[email protected]>"Rails
# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.emailbump.com",
port: 587,
user_name: "emailbump",
password: ENV["EMAILBUMP_API_KEY"],
authentication: :plain,
enable_starttls_auto: true
}Node.js (Nodemailer)
import nodemailer from "nodemailer" // install the nodemailer package
const transport = nodemailer.createTransport({
host: "smtp.emailbump.com",
port: 587,
secure: false, // STARTTLS is negotiated on 587
requireTLS: true,
auth: { user: "emailbump", pass: process.env.EMAILBUMP_API_KEY },
})Supabase
Supabase is configured through its dashboard rather than code, and has a few specifics of its own — sender address, rate limits and its built-in templates. It has its own guide: Supabase.
Send a template
Normally the message you hand us is the message we send. If you would rather keep the design in Email Bump, send JSON naming a saved template instead of an email body, and we render it:
{
"template_id": "d3d04286-d773-4d06-acfd-7ee983108f0b",
"variables": { "first_name": "Kevin", "url": "https://acme.com/confirm/abc" }
}The template supplies the subject, so the Subject: header is ignored for these. transactionalId and dataVariables are accepted as aliases, so payloads written for Loops work unchanged.
Troubleshooting
Replies say what went wrong rather than a bare code.
Common replies
535Invalid API keyoptionalThe password is not a live key. Revoked and expired keys fail here too.
550several projectsoptionalAn all-access key, several projects, and a From domain that identifies none of them — usually the shared testing domain. Put the project id in the username, or send from a verified domain.
530Must issue a STARTTLS command firstoptionalThe client tried to authenticate before encrypting. Turn on TLS/STARTTLS.
550From email must use…optionalThe From domain is not verified for this project. Permanent — the client will not retry.
550You've verified …optionalYou sent from the shared testing domain after verifying your own. Switch the From address to your domain.
451limit reachedoptionalMonthly allowance or the shared-domain daily cap. Temporary, so clients retry later.
552Message exceeds…optionalOver 40 MB, which is the ceiling for a single message.
Every attempt is recorded whether or not anything was sent, under SMTP logs in the dashboard — the reply code, the reason in these same words, the From address and how many recipients were accepted.
Nothing was sent, so there is no message to log. If mail isn't arriving and the transactional log looks empty, that is the symptom — SMTP logs is where the refusals are.