Skip to content

andreasschulze/dmarc_dsn_processor

Repository files navigation

DMARC DSN Processor

markdownlint pylint

Sending DMARC aggregated reports is a good thing. But if you do so, you will note some reports are undeliverable. A simple solution is to simply ignore them. But you do not want to deliver messages to addresses known to be undeliverable. This may reduce you reputation.

An other option is to not generate reports once a receiver address is known to be undeliverable. Mostly this require configuration on the report generator.

This solution follow an other approach: you still generate the reports, but discard the messages for some days once a receiver address become known to be undeliverable. After some days you give the receiver a new chance to have it's problem solved.

We assume a dedicated sender address for dmarc aggregated reports. We also assume you're using the Postfix MTA to send reports and receive delivery status messages.

Any message to the address used as sender is assumed to be a delivery status messages. Configure Postfix to deliver these messages with the pipe delivery agent.

/etc/postfix/master.cf
  dmarc_dsn_processor unix - n n - - pipe
  flags=Rq
  user=nobody
  argv=/path/to/dmarc_dsn_processor.py ${queue_id} ${extension} /path/to/data_dir

Enable address extensions that may contain VERP information. To prevent Postfix from sending multiple recipients per delivery request, limit parallel deliveries:

/etc/postfix/main.cf
  dmarc_dsn_processor_destination_recipient_limit = 1
  recipient_delimiter = +

Now add a transport map entry. You may use the inline map:

/etc/postfix/main.cf
  transport_maps = inline:{sender@example=dmarc_dsn_processor}

Create the working directory:

# install -d --owner nobody /path/to/data_dir

Finally, don't forget postfix reload and check your logs for warning/errors.

Now, wait until reports are sent (and get some dsn messages). By time, you'll see /path/to/data_dir/domains/ get populated.

Now use build_postfix_discard_table.py create a postfix map that discard future messages to the addresses known to be undeliverable.

# /path/to/build_postfix_discard_table.py /path/to/data_dir \
    > /etc/postfix/dmarc_dsn_processor_discards
# postmap /etc/postfix/dmarc_dsn_processor_discards

These map is used as transport_map .

/etc/postfix/main.cf
  transport_maps =
    inline:{sender@example=dmarc_dsn_processor}
    ${default_database_type}:${config_directory}/dmarc_dsn_processor_discards

Monitor you log and confirm messages are discarded. Setup a cron job to call build_postfix_discard_table.py and postmap daily or hourly. You do not need postfix reload. Postfix will notice the changed transport_map.

Now, you receive no dsn for, say example.org and the file /path/to/data_dir/domains/example.org get older. If it's older then 30 days, build_postfix_discard_table.py no longer create an entry to discard messages to that specific domain's DMARC report receiver. This gives the domain owner a next chance.

About

process dsn messages for sent DMARC reports

Topics

Resources

Stars

Watchers

Forks

Languages