Files
xamxam/docs/SMTP_550_POSTFIX_FIX.md
2026-05-05 11:04:52 +02:00

3.7 KiB

SMTP 550 — Recipient Address Rejected (erg.school)

Date: 2026-04-30
Symptom: Access-link emails to @erg.school addresses fail with:

550 5.1.1 <user@erg.school>: Recipient address rejected: User unknown in virtual mailbox table

What is happening

The SMTP relay that XAMXAM uses to send outbound email is a Postfix instance that is also configured as the authoritative mail server for erg.school.

When XAMXAM sends RCPT TO:<user@erg.school>, Postfix looks up the address in its local virtual_mailbox_maps table. Because the individual mailbox does not exist in that table, Postfix rejects the message permanently with 550 instead of forwarding it outward.

This affects all outbound email to @erg.school sent through this relay, regardless of whether the address is real — Postfix never tries to route the message anywhere else.


Why it happens

Postfix owns a domain in one of two ways:

Setting Effect
mydestination Postfix delivers locally via Unix accounts
virtual_mailbox_domains Postfix delivers locally via virtual_mailbox_maps

If erg.school (or a wildcard matching it) appears in either of these on the outbound relay, Postfix will never relay mail to that domain — it will always attempt local delivery and reject unknown recipients.

To confirm, run on the relay server:

postconf mydestination
postconf virtual_mailbox_domains
postconf relay_domains

Check whether erg.school appears (directly or via a lookup table).


Fix options

Option A — Preferred: use a different relay for outbound mail

Configure XAMXAM to send via an SMTP relay that does not host erg.school (e.g. a dedicated outbound relay, a transactional mail provider, or the outbound smarthost if one exists).

Change the SMTP settings in the XAMXAM admin panel (/admin/parametres.php) to point to that relay.


Option B — Remove erg.school from local delivery on the relay

If the relay should not be the final destination for erg.school mail, remove it from the relevant Postfix maps.

If it is in mydestination:

# /etc/postfix/main.cf
mydestination = localhost, localhost.localdomain
# remove erg.school (and any wildcard covering it)

If it is in virtual_mailbox_domains:

# /etc/postfix/main.cf
virtual_mailbox_domains = ...
# remove erg.school from the list (or from the referenced lookup table)

After editing main.cf:

postfix check
systemctl reload postfix

Option C — Add a transport_maps override for the domain

If erg.school must remain in virtual_mailbox_domains for inbound delivery but outbound mail from XAMXAM should still be relayed, add a transport override so that mail to erg.school sent by XAMXAM is forwarded to the real MX rather than delivered locally.

# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
erg.school    smtp:[mail.erg.school]:25
postmap /etc/postfix/transport
systemctl reload postfix

Note: This approach is fragile — if XAMXAM is on the same server as the MX, you risk a delivery loop. Option A or B is cleaner.


Verification

After applying the fix, test with XAMXAM's built-in SMTP probe (/admin/parametres.php → Test SMTP). Then submit a real access request with an @erg.school address and confirm the email arrives.

You can also test directly from the server:

swaks --to test.user@erg.school \
      --from xamxam@erg.be \
      --server <smtp_host> --port 587 \
      --tls --auth-user <username> --auth-password <password>

A successful relay returns 250 2.0.0 Ok: queued as ….
A 550 response confirms the domain is still being caught locally.