#++
# NAME
#	header_checks 5
# SUMMARY
#	Postfix built-in content inspection
# SYNOPSIS
# .nf
#	\fBheader_checks = pcre:/etc/postfix/header_checks\fR
#	\fBmime_header_checks = pcre:/etc/postfix/mime_header_checks\fR
#	\fBnested_header_checks = pcre:/etc/postfix/nested_header_checks\fR
#	\fBbody_checks = pcre:/etc/postfix/body_checks\fR
# .sp
#	\fBmilter_header_checks = pcre:/etc/postfix/milter_header_checks\fR
# .sp
#	\fBsmtp_header_checks = pcre:/etc/postfix/smtp_header_checks\fR
#	\fBsmtp_mime_header_checks = pcre:/etc/postfix/smtp_mime_header_checks\fR
#	\fBsmtp_nested_header_checks = pcre:/etc/postfix/smtp_nested_header_checks\fR
#	\fBsmtp_body_checks = pcre:/etc/postfix/smtp_body_checks\fR
# .sp
#	\fBpostmap -q "\fIstring\fB" pcre:/etc/postfix/\fIfilename\fR
#	\fBpostmap -q - pcre:/etc/postfix/\fIfilename\fR <\fIinputfile\fR
# .fi
# DESCRIPTION
#	This document describes access control on the content of
#	message headers and message body lines; it is implemented
#	by the Postfix \fBcleanup\fR(8) server before mail is queued.
#	See \fBaccess\fR(5) for access control on remote SMTP client
#	information.
#
#	Each message header or message body line is compared against
#	a list of patterns.
#	When a match is found the corresponding action is executed, and
#	the matching process is repeated for the next message header or
#	message body line.
#
#	Note: message headers are examined one logical header at a time,
#	even when a message header spans multiple lines. Body lines are
#	always examined one line at a time.
#
#	For examples, see the EXAMPLES section at the end of this
#	manual page.
#
#	Postfix header or body_checks are designed to stop a flood of mail
#	from worms or viruses; they do not decode attachments, and they do
#	not unzip archives. See the documents referenced below in the README
#	FILES section if you need more sophisticated content analysis.
# FILTERS WHILE RECEIVING MAIL
# .ad
# .fi
#	Postfix implements the following four built-in content
#	inspection classes while receiving mail:
# .IP "\fBheader_checks\fR (default: empty)"
#	These are applied to initial message headers (except for
#	the headers that are processed with \fBmime_header_checks\fR).
# .IP "\fBmime_header_checks\fR (default: \fB$header_checks\fR)"
#	These are applied to MIME related message headers only.
# .sp
#	This feature is available in Postfix 2.0 and later.
# .IP "\fBnested_header_checks\fR (default: \fB$header_checks\fR)"
#	These are applied to message headers of attached email
#	messages (except for the headers that are processed with
#	\fBmime_header_checks\fR).
# .sp
#	This feature is available in Postfix 2.0 and later.
# .IP \fBbody_checks\fR
#	These are applied to all other content, including multi-part
#	message boundaries.
# .sp
#	With Postfix versions before 2.0, all content after the initial
#	message headers is treated as body content.
# FILTERS AFTER RECEIVING MAIL
# .ad
# .fi
#	Postfix supports a subset of the built-in content inspection
#	classes after the message is received:
# .IP "\fBmilter_header_checks\fR (default: empty)"
#	These are applied to headers that are added with Milter
#	applications.
# .sp
#	This feature is available in Postfix 2.7 and later.
# FILTERS WHILE DELIVERING MAIL
# .ad
# .fi
#	Postfix supports all four content inspection classes while
#	delivering mail via SMTP.
# .IP "\fBsmtp_header_checks\fR (default: empty)"
# .IP "\fBsmtp_mime_header_checks\fR (default: empty)"
# .IP "\fBsmtp_nested_header_checks\fR (default: empty)"
# .IP "\fBsmtp_body_checks\fR (default: empty)"
#	These features are available in Postfix 2.5 and later.
# COMPATIBILITY
# .ad
# .fi
#	With Postfix version 2.2 and earlier specify "\fBpostmap
#	-fq\fR" to query a table that contains case sensitive
#	patterns. By default, regexp: and pcre: patterns are case
#	insensitive.
# TABLE FORMAT
# .ad
# .fi
#	This document assumes that header and body_checks rules are specified
#	in the form of Postfix regular expression lookup tables. Usually the
#	best performance is obtained with \fBpcre\fR (Perl Compatible Regular
#	Expression) tables. The \fBregexp\fR (POSIX regular
#	expressions) tables are usually slower, but more widely
#	available.
#	Use the command "\fBpostconf -m\fR" to find out what lookup table
#	types your Postfix system supports.
#
#	The general format of Postfix regular expression tables is
#	given below.
#	For a discussion of specific pattern or flags syntax,
#	see \fBpcre_table\fR(5) or \fBregexp_table\fR(5), respectively.
# .IP "\fB/\fIpattern\fB/\fIflags action\fR"
#	When /\fIpattern\fR/ matches the input string, execute
#	the corresponding \fIaction\fR. See below for a list
#	of possible actions.
# .IP "\fB!/\fIpattern\fB/\fIflags action\fR"
#	When /\fIpattern\fR/ does \fBnot\fR match the input string,
#	execute the corresponding \fIaction\fR.
# .IP "\fBif /\fIpattern\fB/\fIflags\fR"
# .IP "\fBendif\fR"
#	If the input string matches /\fIpattern\fR/, then match that
#	input string against the patterns between \fBif\fR and
#	\fBendif\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"
#	If the input string does not match /\fIpattern\fR/, then
#	match that input string against the patterns between \fBif\fR
#	and \fBendif\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 pattern/action line starts with non-whitespace text. A line that
#	starts with whitespace continues a logical line.
# TABLE SEARCH ORDER
# .ad
# .fi
#	For each line of message input, the patterns are applied in the
#	order as specified in the table. When a pattern is found that matches
#	the input line, the corresponding action is executed and then the
#	next input line is inspected.
# TEXT SUBSTITUTION
# .ad
# .fi
#	Substitution of substrings from the matched expression into the
#	\fIaction\fR
#	string is possible using the conventional Perl syntax
#	(\fB$1\fR, \fB$2\fR, etc.).
#	The macros in the result string may need to be written as \fB${n}\fR
#	or \fB$(n)\fR 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.
# ACTIONS
# .ad
# .fi
#	Action names are case insensitive. They are shown in upper case
#	for consistency with other Postfix documentation.
# .IP "\fBBCC \fIuser@domain\fR"
#	Add the specified address as a BCC recipient, and inspect
#	the next input line. The address
#	must have a local part and domain part. The number of BCC
#	addresses that can be added is limited only by the amount
#	of available storage space.
#
#	Note 1: the BCC address is added as if it was specified with
#	NOTIFY=NONE. The sender will not be notified when the BCC
#	address is undeliverable, as long as all down-stream software
#	implements RFC 3461.
#
#	Note 2: this ignores duplicate addresses (with the same
#	delivery status notification options).
# .sp
#	This feature is available in Postfix 3.0 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# \" .IP "\fBDELAY \fItime\fR"
# \"	Place the message into the deferred queue, and delay the
# \"	initial delivery attempt by \fItime\fR. The time value may
# \"	be followed by a one-character suffix that specifies the
# \"	time unit: s (seconds), m (minutes), h (hours), d (days),
# \"	w (weeks).  The default time unit is s (seconds).
# \" .sp
# \"	Limitations:
# \" .RS
# \" .IP \(bu
# \"	This action affects all the recipients of the message.
# \" .IP \(bu
# \"	The delay value has no effect with remote file systems that
# \"	don't correctly emulate UNIX local file system semantics.
# \"	In that case, the delay will be half of $queue_run_delay
# \"	on average.
# \" .IP \(bu
# \"	Mail will still be delivered with "sendmail -q", "postfix
# \"	flush" or "postqueue -f".
# \" .IP \(bu
# \"	Delayed mail increases the amount of disk I/O during deferred
# \"	queue scans. When large amounts of mail are queued for
# \"	delayed delivery it may be preferable to use the HOLD feature
# \"	instead.
# \" .RE
# \" .IP
# \"	This feature is available in Postfix 2.3 and later.
# .IP "\fBDISCARD \fIoptional text...\fR"
#	Claim successful delivery and silently discard the message.
#	Do not inspect the remainder of the input message.
#	Log the optional text if specified, otherwise log a generic
#	message.
# .sp
#	Note: this action disables further header or body_checks inspection
#	of the current message and affects all recipients.
#	To discard only one recipient without discarding the entire message,
#	use the transport(5) table to direct mail to the discard(8) service.
# .sp
#	This feature is available in Postfix 2.0 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP \fBDUNNO\fR
#	Pretend that the input line did not match any pattern, and inspect the
#	next input line. This action can be used to shorten the table search.
# .sp
#	For backwards compatibility reasons, Postfix also accepts
#	\fBOK\fR but it is (and always has been) treated as \fBDUNNO\fR.
# .sp
#	This feature is available in Postfix 2.1 and later.
# .IP "\fBFILTER \fItransport:destination\fR"
#	Override the content_filter parameter setting, and inspect
#	the next input line.
#	After the message is queued, send the entire message through
#	the specified external content filter. The \fItransport\fR
#	name specifies the first field of a mail delivery agent
#	definition in master.cf; the syntax of the next-hop
#	\fIdestination\fR is described in the manual page of the
#	corresponding delivery agent.  More information about
#	external content filters is in the Postfix FILTER_README
#	file.
# .sp
#	Note 1: do not use $\fInumber\fR regular expression
#	substitutions for \fItransport\fR or \fIdestination\fR
#	unless you know that the information has a trusted origin.
# .sp
#	Note 2: this action overrides the main.cf \fBcontent_filter\fR
#	setting, and affects all recipients of the message. In the
#	case that multiple \fBFILTER\fR actions fire, only the last
#	one is executed.
# .sp
#	Note 3: the purpose of the FILTER command is to override
#	message routing.  To override the recipient's \fItransport\fR
#	but not the next-hop \fIdestination\fR, specify an empty
#	filter \fIdestination\fR (Postfix 2.7 and later), or specify
#	a \fItransport:destination\fR that delivers through a
#	different Postfix instance (Postfix 2.6 and earlier). Other
#	options are using the recipient-dependent \fBtrans\%port\%_maps\fR
#	or the sen\%der-dependent
#	\fBsender\%_de\%pen\%dent\%_de\%fault\%_trans\%port\%_maps\fR
#	features.
# .sp
#	This feature is available in Postfix 2.0 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP "\fBHOLD \fIoptional text...\fR"
#	Arrange for the message to be placed on the \fBhold\fR queue,
#	and inspect the next input line.  The message remains on \fBhold\fR
#	until someone either deletes it or releases it for delivery.
#	Log the optional text if specified, otherwise log a generic
#	message.
#
#	Mail that is placed on hold can be examined with the
#	\fBpostcat\fR(1) command, and can be destroyed or released with
#	the \fBpostsuper\fR(1) command.
# .sp
#	Note: use "\fBpostsuper -r\fR" to release mail that was kept on
#	hold for a significant fraction of \fB$maximal_queue_lifetime\fR
#	or \fB$bounce_queue_lifetime\fR, or longer. Use "\fBpostsuper -H\fR"
#	only for mail that will not expire within a few delivery attempts.
# .sp
#	Note: this action affects all recipients of the message.
# .sp
#	This feature is available in Postfix 2.0 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP \fBIGNORE\fR
#	Delete the current line from the input, and inspect
#	the next input line. See \fBSTRIP\fR for an alternative
#	that logs the action.
# .IP "\fBINFO \fIoptional text...\fR
#	Log an "info:" record with the \fIoptional text...\fR (or
#	log a generic text), and inspect the next input line. This
#	action is useful for routine logging or for debugging.
# .sp
#	This feature is available in Postfix 2.8 and later.
# .IP "\fBPASS \fIoptional text...\fR"
#	Log a "pass:" record with the \fIoptional text...\fR (or
#	log a generic text), and turn off header, body, and Milter
#	inspection for the remainder of this message.
# .sp
#	Note: this feature relies on trust in information that is
#	easy to forge.
# .sp
#	This feature is available in Postfix 3.2 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP "\fBPREPEND \fItext...\fR"
#	Prepend one line with the specified text, and inspect the next
#	input line.
# .sp
#	Notes: 
# .RS
# .IP \(bu
#	The prepended text is output on a separate line, immediately
#	before the input that triggered the \fBPREPEND\fR action.
# .IP \(bu
#	The prepended text is not considered part of the input
#	stream: it is not subject to header/body checks or address
#	rewriting, and it does not affect the way that Postfix adds
#	missing message headers.
# .IP \(bu
#	When prepending text before a message header line, the prepended
#	text must begin with a valid message header label.
# .IP \(bu
#	This action cannot be used to prepend multi-line text.
# .RE
# .IP
#	This feature is available in Postfix 2.1 and later.
# .sp
#	This feature is not supported with milter_header_checks.
# .IP "\fBREDIRECT \fIuser@domain\fR"
#	Write a message redirection request to the queue file, and
#	inspect the next input line. After the message is queued,
#	it will be sent to the specified address instead of the
#	intended recipient(s).
# .sp
#	Note 1: this action overrides the \fBFILTER\fR action, and affects
#	all recipients of the message. If multiple \fBREDIRECT\fR actions
#	fire, only the last one is executed.
# .sp
#	Note 2: a REDIRECT address is subject to canonicalization
#	(add missing domain) but NOT subject to canonical, masquerade,
#	bcc, or virtual alias mapping.
# .sp
#	This feature is available in Postfix 2.1 and later.
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP "\fBREPLACE \fItext...\fR"
#	Replace the current line with the specified text, and inspect the next
#	input line.
# .sp
#	This feature is available in Postfix 2.2 and later. The
#	description below applies to Postfix 2.2.2 and later.
# .sp
#	Notes: 
# .RS
# .IP \(bu
#	When replacing a message header line, the replacement text
#	must begin with a valid header label.
# .IP \(bu
#	The replaced text remains part of the input stream. Unlike
#	the result from the \fBPREPEND\fR action, a replaced message
#	header may be subject to address rewriting and may affect
#	the way that Postfix adds missing message headers.
# .RE
# .IP "\fBREJECT \fIoptional text...\fR
#	Reject the entire message. Do not inspect the remainder of
#	the input message.  Reply with \fIoptional text...\fR when
#	the optional text is specified, otherwise reply with a
#	generic error message.
# .sp
#	Note: this action disables further header or body_checks inspection
#	of the current message and affects all recipients.
# .sp
#	Postfix version 2.3 and later support enhanced status codes.
#	When no code is specified at the beginning of \fIoptional
#	text...\fR, Postfix inserts a default enhanced status code of
#	"5.7.1".
# .sp
#	This feature is not supported with smtp header/body checks.
# .IP "\fBSTRIP \fIoptional text...\fR"
#	Log a "strip:" record with the \fIoptional text...\fR (or
#	log a generic text), delete the input line from the input,
#	and inspect the next input line. See \fBIGNORE\fR for a
#	silent alternative.
# .sp
#	This feature is available in Postfix 3.2 and later.
# .IP "\fBWARN \fIoptional text...\fR
#	Log a "warning:" record with the \fIoptional text...\fR (or
#	log a generic text), and inspect the next input line. This
#	action is useful for debugging and for testing a pattern
#	before applying more drastic actions.
# BUGS
#	Empty lines never match, because some map types mis-behave
#	when given a zero-length search string.  This limitation may
#	be removed for regular expression tables in a future release.
#
#	Many people overlook the main limitations of header and body_checks
#	rules.
# .IP \(bu
#	These rules operate on one logical message header or one body
#	line at a time. A decision made for one line is not carried over
#	to the next line.
# .IP \(bu
#	If text in the message body is encoded
#	(RFC 2045) then the rules need to be specified for the encoded
#	form.
# .IP \(bu
#	Likewise, when message headers are encoded (RFC
#	2047) then the rules need to be specified for the encoded
#	form.
# .PP
#	Message headers added by the \fBcleanup\fR(8) daemon itself
#	are excluded from inspection. Examples of such message headers
#	are \fBFrom:\fR, \fBTo:\fR, \fBMessage-ID:\fR, \fBDate:\fR.
#
#	Message headers deleted by the \fBcleanup\fR(8) daemon will
#	be examined before they are deleted. Examples are: \fBBcc:\fR,
#	\fBContent-Length:\fR, \fBReturn-Path:\fR.
# CONFIGURATION PARAMETERS
# .ad
# .fi
# .IP "\fBbody_checks (empty)\fR"
#	Optional lookup tables for content inspection as specified in
#	the \fBbody_checks\fR(5) manual page.
# .IP "\fBbody_checks_size_limit (51200)\fR"
#	How much text in a message body segment (or attachment, if you
#	prefer to use that term) is subjected to body_checks inspection.
# .IP "\fBheader_checks (empty)\fR"
#	Optional lookup tables for content inspection of primary non-MIME
#	message headers, as specified in the \fBheader_checks\fR(5) manual page.
# .IP "\fBmime_header_checks ($header_checks)\fR"
#	Optional lookup tables for content inspection of MIME related
#	message headers, as described in the \fBheader_checks\fR(5) manual page.
# .IP "\fBnested_header_checks ($header_checks)\fR"
#	Optional lookup tables for content inspection of non-MIME message
#	headers in attached messages, as described in the \fBheader_checks\fR(5)
#	manual page.
# .IP "\fBdisable_mime_input_processing (no)\fR"
#	Turn off MIME processing while receiving mail.
# EXAMPLES
# .ad
# .fi
#	Header pattern to block attachments with bad file name
#	extensions.  For convenience, the PCRE /x flag is specified,
#	so that there is no need to collapse the pattern into a
#	single line of text.  The purpose of the [[:xdigit:]]
#	sub-expressions is to recognize Windows CLSID strings.
#
# .na
# .nf
#	/etc/postfix/main.cf:
#	    header_checks = pcre:/etc/postfix/header_checks.pcre
#
#	/etc/postfix/header_checks.pcre:
#	    /^Content-(Disposition|Type).*name\es*=\es*"?([^;]*(\e.|=2E)(
#	      ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe|
#	      hlp|ht[at]|
#	      inf|ins|isp|jse?|lnk|md[betw]|ms[cipt]|nws|
#	      \e{[[:xdigit:]]{8}(?:-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\e}|
#	      ops|pcd|pif|prf|reg|sc[frt]|sh[bsm]|swf|
#	      vb[esx]?|vxd|ws[cfh]))(\e?=)?"?\es*(;|$)/x
#	        REJECT Attachment name "$2" may not end with ".$4"
# .ad
# .fi
#
#	Body pattern to stop a specific HTML browser vulnerability exploit.
#
# .na
# .nf
#	/etc/postfix/main.cf:
#	    body_checks = regexp:/etc/postfix/body_checks
#
#	/etc/postfix/body_checks:
#	    /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
#	        REJECT IFRAME vulnerability exploit
# SEE ALSO
#	cleanup(8), canonicalize and enqueue Postfix message
#	pcre_table(5), format of PCRE lookup tables
#	regexp_table(5), format of POSIX regular expression tables
#	postconf(1), Postfix configuration utility
#	postmap(1), Postfix lookup table management
#	postsuper(1), Postfix janitor
#	postcat(1), show Postfix queue file contents
#	RFC 2045, base64 and quoted-printable encoding rules
#	RFC 2047, message header encoding for non-ASCII text
# 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
#	CONTENT_INSPECTION_README, Postfix content inspection overview
#	BUILTIN_FILTER_README, Postfix built-in content inspection
#	BACKSCATTER_README, blocking returned forged mail
# LICENSE
# .ad
# .fi
#	The Secure Mailer license must be distributed with this software.
# AUTHOR(S)
#	Wietse Venema
#	IBM T.J. Watson Research
#	P.O. Box 704
#	Yorktown Heights, NY 10598, USA
#
#	Wietse Venema
#	Google, Inc.
#	111 8th Avenue
#	New York, NY 10011, USA
#--
