---
title: "Configure Ghost transactional email over SMTP"
description: "mail.transport SMTP in config.production.json for staff invites, password resets and member login links."
url: https://www.unitpost.com/docs/smtp/ghost
section: SMTP
updated: 2026-11-02
---
# Configure Ghost transactional email over SMTP

## Connection settings

- **Host**: smtp.unitpost.com
- **Username**: unitpost (always this literal value)
- **Password**: Your Unitpost API key (must carry emails:send)
- **Port (STARTTLS)**: 587 (or 2587 if blocked, or 25)
- **Port (implicit TLS)**: 465 (or 2465 if blocked)
- **Security**: TLS 1.2 or 1.3 (required before AUTH)
- **From address**: Any address on a verified domain

## Configure Ghost transactional email over SMTP

> mail.transport SMTP in config.production.json for staff invites, password resets and member login links.

Self-hosted Ghost sends staff invitations, password resets, member signups and member login links through the `mail` block in `config.production.json`. Newsletters are a separate path: Ghost delivers them only through Mailgun's bulk API and can't use SMTP, so this setup covers everything except newsletter sends.

### 1. Create a send-only key

In Unitpost, open Settings → SMTP and create a send-only key. Ghost sends from `mail.from`, so use an address on a verified domain (/docs/domains).

### 2. Add the SMTP transport

In `config.production.json` in your Ghost install directory, add a `mail` block. Ghost hands `options` to Nodemailer (/docs/smtp/nodemailer), so `secure: false` on port 587 upgrades with STARTTLS, and `secure: true` belongs with 465.

```json
"mail": {
  "transport": "SMTP",
  "from": "Your Site <noreply@yourdomain.com>",
  "options": {
    "host": "smtp.unitpost.com",
    "port": 587,
    "secure": false,
    "auth": {
      "user": "unitpost",
      "pass": "pk_live_..."
    }
  }
}
```

> Running Ghost in Docker? Every config key has an environment variable form with double underscores, such as `mail__transport=SMTP`, `mail__options__host=smtp.unitpost.com` and `mail__options__auth__pass`.

### 3. Restart Ghost

From the install directory, restart with Ghost-CLI so the new config loads. In Docker, recreate the container instead.

```bash
ghost restart
```

### 4. Send a test

Invite a staff user from Ghost Admin, or request a password reset from the `/ghost` sign-in page. The email shows up in Unitpost Emails.

### 5. Newsletters stay on a bulk API

Ghost's FAQ says newsletter delivery requires a bulk mail API and can't use SMTP, so the transport above never carries newsletters. Ghost doesn't require its built-in newsletter feature, though: you can export members and send newsletters as Unitpost campaigns instead.

## Related

- [Keycloak SMTP settings for realm email](https://www.unitpost.com/docs/smtp/keycloak): Realm settings → Email: host, port, Enable StartTLS for 587, then Test connection to your own address.
- [Set up Strapi email over SMTP](https://www.unitpost.com/docs/smtp/strapi): @strapi/provider-email-nodemailer in config/plugins, then fix the Users & Permissions shipper email.
- [Configure n8n SMTP for invites and password resets](https://www.unitpost.com/docs/smtp/n8n): N8N_SMTP_* environment variables with N8N_SMTP_SSL=false for port 587, then invite a user to test.
