#++ # NAME # pcre_table 5 # SUMMARY # format of Postfix PCRE tables # SYNOPSIS # \fBpostmap -fq "\fIstring\fB" pcre:/etc/postfix/\fIfilename\fR # # \fBpostmap -fq - pcre:/etc/postfix/\fIfilename\fR <\fIinputfile\fR # DESCRIPTION # The Postfix mail system uses optional tables for address # rewriting or mail routing. These tables are usually in # \fBdbm\fR or \fBdb\fR format. # # Alternatively, lookup tables can be specified in Perl Compatible # Regular Expression form. In this case, each input is compared # against a list of patterns, and when a match is found the # corresponding result is returned. # # To find out what types of lookup tables your Postfix system # supports use the \fBpostconf -m\fR command. # # To test lookup tables, use the \fBpostmap -fq\fR command as # described in the SYNOPSIS above. # TABLE FORMAT # .ad # .fi # The general form of a PCRE table is: # .IP "\fB/\fIpattern\fB/\fIflags result\fR" # When \fIpattern\fR matches the input string, use # the corresponding \fIresult\fR value. # .IP "\fB!/\fIpattern\fB/\fIflags result\fR" # When \fIpattern\fR does \fBnot\fR match the input string, use # the corresponding \fIresult\fR value. # .IP "\fBif /\fIpattern\fB/\fIflags\fR" # .IP "\fBendif\fR" # Match the input string against the patterns between \fBif\fR # and \fBendif\fR, if and only if the input string also matches # \fIpattern\fR. The \fBif\fR..\fBendif\fR can nest. # .sp # Note: do not prepend whitespace to patterns inside # \fBif\fR..\fBendif\fR. # .IP "\fBif !/\fIpattern\fB/\fIflags\fR" # .IP "\fBendif\fR" # Match the input string against the patterns between \fBif\fR # and \fBendif\fR, if and only if the input string does \fBnot\fR # match \fIpattern\fR. The \fBif\fR..\fBendif\fR can nest. # .IP "blank lines and comments" # Empty lines and whitespace-only lines are ignored, as # are lines whose first non-whitespace character is a `#'. # .IP "multi-line text" # A logical line starts with non-whitespace text. A line that # starts with whitespace continues a logical line. # .PP # Each pattern is a perl-like regular expression. The expression # delimiter can be any character, except whitespace or characters # that have special meaning (traditionally the forward slash is used). # The regular expression can contain whitespace. # # By default, matching is case-insensitive, and newlines are not # treated as special characters. The behavior is controlled by flags, # which are toggled by appending one or more of the following # characters after the pattern: # .IP "\fBi\fR (default: on)" # Toggles the case sensitivity flag. By default, matching is case # insensitive. # .IP "\fBm\fR (default: off)" # Toggles the PCRE_MULTILINE flag. When this flag is on, the \fB^\fR # and \fB$\fR metacharacters match immediately after and immediately # before a newline character, respectively, in addition to # matching at the start and end of the subject string. # .IP "\fBs\fR (default: on)" # Toggles the PCRE_DOTALL flag. When this flag is on, the \fB.\fR # metacharacter matches the newline character. With # Postfix versions prior to 20020528, The flag is off by # default, which is inconvenient for multi-line message header # matching. # .IP "\fBx\fR (default: off)" # Toggles the pcre extended flag. When this flag is on, whitespace # in the pattern (other than in a character class) and # characters between a \fB#\fR outside a character class and # the next newline character are ignored. An escaping backslash # can be used to include a whitespace or \fB#\fR character # as part of the pattern. # .IP "\fBA\fR (default: off)" # Toggles the PCRE_ANCHORED flag. When this flag is on, # the pattern is forced to be "anchored", that is, it is # constrained to match only at the start of the string which # is being searched (the "subject string"). This effect can # also be achieved by appropriate constructs in the pattern # itself. # .IP "\fBE\fR (default: off)" # Toggles the PCRE_DOLLAR_ENDONLY flag. When this flag is on, # a \fB$\fR metacharacter in the pattern matches only at the # end of the subject string. Without this flag, a dollar also # matches immediately before the final character if it is a # newline character (but not before any other newline # characters). This flag is ignored if PCRE_MULTILINE # flag is set. # .IP "\fBU\fR (default: off)" # Toggles the ungreedy matching flag. When this flag is on, # the pattern matching engine inverts the "greediness" of # the quantifiers so that they are not greedy by default, # but become greedy if followed by "?". This flag can also # set by a (?U) modifier within the pattern. # .IP "\fBX\fR (default: off)" # Toggles the PCRE_EXTRA flag. # When this flag is on, any backslash in a pattern that is # followed by a letter that has no special meaning causes an # error, thus reserving these combinations for future expansion. # SEARCH ORDER # .ad # .fi # Patterns are applied in the order as specified in the table, until a # pattern is found that matches the input string. # # Each pattern is applied to the entire input string. # Depending on the application, that string is an entire client # hostname, an entire client IP address, or an entire mail address. # Thus, no parent domain or parent network search is done, and # \fIuser@domain\fR mail addresses are not broken up into their # \fIuser\fR and \fIdomain\fR constituent parts, nor is \fIuser+foo\fR # broken up into \fIuser\fR and \fIfoo\fR. # TEXT SUBSTITUTION # .ad # .fi # Substitution of substrings from the matched expression into the result # string is possible using the conventional perl syntax ($1, $2, etc.). # The macros in the result string may need to be written as ${n} # or $(n) if they aren't followed by whitespace. # # Note: since negated patterns (those preceded by \fB!\fR) return a # result when the expression does not match, substitutions are not # available for negated patterns. # EXAMPLE SMTPD ACCESS MAP # # Protect your outgoing majordomo exploders # /^(?!owner-)(.*)-outgoing@(.*)/ 550 Use ${1}@${2} instead # # # Bounce friend@whatever, except when whatever is our domain (you would # # be better just bouncing all friend@ mail - this is just an example). # /^(friend@(?!my\\.domain$).*)$/ 550 Stick this in your pipe $1 # # # A multi-line entry. The text is sent as one line. # # # /^noddy@my\\.domain$/ # \ 550 This user is a funny one. You really don't want to send mail to # \ them as it only makes their head spin. # EXAMPLE HEADER FILTER MAP # /^Subject: make money fast/ REJECT # /^To: friend@public\\.com/ REJECT # EXAMPLE BODY FILTER MAP # # First skip over base 64 encoded text to save CPU cycles. # # Requires PCRE version 3. # ~^[[:alnum:]+/]{60,}$~ OK # # # Put your own body patterns here. # SEE ALSO # postmap(1), Postfix lookup table manager # postconf(5), configuration parameters # regexp_table(5), format of POSIX regular expression tables # README FILES # .ad # .fi # Use "\fBpostconf readme_directory\fR" or # "\fBpostconf html_directory\fR" to locate this information. # .na # .nf # DATABASE_README, Postfix lookup table overview # AUTHOR(S) # The PCRE table lookup code was originally written by: # Andrew McNamara # andrewm@connect.com.au # connect.com.au Pty. Ltd. # Level 3, 213 Miller St # North Sydney, NSW, Australia # # Adopted and adapted by: # Wietse Venema # IBM T.J. Watson Research # P.O. Box 704 # Yorktown Heights, NY 10598, USA #--