Ga naar inhoud

E-mail (uitgaande mail)

Het portaal verstuurt mail (o.a. de autorisatieverzoek-mails: nieuw verzoek, goedgekeurd, afgewezen) via de Exim-MTA op de host, niet via een externe provider.

Portaal (Laravel)  ──SMTP──▶  host-Exim (host.docker.internal:25)  ──▶  internet  ──▶  ontvanger
                                          afzender: portaal@mc-dienstverlening.cloud

Bezorgbaarheid (Gmail e.d. accepteren de mail) hangt af van DNS-records op mc-dienstverlening.cloud; zie onderaan.

Portaal-configuratie (.env)

MAIL_MAILER=smtp
MAIL_HOST=host.docker.internal     # de host (Exim); zie extra_hosts in compose
MAIL_PORT=25
MAIL_USERNAME=                     # lokale Exim, geen auth
MAIL_PASSWORD=
MAIL_AUTO_TLS=false               # Exim biedt STARTTLS met niet-matchend cert
MAIL_FROM_ADDRESS=portaal@mc-dienstverlening.cloud   # moet matchen met SPF/DKIM
MAIL_FROM_NAME="ZGD Portal"

In docker-compose.yml staat op de portal-service:

extra_hosts:
  - "host.docker.internal:host-gateway"   # container bereikt zo de host-Exim

MAIL_MAILER=log betekent dat mail niet wordt verstuurd maar alleen in het Laravel-log belandt (handig voor lokaal/testen). In de EmailLog-tabel zie je dat aan de kolom mailer (log vs smtp).

Host-Exim: docker-subnet als relay-bron (vereist)

De container draait niet met --network host, dus de SMTP-verbinding komt binnen vanaf het docker-subnet (172.16.0.0/12) i.p.v. 127.0.0.1. Exim moet dat subnet vertrouwen, anders weigert hij met 550 relay not permitted.

In /etc/exim4/exim4.conf.template én de live /var/lib/exim4/config.autogenerated:

hostlist relay_from_hosts = 127.0.0.1 : 172.16.0.0/12

Daarna: systemctl restart exim4. (Dit is hostconfiguratie, geen onderdeel van deze repo. Bij een herinstallatie van de host/Exim opnieuw zetten.)

DNS-records (op mc-dienstverlening.cloud)

Zonder deze records weigert Gmail met 550-5.7.26 ... unauthenticated:

Record Naam Waarde (kern)
SPF @ (TXT) v=spf1 ip4:72.62.60.239 ~all
DKIM mail._domainkey (TXT) v=DKIM1; k=rsa; p=… (publieke sleutel)
DMARC _dmarc (TXT) v=DMARC1; p=none; rua=mailto:mjh.cremer@gmail.com

Verzending + worker

De autorisatieverzoek-mails worden afgehandeld door de worker operaton:mail-worker (supervisord-programma in het portaal-image; pollt de Operaton external-tasks notify-admin / notify-approved / notify-rejected). Elke verzending wordt gelogd in de email_logs-tabel.

Problemen oplossen

  • Niets ontvangen? Kijk in email_logs: staat er mailer = log, dan is de mailer nog op log gezet (niet echt verzonden).
  • Relay geweigerd? 550 relay not permitted → docker-subnet ontbreekt in relay_from_hosts (zie boven).
  • Gmail weigert (550-5.7.26)? SPF/DKIM/DMARC-records ontbreken of kloppen niet, of MAIL_FROM_ADDRESS staat niet op @mc-dienstverlening.cloud.
  • Exim-logboek: /var/log/exim4/mainlog (zoek op het ontvangeradres). Wachtrij: exim4 -bpc (aantal) / exim4 -bp (lijst).