← integrations

$ community

Ghost SMTP setup with Pharos

Send Ghost's staff and member emails through Pharos: SMTP transport, smtp.pharosinfra.net, port 587, secure set to false. Tested settings and errors.

Tested with Ghost 6.71.0 on 2026-10-19.

Settings

mail__transport SMTP
mail__options__host smtp.pharosinfra.net
mail__options__port 587 Use 2525 on DigitalOcean, which blocks 587.
mail__options__secure false STARTTLS on submission. true means implicit TLS and fails on this port.
mail__options__requireTLS true Refuse to send if STARTTLS is not offered, so the password never travels in clear.
mail__options__auth__user from the dashboard The generated SMTP username, not your account email.
mail__options__auth__pass from the dashboard
mail__from Site name <noreply@yourdomain.com> An address on your verified sending domain.
Ghost container environmentdocker-compose.yml
services:
  ghost:
    image: ghost:6
    environment:
      url: https://blog.yourdomain.com
      mail__transport: SMTP
      mail__from: "Your Blog <noreply@yourdomain.com>"
      mail__options__host: smtp.pharosinfra.net
      mail__options__port: 587
      mail__options__secure: "false"
      mail__options__requireTLS: "true"
      mail__options__auth__user: ${PHAROS_SMTP_USER}
      mail__options__auth__pass: ${PHAROS_SMTP_PASS}

Send a test email

Ghost has no “send test email” button for its transactional mail. Trigger one of the emails it sends to staff instead:

  1. Restart Ghost after changing the settings. Ghost reads mail config only at startup.
  2. Open /ghost/ and choose Forgot? on the sign-in form, using a staff account’s email.
  3. The “Reset Password” email should arrive within a minute.

If it fails, Ghost shows Failed to send email. Reason: followed by the SMTP error, both in the browser and in docker logs <ghost-container>. The errors below cover the reasons you are likely to see.

Where the settings live

The Docker image reads any Ghost config key from an environment variable, with double underscores marking each level. mail__options__host is mail.options.host in config.production.json. Pick one place: environment variables override the file.

Common errors

  • Failed to send email. Reason: ... SSL routines ... wrong version number mail__options__secure is true. Set it to false. Ghost then upgrades the connection with STARTTLS on port 587.
  • Connection timeout from a DigitalOcean droplet. DigitalOcean blocks outbound 587 on every droplet. Set mail__options__port to 2525. Nothing else changes.
  • Mail arrives from a different address than mail__from. Pharos sends from the verified sending domain the credential belongs to. Set mail__from to an address on that domain.
  • Newsletters do not send, but sign-in links and resets do. That is expected. Ghost sends newsletters only through its Mailgun integration. SMTP covers staff and member transactional mail.

Questions

Does this send Ghost newsletters?

No. Ghost's bulk newsletter sending is built on the Mailgun API and cannot use SMTP. The SMTP transport carries staff sign-in links, password resets, staff invitations and member sign-in emails.

I installed Ghost with Ghost-CLI, not Docker. Where do these settings go?

In config.production.json, under a "mail" object with the same structure. The env var mail__options__host becomes {"mail":{"options":{"host":...}}}. Restart Ghost with ghost restart after editing.

Sources

Send Ghost mail through Pharos.

The free plan covers 3,000 emails a month, 100 a day, with no card. Enough for most single-server installs.

start free