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.

Hostsmtp.bulko.io
Port587 · 465 · 2525
EncryptionSTARTTLS · SSL
Loginfrom dashboard

Ghost SMTP settings

FieldValue
mail.transportSMTP
mail.options.hostsmtp.bulko.io
mail.options.port587 (or 2525 if 587 is blocked; 465 with secure: true)
mail.options.securefalse for 587/2525 (STARTTLS), true for 465
mail.options.auth.userYour Bulko SMTP username (smtp_xxxxxxxxxxxxxxxx)
mail.options.auth.passYour Bulko SMTP password
mail.from'Your Site' <[email protected]> (a domain you control)

Step-by-step setup

  1. 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).
  2. On your Ghost server, open the install directory (often /var/www/ghost) and edit config.production.json.
  3. Add or replace the mail object with the example below. Keep from at the mail level, not inside options.
  4. Use port 587 with "secure": false: Nodemailer (the library Ghost uses) upgrades the connection with STARTTLS. If you prefer port 465, set "secure": true.
  5. 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=....
  6. Run ghost restart (or restart the container) so Ghost reloads the config.
  7. Optional: verify your sending domain in Bulko (DKIM selector bk1 and a bnc. 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

ProblemFix
Connection timeout / ETIMEDOUT when Ghost sends mailYour 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 errorTLS mode and port do not match. Use "secure": false with 587 or 2525, and "secure": true only with 465.
535 Authentication failedThe 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 notExpected 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 rejectedThe 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 spamUse 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.

SMTP Relay 5K: $5 · 5000SMTP Relay 20K: $15 · 20000SMTP Relay 50K: $30 · 50000SMTP Relay 150K: $60 · 150000
See SMTP relay plans

What you can send: Acceptable Use Policy.