Mautic is marketing automation, so what it sends is mostly bulk mail: segment emails, campaign steps, newsletters. Since version 5 it sends through Symfony Mailer, and an SMTP relay is configured as a DSN on one settings screen. Below is the setup for Postwing, plus the three things bulk mail needs beyond a working connection — unsubscribes, bounces and pacing.
| Setting | Value |
|---|---|
| SMTP host | smtp.postwing.app |
| Port | 587 |
| Encryption | STARTTLS (the connection is upgraded to TLS before login) |
| Username | The login of an SMTP token for your domain |
| Password | The password of that token — shown once, when the token is created |
Open Settings (the cog, top right) → Configuration → Email Settings. Under Mail Send Settings:
| Field | Value |
|---|---|
| Name to send mail as | Your brand or team name |
| E-mail address to send mail from | news@your-domain.com — on your verified domain |
| Reply to address | A mailbox someone reads, if the sender is not one |
| Custom return path (bounce) address | Leave empty — see Bounces below |
Under Email DSN:
| Field | Value |
|---|---|
| Scheme | smtp |
| Host | smtp.postwing.app |
| Port | 587 |
| User | The login of an SMTP token for your domain |
| Password | That token's password |
| Path, Options | Leave empty |
Save, then use Send test email — it goes to your own user's address. The form URL-encodes the login for you; if you edit the file instead, encode the @ yourself:
<?php
// config/local.php — the @ in the login must be written as %40
$parameters = array(
// ...
'mailer_from_name' => 'Acme',
'mailer_from_email' => 'news@your-domain.com',
'mailer_dsn' => 'smtp://token-login%40your-domain.com:your-token-password@smtp.postwing.app:587',
); Mautic adds List-Unsubscribe and the one-click List-Unsubscribe-Post to marketing emails on its own. When we classify a message as bulk, the relay puts our one-click pair in their place, so the unsubscribe is recorded in the domain's unsubscribe list rather than in Mautic. Later mail to that address is dropped rather than delivered, and Mautic's contact stays subscribed until you sync it — the unsubscribed webhook is the event to act on. The {unsubscribe_text} link in the body still goes to Mautic.
With a monitored inbox set up under Monitored Inbox Settings, Mautic puts a tagged bounce address (…+bounce_…@) in the envelope, and mautic:email:fetch reads the bounces that come back.
550 from must be equal to …. Also leave the domain's return path in the dashboard empty — it replaces the envelope Mautic chose, and the tag Mautic matches bounces by is lost. A rejection our servers receive during delivery is not sent back as a bounce message: it is in the domain's log and in the bounced webhook. Hard bounces are not suppressed for you, so mark those contacts Do Not Contact in Mautic, or the next campaign mails them again and your bounce rate climbs.
Segment emails are sent by cron, which is where you control speed. Keep one hour of runs under your plan's hourly limit — above it the relay refuses with 550 hourly limit exceeded. A new domain's warm-up never refuses; it delivers over-cap mail later. Both are described in sending limits.
# Send segment emails, at most 500 contacts per run
*/15 * * * * php /var/www/mautic/bin/console mautic:broadcasts:send --limit=500
# Read the monitored inbox for bounces and unsubscribe requests
*/10 * * * * php /var/www/mautic/bin/console mautic:email:fetch| Error | Cause and fix |
|---|---|
Connection could not be established | Outbound port blocked — set Port to 8587, or 8465 for implicit TLS. |
Failed to authenticate on SMTP server | Wrong token credentials, or an unencoded @ in a hand-edited mailer_dsn. |
550 from must be equal to … | The sender or the monitored inbox address is not on your verified domain. |
550 hourly limit exceeded | Lower --limit or run the cron less often. |
| Test email works, campaign sends nothing | The mautic:broadcasts:send cron is not running, or the queue is enabled with no messenger:consume email worker. |
| Mail goes to spam | The From address is not on your verified domain, or the list has not been cleaned of bounces. |
Settings (the cog, top right) → Configuration → Email Settings. Since Mautic 5 the connection is an Email DSN with Scheme, Host, Port, User, Password and Options fields, which Mautic assembles into smtp://user:pass@host:port.
No. The encryption follows the port: with the smtp scheme, port 587 upgrades the connection with STARTTLS and port 465 is encrypted from the first byte. Use 587 unless your host blocks it.
The DSN is tested only after it is saved — Mautic tells you to save changes to test the DSN. Save the configuration first, then send the test.
Yes, on marketing emails: Mautic adds List-Unsubscribe and List-Unsubscribe-Post itself. Transactional emails get none. Messages we classify as bulk carry our own one-click pair instead, and an unsubscribe through it is recorded on our side — see below.
Through the monitored inbox. Mautic puts its bounce address in the envelope, and the recipient's server sends the bounce there; mautic:email:fetch reads it and marks the contact Do Not Contact. Rejections our servers receive during delivery are not sent back as bounce messages — they are in the domain's log and the bounced webhook.
Pace mautic:broadcasts:send with --limit and a cron interval, so an hour's worth of runs stays under your hourly limit. Above it the relay refuses the message with 550 hourly limit exceeded, and that send fails rather than waiting.