Updated 2026-10-08
How to Configure SMTP in Ghost (Self-Hosted)
To send Ghost email through SMTP, edit config.production.json and add a "mail" block with "transport": "SMTP", host smtp.bulko.io, port 587, "secure": false and your Bulko SMTP username and password, then run ghost restart. This covers Ghost's transactional email (staff invites, password resets, member sign-up and login links); Ghost newsletters (bulk email) still require Mailgun.
Ghost SMTP settings
| Field | Value |
|---|---|
| mail.transport | SMTP |
| mail.options.host | smtp.bulko.io |
| mail.options.port | 587 (or 2525 if 587 is blocked; 465 with secure: true) |
| mail.options.secure | false for 587/2525 (STARTTLS), true for 465 |
| mail.options.auth.user | Your Bulko SMTP username (smtp_xxxxxxxxxxxxxxxx) |
| mail.options.auth.pass | Your Bulko SMTP password |
| mail.from | 'Your Site' <[email protected]> (a domain you control) |
Step-by-step setup
- Buy an SMTP package on the Bulko SMTP Relay page and copy the username and password from Dashboard -> SMTP Access (they are also emailed to you after payment).
- On your Ghost server, open the install directory (often
/var/www/ghost) and editconfig.production.json. - Add or replace the
mailobject with the example below. Keepfromat themaillevel, not insideoptions. - Use port
587with"secure": false: Nodemailer (the library Ghost uses) upgrades the connection with STARTTLS. If you prefer port465, set"secure": true. - If you run Ghost in Docker, set the same values as environment variables with double underscores, for example
mail__transport=SMTP,mail__options__host=smtp.bulko.io,mail__options__port=587,mail__options__auth__user=.... - Run
ghost restart(or restart the container) so Ghost reloads the config. - Optional: verify your sending domain in Bulko (DKIM selector
bk1and abnc.return-path CNAME) so SPF, DKIM and DMARC align for your From domain.
config.production.json (mail section)
{
"mail": {
"from": "'Your Site' <[email protected]>",
"transport": "SMTP",
"options": {
"host": "smtp.bulko.io",
"port": 587,
"secure": false,
"auth": {
"user": "smtp_xxxxxxxxxxxxxxxx",
"pass": "YOUR_BULKO_SMTP_PASSWORD"
}
}
}
}
Send a test email
The quickest test is a staff invite: in Ghost Admin open Settings -> Staff, invite a user with an address you can read, and check that the invitation arrives. You can also sign out and use the password reset link on the login screen, or sign up as a member through Portal to trigger a magic login link.
If nothing arrives, run ghost log (or docker logs) and look for the SMTP response. A connection timeout usually means your host blocks the port; a 535 line means the credentials are wrong.
Troubleshooting
| Problem | Fix |
|---|---|
| Connection timeout / ETIMEDOUT when Ghost sends mail | Your hosting provider is blocking the outbound port. Some providers (DigitalOcean is one) block 25, 465 and 587 by default. Switch to port 2525 with "secure": false, or ask the provider to unblock SMTP. |
| wrong version number / SSL routines error | TLS mode and port do not match. Use "secure": false with 587 or 2525, and "secure": true only with 465. |
| 535 Authentication failed | The username or password is wrong or has extra spaces. Copy both again from Dashboard -> SMTP Access and check the JSON quoting. See the guide to error 535 at https://bulko.io/en/smtp-errors/535/. |
| Invites send but newsletters do not | Expected behavior: Ghost sends newsletters only through its Mailgun bulk integration, configured in Ghost Admin. SMTP in config.production.json is used for transactional email only. |
| 554 5.7.1 rejected | The message was blocked by Bulko's content filter (phishing, malware, impersonation or scam patterns). Review the email content and the From address; write to [email protected] if you think it is a false positive. |
| Mail goes to spam | Use a From address on your own domain, verify the domain in Bulko for DKIM alignment, and check your domain with the SPF checker at https://bulko.io/en/validators/spf-checker/. |
FAQ
Can Ghost send newsletters through SMTP?
No. Ghost's docs state that Mailgun is required for bulk mail. A custom SMTP server in config.production.json handles transactional email such as staff invites, password resets and member login links.
Which port should I use for Ghost SMTP?
Port 587 with "secure": false is the usual choice. Use 465 with "secure": true for implicit TLS, or 2525 with "secure": false if your host blocks the standard ports.
Where does the From address come from?
Ghost uses mail.from as the default sender. You can add a display name, for example 'Acme Support' <[email protected]>. The address must be on a domain you control.
Does this work on Ghost(Pro)?
No. The mail block in config.production.json applies to self-hosted Ghost. Ghost(Pro) handles email delivery itself.
How much does Bulko SMTP cost?
Packages are one-time payments: $5 for 5,000 emails, $15 for 20,000, $30 for 50,000 or $60 for 150,000. Unused emails do not expire, and the default limit is 2,000 emails per day.
Can Ghost receive replies through Bulko?
No. Bulko SMTP is outgoing only and has no inbox or IMAP. Replies go to the From or Reply-To mailbox you set.
Get SMTP credentials for Ghost
One-time payment by card or crypto, no subscription. Unused emails never expire. 2,000 emails per day per SMTP account.
What you can send: Acceptable Use Policy.