Postfix Header_Check Regex ‘Does Not Match’ issue

postfixregex

I am trying to configure Postfix to NOT accept outbound messages with FROM addresses other than my own domains.

The following regex successfully rejects only 3 domains:

/etc/postfix/header_checks:
/(^From:.*domain\.com|^From:.*domain\.net|^From:.*domain\.co\.il)/ REJECT SEND FROM THE RIGHT DOMAINS FFS!

I'd like to basically reverse it and block EVERYTHING BUT those 3.

So according to the manual:

!/pattern/flags result
When pattern does not match the input string, use the corre-
sponding result value.

However, this just blocks everything:

/etc/postfix/header_checks:
!/(^From:.*domain\.com|^From:.*domain\.net|^From:.*domain\.co\.il)/ REJECT SEND FROM THE RIGHT DOMAINS FFS!

Best Answer

The problem is postfix use header_checks for every header line. So if there is header line like

Subject: I love you :p

and postfix will apply that regex into this line. The result is postfix will reject this email.

The solution is adding if endif in your regex pattern

if /^From:/
!/(^From:.*domain\.com|^From:.*domain\.net|^From:.*domain\.co\.il)/ REJECT SEND FROM THE RIGHT DOMAINS FFS!
endif

Basically you tell postfix to apply the pattern into From header only. This will prevent postfix to evaluate the regex into another header line and causes rejected email.

See postfix manual to further information