SMTP relay
Already have a mailer? Point it at Buzzmark and keep sending the way you do today. Every message gets the same checks, tracking and logging as the API.
Connection settings
| Setting | Value |
|---|---|
| Host | smtp.buzzmarkapp.com |
| Port | 587 (recommended) or 2525 if your network blocks 587. There’s no implicit-TLS port 465. |
| Encryption | STARTTLS, required. Connect in plain text, then upgrade - in most libraries that’s tls / secure: false + STARTTLS, not ssl. |
| Authentication | PLAIN or LOGIN |
| Username | Your hive token (any value works - only the password is checked) |
| Password | Your hive token, bzm_srv_… |
| Max message size | 25 MB, including attachments |
S: 220 smtp.buzzmarkapp.com ESMTP
C: EHLO app.acme.com
S: 250-smtp.buzzmarkapp.com
S: 250-STARTTLS
S: 250 ...
C: STARTTLS
S: 220 Go ahead
(TLS handshake - AUTH is only offered from here on)
C: EHLO app.acme.com
S: 250-AUTH PLAIN LOGIN
S: 250 ...
C: AUTH PLAIN AGJ6bV9zcnZfLi4uAGJ6bV9zcnZfLi4u
S: 235 2.7.0 Authentication successful
C: MAIL FROM:<hello@acme.com>
C: RCPT TO:<customer@example.com>
C: DATA
...
S: 250 Message accepted as f5ab446c-18ad-4db4-b747-8e1ba70ec72d
Authentication
The SMTP password is the hive’s API token - the same one the REST API uses - so mail sent over SMTP lands in that hive’s message log. Create or rotate it on the hive’s settings page in the dashboard; it’s shown once.
AUTHis only offered after STARTTLS, so a password is never sent unencrypted. If your client says the server doesn’t support authentication, it didn’t start TLS.- Rotating the token in the dashboard stops the old one working immediately - update your mailer at the same time.
How your email is read
Buzzmark reads the message you submit and treats it exactly like an API send:
From the message you submit
From header
MAIL FROM) is used.To / Cc headers
Envelope recipients
To or Cc is treated as Bcc - so normal Bcc from your mail library just works.Reply-To, Subject
HTML and text parts
Attachments
Content-ID. Same limits as the API.X- headers
X- are passed through. Other headers are set by Buzzmark.Tag or get your own
Metadata back in webhooks, send with the API instead.
Sending rules
Everything that applies to the API applies here:
- The
Fromdomain must be verified on your workspace. - Recipients on the hive’s suppression list (after a hard bounce or spam complaint) are refused.
- Your account’s per-minute send rate and monthly allowance apply.
- Open and click tracking follow the hive’s settings.
- Every message appears in the hive’s message log and triggers your webhooks, just like an API send.
- A brand-new account’s first few emails may be held briefly for review before they go out.
SMTP replies
What the server answers when you hand over a message, and what your mailer should do:
Responses
-
250
Message accepted as {MessageID}- accepted. The id is the sameMessageIDas in the message log and webhooks. -
451
4.3.0 Temporary failure, retry later- you’re over your per-minute rate, or something went wrong on our side. Your mailer should retry later; most do automatically. - 530 Authentication required - you tried to send without logging in. Start TLS, then authenticate.
- 535 Authentication failed - the token is wrong, revoked, or belongs to a deleted hive.
-
550
5.7.1 …- refused, with the reason: an unverifiedFromdomain, a suppressed recipient, no body, a blocked account or a used-up free allowance. Don’t retry until you’ve fixed it.
Examples
Quick test
swaks is the quickest way to check your settings from a terminal.
A successful run ends with 250 Message accepted as …, and the message shows up in the hive’s
message log straight away.
swaks \
--server smtp.buzzmarkapp.com --port 587 -tls \
--auth PLAIN \
--auth-user bzm_srv_... --auth-password bzm_srv_... \
--from hello@acme.com \
--to customer@example.com \
--header "Subject: Hello from SMTP" \
--body "It works."
Frameworks
Any SMTP client works. Use port 587 with STARTTLS (often labelled tls), and the hive token as both
username and password. Keep the token in an environment variable rather than in your code.
- Laravel - set the mail variables in
.env;Mail::to(...)->send(...)then goes through Buzzmark. - Node.js - Nodemailer with
secure: falseandrequireTLS: true. - Python - the standard library’s
smtplib; callstarttls()beforelogin(). - Django / Rails - the built-in SMTP backends.
# .env
MAIL_MAILER=smtp
MAIL_HOST=smtp.buzzmarkapp.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=bzm_srv_...
MAIL_PASSWORD=bzm_srv_...
MAIL_FROM_ADDRESS=hello@acme.com
MAIL_FROM_NAME="Acme"
import nodemailer from "nodemailer";
const transport = nodemailer.createTransport({
host: "smtp.buzzmarkapp.com",
port: 587,
secure: false, // starts plain, then upgrades with STARTTLS
requireTLS: true, // refuse to send if STARTTLS fails
auth: { user: "bzm_srv_...", pass: process.env.BUZZMARK_TOKEN },
});
await transport.sendMail({
from: "Acme <hello@acme.com>",
to: "customer@example.com",
subject: "Your receipt",
html: "<p>Thanks for your order!</p>",
text: "Thanks for your order!",
headers: { "X-Order-Id": "1234" },
});
import os, smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["From"] = "Acme <hello@acme.com>"
msg["To"] = "customer@example.com"
msg["Subject"] = "Your receipt"
msg.set_content("Thanks for your order!")
msg.add_alternative("<p>Thanks for your order!</p>", subtype="html")
token = os.environ["BUZZMARK_TOKEN"]
with smtplib.SMTP("smtp.buzzmarkapp.com", 587) as smtp:
smtp.starttls()
smtp.login(token, token)
smtp.send_message(msg)
# settings.py
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.buzzmarkapp.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ["BUZZMARK_TOKEN"]
EMAIL_HOST_PASSWORD = os.environ["BUZZMARK_TOKEN"]
DEFAULT_FROM_EMAIL = "Acme <hello@acme.com>"
# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.buzzmarkapp.com",
port: 587,
user_name: ENV["BUZZMARK_TOKEN"],
password: ENV["BUZZMARK_TOKEN"],
authentication: :plain,
enable_starttls: true
}
Next
- API reference - the REST equivalent, plus your message log and domains.
- Webhooks - react to delivery, bounce, open and click events.