apiVersion: v1
kind: ConfigMap
metadata:
  name: maddy
  namespace: {{ .Release.Namespace }}
data:
  smtp-servers.conf: |
    maddy.{{ .Values.domains.primary.namespace}}.svc.cluster.local:587
    {{ range .Values.domains.others}}
    maddy.{{ .namespace }}.svc.cluster.local:587
    {{ end }}
  maddy.conf: |
    $(hostname) = {{ .Values.domains.primary.mx }}
    $(primary_domain) = {{ .Values.domains.primary.name }}
    $(local_domains) = {{ .Values.domains.primary.name }}{{ range .Values.domains.others }} {{ .name }}{{ end }}

    tls file /etc/maddy/certs/tls.crt /etc/maddy/certs/tls.key

    auth.external authsmtp {
        helper /usr/bin/auth-smtp
        perdomain yes
        domains $(local_domains)
    }

    hostname $(hostname)

    msgpipeline local_routing {
        destination {{ .Values.domains.primary.name }} {
            deliver_to &{{ .Values.domains.primary.name }}
        }
        {{ range .Values.domains.others }}
        destination {{ .name }} {
            deliver_to &{{ .name }}
        }
        {{ end }}
        default_destination {
            reject 550 5.1.1 "User doesn't exist"
        }
    }

    smtp tcp://0.0.0.0:25 {
        insecure_auth no

        defer_sender_reject yes

        limits {
            # Up to 20 msgs/sec across max. 10 SMTP connections.
            all rate 20 1s
            all concurrency 10
        }

        dmarc yes
        check {
            require_mx_record
            dkim
            spf
        }

        source $(local_domains) {
            reject 501 5.1.8 "Use Submission for outgoing SMTP"
        }
        default_source {
            destination $(local_domains) {
                deliver_to &local_routing
            }
            default_destination {
                reject 550 5.1.1 "User doesn't exist"
            }
        }
    }

    submission tls://0.0.0.0:465 tcp://0.0.0.0:587 {
        auth &authsmtp
        insecure_auth yes

        defer_sender_reject yes

        source $(local_domains) {
            destination $(local_domains) {
                deliver_to &local_routing
            }
            default_destination {
                modify {
                    dkim $(primary_domain) $(local_domains) default
                }
                deliver_to &remote_queue
            }
        }
        default_source {
            reject 501 5.1.8 "Non-local sender domain"
        }
    }

    target.smtp {{ .Values.domains.primary.name }} {
        hostname $(hostname)
        attempt_starttls false
        require_tls no
        auth off
        targets tcp://maddy.{{ .Values.domains.primary.namespace }}.svc.cluster.local:25
    }

    {{ range .Values.domains.others }}
    target.smtp {{ .name }} {
        hostname mail.{{ .name }}
        attempt_starttls false
        require_tls no
        auth off
        targets tcp://maddy.{{ .namespace }}.svc.cluster.local:25
    }
    {{ end }}

    target.queue remote_queue {
        target &outbound_delivery

        autogenerated_msg_domain $(primary_domain)
        bounce {
            destination postmaster $(local_domains) {
                deliver_to &local_routing
            }
            default_destination {
                reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"
            }
        }
    }

    target.remote outbound_delivery {
        limits {
            # Up to 20 msgs/sec across max. 10 SMTP connections
            # for each recipient domain.
            destination rate 20 1s
            destination concurrency 10
        }
        mx_auth {
            dane
            mtasts {
                cache fs
                fs_dir mtasts_cache/
            }
            local_policy {
                min_tls_level encrypted
                min_mx_level none
            }
        }
    }
