# Send emails with MailWizz

> Add PostShiba as a MailWizz SMTP delivery server.

## What you'll build

A MailWizz delivery server that sends your campaigns, list emails, and test emails through PostShiba over SMTP. MailWizz keeps your lists, campaigns, and unsubscribe links. PostShiba delivers the mail and suppresses addresses that hard bounce or report spam.

## Before you start

- A **Marketing** cluster. Newsletters belong on a bulk cluster, not a transactional one, and the type is locked after create. See [Clusters](/docs/dashboard/clusters/introduction).
- An SMTP username and password. Open your cluster in the dashboard, go to its SMTP credentials, and choose **Create SMTP credential**. Copy the password right away, because it is shown once. You can also use the [SMTP credentials API](/docs/api-reference/smtp-credentials).
- A verified sending domain. See [Add and verify a domain](/docs/add-a-domain). The delivery server's **From email** and every list's from address must be on it.
- A cluster that is ready to send (`sending_ready` is `true`).
- Access to the MailWizz backend as an admin.

## Install

Nothing to install. MailWizz has SMTP support built in.

## Pick a plan for your largest list

PostShiba caps each cluster per hour and per rolling 24 hours. The 24-hour cap must cover your largest list plus anything else the cluster sends that day.

| Plan | Emails per hour | Emails per 24 hours |
| --- | --- | --- |
| Nano | 100 | 600 |
| Micro | 4,000 | 24,000 |
| Small | 40,000 | 240,000 |
| Medium | 100,000 | 600,000 |
| Large | 200,000 | 1,200,000 |

MailWizz enforces its own quotas on each delivery server. Set **Hourly quota** and **Daily quota** to the two numbers for your plan, and lower them if other apps send on the same cluster. MailWizz counts the daily quota per calendar day, so a campaign that runs across midnight can still reach PostShiba's rolling 24-hour cap. Nano is for test sends only.

When a cap is full, SMTP answers `451 4.7.0 hourly send limit reached` or `451 4.7.0 daily send limit reached` and does not keep the message. Select **Resize** on the cluster page before a campaign that would go over. See [What happens at your cap](/docs/dashboard/clusters/what-happens-at-your-cap).

## Send your first email

1. In the MailWizz backend, go to **Servers** → **Delivery servers** and select **Create new server**.
2. Choose **Smtp**, the plain SMTP type, not one of the provider-specific ones.
3. Enter these values. The username starts with `smtp_`.

```text mailwizz-smtp.txt
Hostname:    smtp.postshiba.com
Username:    smtp_9
Password:    YOUR_PASSWORD
Port:        587
Protocol:    TLS
Timeout:     30
From email:  hello@mail.example.com
```

4. Set **Hourly quota** and **Daily quota** to the values for your plan in the table above.
5. Set **Max. connection messages** to `100`. The default of `1` opens a new SMTP connection for every message.
6. Leave **Bounce server** empty. PostShiba handles bounces, as explained below.
7. Select **Save changes**.
8. Under **Validate this server**, enter your own address and select **Validate server**. MailWizz sends a confirmation email through PostShiba. Open the link in it to activate the server. The message shows under Events in the PostShiba dashboard.

Every SMTP setting is on [Send emails with SMTP](/docs/send-with-smtp).

## Bounces, complaints, and unsubscribes

MailWizz reads bounces from a bounce server, an IMAP or POP3 mailbox. PostShiba mail never reaches that mailbox, because the return-path points at PostShiba and bounce messages come back to PostShiba. Leave **Bounce server** empty on this delivery server. With one attached, MailWizz uses the mailbox address as the envelope sender, and PostShiba refuses the message with `550 unverified domain` unless that address is on your verified domain.

| Event | What happens |
| --- | --- |
| Hard bounce | PostShiba suppresses the address. Later sends to it are refused with `550 suppressed`. |
| Spam report | PostShiba suppresses the address the same way. |
| Soft bounce | PostShiba retries delivery. Nothing is suppressed. |
| Unsubscribe | MailWizz adds its own `List-Unsubscribe` and `List-Unsubscribe-Post` headers to campaigns, so PostShiba leaves them alone. MailWizz marks the subscriber as unsubscribed. |

Suppressed addresses still look active in MailWizz. PostShiba refuses them, so they never reach a mailbox, but they stay in your subscriber counts. Copy them into MailWizz now and then to keep your lists clean.

## Copy suppressions into MailWizz

1. Export every suppressed address to `postshiba-suppressions.csv`. Follow [How do I export my suppression list?](/docs/knowledge-base/how-do-i-export-my-suppression-list). It takes a read-only Support key and one script.
2. MailWizz needs a header row named `email`. Add it:

```sh mailwizz-blacklist.sh
(echo email; cat postshiba-suppressions.csv) > mailwizz-blacklist.csv
```

3. In the MailWizz backend, go to **Email blacklist** → **Email blacklist**, select **Import**, choose `mailwizz-blacklist.csv`, and select **Import file**. MailWizz then skips those addresses for every customer and list.

Run it again after each large campaign. Importing an address that is already on the blacklist does no harm.

## Troubleshooting

| What you see | What to do |
| --- | --- |
| Authentication fails | Check the username and password. Use port `587` with **Protocol** set to `TLS`. Port 465 with `SSL` is not offered. PostShiba accepts `AUTH PLAIN` only. |
| The connection times out or fails with **Protocol** set to `TLS` | Check **Default system mailer** under **Settings** → **Common**. SymfonyMailer treats `TLS` as implicit TLS, which port 587 does not speak. With SymfonyMailer, set **Protocol** to `STARTTLS`. The default SwiftMailer needs `TLS`. |
| The confirmation email never arrives | The server is not sending through PostShiba. Open the delivery server and check the saved values. |
| `550 unverified domain` or `550 from header not aligned with verified domain` | Remove the **Bounce server**, and use a from address on your verified domain for the list. To use the server's **From email** for every message, set **Force FROM email** to **Always**. |
| `550 kyc_required` | Your team is pending production approval. Until then, send only to team members, live inbox addresses, and inbox forward-to addresses. See [Does PostShiba require production approval?](/docs/knowledge-base/does-capsule-require-production-approval). |
| `550 suppressed` | The subscriber hard bounced or reported spam. Copy suppressions into MailWizz as shown above. |
| `451 4.7.0 hourly send limit reached` or `451 4.7.0 daily send limit reached` | The cluster is at its cap and did not keep the message. Lower **Hourly quota** and **Daily quota**, or resize the cluster before the next campaign. |
| `451 4.4.5 too many sessions, slow down` | MailWizz opened too many SMTP connections on one username in 10 seconds. Raise **Max. connection messages** so each connection carries more messages. |
| `421 4.3.2 ... idle too long` | PostShiba closed a connection that sat idle for 30 seconds. This is not throttling. If it repeats, lower **Max. connection messages**. See [421 4.3.2 idle too long](/docs/knowledge-base/smtp-421-idle-too-long). |

## Next steps

- [What happens at your cap](/docs/dashboard/clusters/what-happens-at-your-cap)
- [How to manage suppressions](/docs/dashboard/emails/email-suppressions)
- [How do recipients unsubscribe?](/docs/knowledge-base/how-do-recipients-unsubscribe)
- [Send emails with SMTP](/docs/send-with-smtp) for every setting and reply.
