Currently, nothing in Postfix uses this functionality.
File: global/dict_proxy.c.
+20070325
+
+ Bugfix: postfix-install didn't work for symlink or hardlink
+ targets, when the parent directory had a value of "no".
+
+20070326
+
+ Workaround: Eric Raymond's man page formatters don't handle
+ low-level *roff .in or .ti controls. We now use .nf and .fi
+ instead. Files: many.
+
Wish list:
+ Remove defer(8) and trace(8) references and man pages. These
+ are services not program names.
+
Bind all deliveries to the same local delivery process,
making Postfix perform as poorly as monolithic mailers,
but giving a possibility to eliminate duplicate deliveries.
Need scache size limit.
- Don't transform bare username into user@localdomain.localdomain
- when no domain is specified via main.cf or via the machine
- hostname.
-
Update BACKSCATTER_README to use PCRE because that's what I
am using now.
- Update MILTER_README with Martinec info.
- http://www.ijs.si/software/amavisd/amavisd-new-docs.html#dkim
-
Make postcat header/body aware so people can grep headers.
Make postmap header/body aware so people can test multi-line
playing with the soft_error test in the smtp_trouble.c
module, and avoiding delivery to backup MX hosts.
- select -> kqueue, epoll, /dev/poll, poll() ...
-
In the SMTP server, set a "pipelining detected" flag at the
start of a session and at protocol synchronization points,
so that reject_unauth_pipelining can be specified in any
Privacy: remove local command/pathname details from remote
delivery status reports, and log them via local msg_warn().
- Remove defer(8) and trace(8) references and man pages. These
- are services not program names.
-
Is it safe to cache a connection after it has been used for
more than some number of address verification probes?
O\bOv\bve\ber\brv\bvi\bie\bew\bw
-This document describes features that require Postfix version 2.0 or later.
+This document describes features that require Postfix version 2.0 or later. The
+examples use Perl Compatible Regular Expressions (Postfix pcre: tables), but
+also provide a translation to POSIX regular expressions (Postfix regexp:
+tables). PCRE is preferred primarily because the implementation is often
+faster.
Topics covered in this document:
this:
/etc/postfix/main.cf:
- header_checks = regexp:/etc/postfix/header_checks
- body_checks = regexp:/etc/postfix/body_checks
+ header_checks = pcre:/etc/postfix/header_checks
+ body_checks = pcre:/etc/postfix/body_checks
/etc/postfix/header_checks:
if /^Received:/
/^Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)
(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^Message-ID:.* <!&!/ DUNNO
/^[> ]*Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)
(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^[> ]*Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^[> ]*Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^[> ]*Message-ID:.* <!&!/ DUNNO
Notes:
+ * The example uses pcre: tables mainly for speed; with minor modifications,
+ you can use regexp: tables as explained below.
+
* The example is simplified for educational purposes. In reality my patterns
list multiple domain names, as "(domain|domain|...)".
* The "\(" and "\)" match "(" and ")" literally. Without the "\", the "(" and
")" would be grouping operators.
- * The "[[:>:]]" matches the end of a word. On some systems you should specify
- "\>" instead. For details see your system documentation.
+ * The "\b" is used here to match the end of a word. If you use regexp:
+ tables, specify "[[:>:]]" (on some systems you should specify "\>" instead;
+ for details see your system documentation).
* The "if /pattern/" and "endif" eliminate unnecessary matching attempts. DO
NOT indent lines starting with /pattern/ between the "if" and "endif"!
mail is obviously forged and is very easy to stop.
/etc/postfix/main.cf:
- header_checks = regexp:/etc/postfix/header_checks
- body_checks = regexp:/etc/postfix/body_checks
+ header_checks = pcre:/etc/postfix/header_checks
+ body_checks = pcre:/etc/postfix/body_checks
/etc/postfix/header_checks:
- /^(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
/etc/postfix/body_checks:
- /^[> ]*(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^[> ]*(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
Notes:
+ * The example uses pcre: tables mainly for speed; with minor modifications,
+ you can use regexp: tables as explained below.
+
* The example is simplified for educational purposes. In reality, my patterns
list multiple email addresses as "(user1@domain1\.tld|user2@domain2\.tld)".
- * The "[[:<:]]" and "[[:>:]]" match the beginning and end of a word,
- respectively. On some systems you should specify "\<" and "\>" instead. For
- details see your system documentation.
+ * The two "\b" as used in "\b(user@domain\.tld)\b" match the beginning and
+ end of a word, respectively. If you use regexp: tables, specify "[[:<:]]
+ and [[:>:]]" (on some systems you should specify "\< and \>" instead; for
+ details see your system documentation).
* The "\." matches "." literally. Without the "\", the "." would match any
character.
Linux RedHat 3.x (January 2004) - 9.x
Linux Slackware 3.x, 4.x, 7.x
Linux SuSE 5.x, 6.x, 7.x
+ Linux Ubuntu 4.10..7.04
Mac OS X
NEXTSTEP 3.x
NetBSD 1.x
* This was tested with sid-milter-0.2.10 and sid-milter-0.2.14.
- * This fixes only the ugly message header, but not the WARNING message.
- Fortunately, sid-milter logs that message only once.
-
To fix the ugly message header with other Milter applications, you will need to
do something like this:
Network -> smtpd(8) <-> anvil(8)
- * The bounce(8), defer(8) and trace(8) servers each maintain their own queue
- directory trees with per-message logfiles. This information is used to send
- delivery or non-delivery notifications to the sender.
+ * The bounce(8), defer(8) and trace(8) services each maintain their own queue
+ directory trees with per-message logfiles. Postfix uses this information
+ when sending "failed", "delayed" or "success" delivery status notifications
+ to the sender.
- The trace(8) service implements support for the Postfix "sendmail -bv" and
- "sendmail -v" commands which produce reports about how Postfix delivers
+ The trace(8) service also implements support for the Postfix "sendmail -bv"
+ and "sendmail -v" commands which produce reports about how Postfix delivers
mail, and is available with Postfix version 2.1 and later. See DEBUG_README
for examples.
-The stable Postfix release is called postfix-2.3.x where 2=major
-release number, 3=minor release number, x=patchlevel. The stable
+The stable Postfix release is called postfix-2.4.x where 2=major
+release number, 4=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called
-postfix-2.4-yyyymmdd where yyyymmdd is the release date (yyyy=year,
+postfix-2.5-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
-Incompatibility with Postfix 2.2 and earlier
+Incompatibility with Postfix 2.3 and earlier
============================================
-If you upgrade from Postfix 2.2 or earlier, read RELEASE_NOTES-2.3
+If you upgrade from Postfix 2.3 or earlier, read RELEASE_NOTES-2.4
before proceeding.
-
-Incompatibility with Postfix snapshot 200702224
-===============================================
-
-As a safety measure, Postfix now by default creates mailbox dotlock
-files on all systems. This prevents problems with GNU POP3D which
-subverts kernel locking by creating a new mailbox file and deleting
-the old one.
-
-Major changes with Postfix snapshot 20070212-event
-==================================================
-
-Better support for systems that run thousands of Postfix processes.
-Postfix now supports FreeBSD kqueue(2), Solaris poll(7d) and Linux
-epoll(4) as more scalable alternatives to the traditional select(2)
-system call, and uses poll(2) when examining a single file descriptor
-for readability or writability. These features are supported on
-sufficiently recent versions of FreeBSD, NetBSD, OpenBSD, Solaris
-and Linux; support for other systems will be added as evidence
-becomes available that usable implementations exist.
-
-Incompatibility with Postfix snapshot 20070201
-==============================================
-
-Some default settings have been adjusted to better match contemporary
-requirements:
-
-- queue_run_delay and minimal_backoff_time were reduced from 1000s
-to 300s so that deliveries are retried earlier after the first
-failure.
-
-- ipc_idle was reduced from 100s to 5s, so that tlsmgr and scache
-clients will more quickly release unused file handles.
-
-Major changes with Postfix snapshot 20070121
-============================================
-
-The support for Milter header modification requests was revised.
-With minimal change in the on-disk representation, the code was
-greatly simplified, and regression tests were updated to ensure
-that old errors were not re-introduced. The queue file format is
-entirely backwards compatible with Postfix 2.3.
-
-Incompatible changes with Postfix snapshot 20070116
-===================================================
-
-A new field is added to the queue file "size" record that specifies
-the message content length. Postfix 2.3 and older Postfix 2.4
-versions will ignore this field, and will report the message size
-as it was before the body was replaced.
-
-Major changes with Postfix snapshot 20070116
-============================================
-
-Support for Milter requests to replace the message body. Postfix
-now implements all the header/body modification requests that are
-available with Sendmail 8.13.
-
-Incompatible changes with Postfix snapshot 20061217
-===================================================
-
-Postfix no longer requires a domain name. It uses "localdomain" as
-the default Internet domain name when no domain is specified via
-main.cf or via the machine's hostname.
-
-Major changes with Postfix snapshot 20061217
-============================================
-
-More precise queue flushing with the ETRN, "postqueue -s site", and
-"sendmail -qRsite" commands, after minimization of race conditions.
-New per-queue-file flushing with "postqueue -i queueid" and "sendmail
--qIqueueid".
-
-Incompatible changes with Postfix snapshot 20061214
-===================================================
-
-The check_smtpd_policy client sends TLS certificate attributes
-(client ccert_subject, ccert_issuer) only after successful client
-certificate verification. The reason is that the certification
-verification status itself is not available in the policy request.
-
-The check_smtpd_policy client sends TLS certificate fingerprint
-information even when the certificate itself was not verified.
-
-The remote SMTP client TLS certificate fingerprint can be used for
-access control even when the certificate itself was not verified.
-
-Incompatible changes with Postfix snapshot 20061209
-===================================================
-
-The Postfix installation procedure no longer updates main.cf with
-"unknown_local_recipient_reject_code = 450". Four years after the
-introduction of mandatory recipient validation, this transitional
-tool is no longer neeed.
-
-After upgrading Postfix you MUST execute "postfix reload", otherwise
-the queue manager may log a warnings with:
-
- warning: connect to transport retry: Connection refused
-
-The upgrade procedure adds a new "retry" service to the master.cf
-file. If you make the mistake of copying old Postfix configuration
-files over the new files, the queue manager may log warnings with:
-
- warning: connect to transport retry: Connection refused
-
-To fix your master.cf file, use "postfix upgrade-configuration"
-followed by "postfix reload".
-
-Small changes were made to the default bounce message templates,
-to prevent HTML-aware software from hiding or removing the text
-"<postmaster>", and producing misleading text.
-
-Major changes with Postfix snapshot 20061209
-============================================
-
-Better interoperability with non-conforming SMTP servers that reply
-and disconnect before Postfix has sent the complete message content.
-
-Improved worst-case (old and new) queue manager performance when
-deferring or bouncing large amounts of mail. Instead of talking to
-the bounce or defer service synchronously, this work is now done
-in the background by the error or retry service.
-
-Improved worst-case (new) queue manager performance when delivering
-multi-recipient mail. The queue manager now proactively reads
-recipients from the queue file, instead of waiting for the slowest
-deliveries to complete before reading in new recipients. This
-introduces two parameters: default_recipient_refill_limit (how many
-recipient slots to refill at a time) and default_recipient_refill_delay
-(how long to wait between refill operations). These two parameters
-act as defaults for optional per-transport settings.
-
-Better support for queue file systems on file servers with drifting
-clocks. Clock skew can be a problem, because Postfix does not deliver
-mail until the local clock catches up with the queue file's last
-modification time stamp. On systems with usable futimes() or
-equivalent (Solaris, *BSD, MacOS, but not Linux), Postfix now always
-explicitly sets the queue file last modification time stamps while
-creating a queue file. On systems without usable futimes() (Linux,
-and ancient versions of Solaris, SunOS and *BSD) Postfix keeps using
-the slower utime() system call to update queue file time stamps
-when the file system clock is off with respect to the local system
-clock, and logs a warning.
-
-Incompatible changes with Postfix snapshot 20061006
-===================================================
-
-The format of SMTP server TLS session cache lookup keys has changed.
-The lookup key now includes the master.cf service name.
-
-Major changes with Postfix snapshot 20061006
-============================================
-
-Individual CISCO PIX bug workarounds are now on/off configurable.
-This introduces new parameters: smtp_pix_workarounds (default:
-disable_esmtp, delay_dotcrlf) and smtp_pix_workaround_maps (workarounds
-indexed by server IP address). The default settings are backwards
-compatible.
-
-Incompatible changes with Postfix snapshot 20060806
-===================================================
-
-Postfix no longer announces its name in delivery status notifications.
-Users believe that Wietse provides a free help desk service that
-solves all their email problems.
--- /dev/null
+The stable Postfix release is called postfix-2.4.x where 2=major
+release number, 4=minor release number, x=patchlevel. The stable
+release never changes except for patches that address bugs or
+emergencies. Patches change the patchlevel and the release date.
+
+New features are developed in snapshot releases. These are called
+postfix-2.5-yyyymmdd where yyyymmdd is the release date (yyyy=year,
+mm=month, dd=day). Patches are never issued for snapshot releases;
+instead, a new snapshot is released.
+
+The mail_release_date configuration parameter (format: yyyymmdd)
+specifies the release date of a stable release or snapshot release.
+
+Major changes - critical
+------------------------
+
+See RELEASE_NOTES-2.3 if you upgrade from Postfix 2.2 or earlier.
+
+[Incompat 20070122] To take advantage of the new support for BSD
+kqueue, Linux epoll, or Solaris /dev/poll, you must restart (not
+reload) Postfix after upgrading from Postfix 2.3.
+
+[Incompat 20061209] If you upgrade Postfix without restarting, you
+MUST execute "postfix reload", otherwise the queue manager may log
+a warnings with:
+
+ warning: connect to transport retry: Connection refused
+
+[Incompat 20061209] The upgrade procedure adds a new "retry" service
+to the master.cf file. If you make the mistake of copying old
+Postfix configuration files over the new files, the queue manager
+may log warnings with:
+
+ warning: connect to transport retry: Connection refused
+
+To fix your master.cf file, use "postfix upgrade-configuration"
+followed by "postfix reload".
+
+Major changes - safety
+----------------------
+
+[Incompat 20070222] As a safety measure, Postfix now by default
+creates mailbox dotlock files on all systems. This prevents problems
+with GNU POP3D which subverts kernel locking by creating a new
+mailbox file and deleting the old one.
+
+Major changes - Milter support
+------------------------------
+
+[Feature 20070121] The support for Milter header modification
+requests was revised. With minimal change in the on-disk representation,
+the code was greatly simplified, and regression tests were updated
+to ensure that old errors were not re-introduced. The queue file
+format is entirely backwards compatible with Postfix 2.3.
+
+[Feature 20070116] Support for Milter requests to replace the message
+body. Postfix now implements all the header/body modification
+requests that are available with Sendmail 8.13.
+
+[Incompat 20070116] A new field is added to the queue file "size"
+record that specifies the message content length. Postfix 2.3 and
+older Postfix 2.4 snapshots will ignore this field, and will report
+the message size as it was before the body was replaced.
+
+Major changes - TLS support
+---------------------------
+
+[Incompat 20061214] The check_smtpd_policy client sends TLS certificate
+attributes (client ccert_subject, ccert_issuer) only after successful
+client certificate verification. The reason is that the certification
+verification status itself is not available in the policy request.
+
+[Incompat 20061214] The check_smtpd_policy client sends TLS certificate
+fingerprint information even when the certificate itself was not
+verified.
+
+[Incompat 20061214] The remote SMTP client TLS certificate fingerprint
+can be used for access control even when the certificate itself was
+not verified.
+
+[Incompat 20061006] The format of SMTP server TLS session cache
+lookup keys has changed. The lookup key now includes the master.cf
+service name.
+
+Major changes - performance
+---------------------------
+
+[Feature 20070212] Better support for systems that run thousands
+of Postfix processes. Postfix now supports FreeBSD kqueue(2),
+Solaris poll(7d) and Linux epoll(4) as more scalable alternatives
+to the traditional select(2) system call, and uses poll(2) when
+examining a single file descriptor for readability or writability.
+These features are supported on sufficiently recent versions of
+FreeBSD, NetBSD, OpenBSD, Solaris and Linux; support for other
+systems will be added as evidence becomes available that usable
+implementations exist.
+
+[Incompat 20070201] Some default settings have been adjusted to
+better match contemporary requirements:
+
+- queue_run_delay and minimal_backoff_time were reduced from 1000s
+ to 300s so that deliveries are retried earlier after the first
+ failure.
+
+- ipc_idle was reduced from 100s to 5s, so that tlsmgr and scache
+ clients will more quickly release unused file handles.
+
+[Feature 20061209] Improved worst-case (old and new) queue manager
+performance when deferring or bouncing large amounts of mail. Instead
+of talking to the bounce or defer service synchronously, this work
+is now done in the background by the error or retry service.
+
+[Feature 20061209] Improved worst-case (new) queue manager performance
+when delivering multi-recipient mail. The queue manager now proactively
+reads recipients from the queue file, instead of waiting for the
+slowest deliveries to complete before reading in new recipients.
+This introduces two parameters: default_recipient_refill_limit (how
+many recipient slots to refill at a time) and
+default_recipient_refill_delay (how long to wait between refill
+operations). These two parameters act as defaults for optional
+per-transport settings.
+
+Major changes - delivery status notifications
+---------------------------------------------
+
+[Incompat 20061209] Small changes were made to the default bounce
+message templates, to prevent HTML-aware software from hiding or
+removing the text "<postmaster>", and producing misleading text.
+
+[Incompat 20060806] Postfix no longer announces its name in delivery
+status notifications. Users believe that Wietse provides a free
+help desk service that solves all their email problems.
+
+Major changes - ETRN support
+----------------------------
+
+[Feature 20061217] More precise queue flushing with the ETRN,
+"postqueue -s site", and "sendmail -qRsite" commands, after
+minimization of race conditions. New per-queue-file flushing with
+"postqueue -i queueid" and "sendmail -qIqueueid".
+
+Major changes - small office/home office support
+------------------------------------------------
+
+[Incompat 20061217] Postfix no longer requires a domain name. It
+uses "localdomain" as the default Internet domain name when no
+domain is specified via main.cf or via the machine's hostname.
+
+Major changes - SMTP access control
+-----------------------------------
+
+[Incompat 20061214] The check_smtpd_policy client sends TLS certificate
+attributes (client ccert_subject, ccert_issuer) only after successful
+client certificate verification. The reason is that the certification
+verification status itself is not available in the policy request.
+
+[Incompat 20061214] The check_smtpd_policy client sends TLS certificate
+fingerprint information even when the certificate itself was not
+verified.
+
+[Incompat 20061214] The remote SMTP client TLS certificate fingerprint
+can be used for
+access control even when the certificate itself was not verified.
+
+[Incompat 20061209] The Postfix installation procedure no longer
+updates main.cf with "unknown_local_recipient_reject_code = 450".
+Four years after the introduction of mandatory recipient validation,
+this transitional tool is no longer neeed.
+
+Major changes - workarounds
+---------------------------
+
+[Incompat 20070222] As a safety measure, Postfix now by default
+creates mailbox dotlock files on all systems. This prevents problems
+with GNU POP3D which subverts kernel locking by creating a new
+mailbox file and deleting the old one.
+
+[Feature 20061209] Better interoperability with non-conforming SMTP
+servers that reply and disconnect before Postfix has sent the
+complete message content.
+
+[Feature 20061209] Better support for queue file systems on file
+servers with drifting clocks. Clock skew can be a problem, because
+Postfix does not deliver mail until the local clock catches up with
+the queue file's last modification time stamp. On systems with
+usable futimes() or equivalent (Solaris, *BSD, MacOS, but not Linux),
+Postfix now always explicitly sets the queue file last modification
+time stamps while creating a queue file. On systems without usable
+futimes() (Linux, and ancient versions of Solaris, SunOS and *BSD)
+Postfix keeps using the slower utime() system call to update queue
+file time stamps when the file system clock is off with respect to
+the local system clock, and logs a warning.
+
+[Feature 20061006] Individual CISCO PIX bug workarounds are now
+on/off configurable. This introduces new parameters: smtp_pix_workarounds
+(default: disable_esmtp, delay_dotcrlf) and smtp_pix_workaround_maps
+(workarounds indexed by server IP address). The default settings
+are backwards compatible.
# 1.2.3 REJECT
# 1.2.3.4 OK
#
-# Execute the command "postmap /etc/postfix/access" after
+# Execute the command "postmap /etc/postfix/access" after
# editing the file.
#
# BUGS
-# The table format does not understand quoting conventions.
+# The table format does not understand quoting conventions.
#
# SEE ALSO
# postmap(1), Postfix lookup table manager
# transport(5), transport:nexthop syntax
#
# README FILES
-# Use "postconf readme_directory" or "postconf html_direc-
+# Use "postconf readme_directory" or "postconf html_direc-
# tory" to locate this information.
# SMTPD_ACCESS_README, built-in SMTP server access control
# DATABASE_README, Postfix lookup table overview
#
# LICENSE
-# The Secure Mailer license must be distributed with this
+# The Secure Mailer license must be distributed with this
# software.
#
# AUTHOR(S)
# applied to recipient addresses, the Postfix SMTP
# server accepts mail for any recipient in domain,
# regardless of whether that recipient exists. This
-# may turn your mail system into a backscatter source
-# that returns undeliverable spam to innocent people.
+# may turn your mail system into a backscatter
+# source: Postfix first accepts mail for non-existent
+# recipients and then tries to return that mail as
+# "undeliverable" to the often forged sender address.
#
# RESULT ADDRESS REWRITING
# The lookup result is subject to address rewriting:
# that the ISP supports "+" style address extensions).
#
# /etc/postfix/main.cf:
-# smtp_generic_maps = hash:/etc/postfix/generic
+# smtp_generic_maps = hash:/etc/postfix/generic
#
# /etc/postfix/generic:
-# his@localdomain.local hisaccount@hisisp.example
-# her@localdomain.local heraccount@herisp.example
-# @localdomain.local hisaccount+local@hisisp.example
+# his@localdomain.local hisaccount@hisisp.example
+# her@localdomain.local heraccount@herisp.example
+# @localdomain.local hisaccount+local@hisisp.example
#
# Execute the command "postmap /etc/postfix/generic" when-
# ever the table is changed. Instead of hash, some systems
# time, even when a message header spans multiple lines.
# Body lines are always examined one line at a time.
#
+# COMPATIBILITY
+# With Postfix version 2.2 and earlier specify "postmap -fq"
+# to query a table that contains case sensitive patterns. By
+# default, regexp: and pcre: patterns are case insensitive.
+#
# TABLE FORMAT
-# 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
+# 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 pcre (Perl Compatible Regular Expression) tables, but
-# the slower regexp (POSIX regular expressions) support is
-# more widely available. Use the command "postconf -m" to
-# find out what lookup table types your Postfix system sup-
+# the slower regexp (POSIX regular expressions) support is
+# more widely available. Use the command "postconf -m" to
+# find out what lookup table types your Postfix system sup-
# ports.
#
# The general format of Postfix regular expression tables is
-# given below. For a discussion of specific pattern or
-# flags syntax, see pcre_table(5) or regexp_table(5),
+# given below. For a discussion of specific pattern or
+# flags syntax, see pcre_table(5) or regexp_table(5),
# respectively.
#
# /pattern/flags action
-# When pattern matches the input string, execute the
-# corresponding action. See below for a list of pos-
+# When pattern matches the input string, execute the
+# corresponding action. See below for a list of pos-
# sible actions.
#
# !/pattern/flags action
-# When pattern does not match the input string, exe-
+# When pattern does not match the input string, exe-
# cute the corresponding action.
#
# if /pattern/flags
#
# endif Match the input string against the patterns between
-# if and endif, if and only if the same input string
+# if and endif, if and only if the same input string
# also matches pattern. The if..endif can nest.
#
-# Note: do not prepend whitespace to patterns inside
+# Note: do not prepend whitespace to patterns inside
# if..endif.
#
# if !/pattern/flags
#
# endif Match the input string against the patterns between
-# if and endif, if and only if the same input string
+# if and endif, if and only if the same input string
# does not match pattern. The if..endif can nest.
#
# blank lines and comments
-# Empty lines and whitespace-only lines are ignored,
-# as are lines whose first non-whitespace character
+# Empty lines and whitespace-only lines are ignored,
+# as are lines whose first non-whitespace character
# is a `#'.
#
# multi-line text
-# A pattern/action line starts with non-whitespace
-# text. A line that starts with whitespace continues
+# A pattern/action line starts with non-whitespace
+# text. A line that starts with whitespace continues
# a logical line.
#
# TABLE SEARCH ORDER
-# 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
+# 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
-# Substitution of substrings from the matched expression
-# into the action 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
+# Substitution of substrings from the matched expression
+# into the action 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 !) return
+# Note: since negated patterns (those preceded by !) return
# a result when the expression does not match, substitutions
# are not available for negated patterns.
#
# case for consistency with other Postfix documentation.
#
# DISCARD optional text...
-# Claim successful delivery and silently discard the
-# message. Log the optional text if specified, oth-
+# Claim successful delivery and silently discard the
+# message. Log the optional text if specified, oth-
# erwise log a generic message.
#
-# Note: this action disables further header or
-# body_checks inspection of the current message and
+# Note: this action disables further header or
+# body_checks inspection of the current message and
# affects all recipients. To discard only one recip-
# ient without discarding the entire message, use the
# transport(5) table to direct mail to the discard(8)
#
# This feature is available in Postfix 2.0 and later.
#
-# DUNNO Pretend that the input line did not match any pat-
-# tern, and inspect the next input line. This action
+# DUNNO Pretend that the input line did not match any pat-
+# tern, and inspect the next input line. This action
# can be used to shorten the table search.
#
-# For backwards compatibility reasons, Postfix also
-# accepts OK but it is (and always has been) treated
+# For backwards compatibility reasons, Postfix also
+# accepts OK but it is (and always has been) treated
# as DUNNO.
#
# This feature is available in Postfix 2.1 and later.
#
# FILTER transport:destination
-# Write a content filter request to the queue file,
-# and inspect the next input line. After the com-
-# plete message is received it will be sent through
+# Write a content filter request to the queue file,
+# and inspect the next input line. After the com-
+# plete message is received it will be sent through
# the specified external content filter. More infor-
-# mation about external content filters is in the
+# mation about external content filters is in the
# Postfix FILTER_README file.
#
# Note: this action overrides the content_filter set-
# ting, and affects all recipients of the message. In
-# the case that multiple FILTER actions fire, only
+# the case that multiple FILTER actions fire, only
# the last one is executed.
#
# This feature is available in Postfix 2.0 and later.
#
# HOLD optional text...
-# Arrange for the message to be placed on the hold
-# queue, and inspect the next input line. The mes-
-# sage remains on hold until someone either deletes
-# it or releases it for delivery. Log the optional
+# Arrange for the message to be placed on the hold
+# queue, and inspect the next input line. The mes-
+# sage remains on hold 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 postcat(1) command, and can be destroyed or
+# Mail that is placed on hold can be examined with
+# the postcat(1) command, and can be destroyed or
# released with the postsuper(1) command.
#
-# Note: use "postsuper -r" to release mail that was
-# kept on hold for a significant fraction of $maxi-
+# Note: use "postsuper -r" to release mail that was
+# kept on hold for a significant fraction of $maxi-
# mal_queue_lifetime or $bounce_queue_lifetime, or
-# longer. Use "postsuper -H" only for mail that will
+# longer. Use "postsuper -H" only for mail that will
# not expire within a few delivery attempts.
#
-# Note: this action affects all recipients of the
+# Note: this action affects all recipients of the
# message.
#
# This feature is available in Postfix 2.0 and later.
# the next input line.
#
# PREPEND text...
-# Prepend one line with the specified text, and
+# Prepend one line with the specified text, and
# inspect the next input line.
#
# Notes:
#
-# o The prepended text is output on a separate
+# o The prepended text is output on a separate
# line, immediately before the input that
# triggered the PREPEND action.
#
# o The prepended text is not considered part of
-# the input stream: it is not subject to
+# 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.
#
# o When prepending text before a message header
-# line, the prepended text must begin with a
+# line, the prepended text must begin with a
# valid message header label.
#
# o This action cannot be used to prepend multi-
# This feature is available in Postfix 2.1 and later.
#
# REDIRECT user@domain
-# Write a message redirection request to the queue
-# file, and inspect the next input line. After the
+# 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).
#
-# Note: this action overrides the FILTER action, and
-# affects all recipients of the message. If multiple
-# REDIRECT actions fire, only the last one is exe-
+# Note: this action overrides the FILTER action, and
+# affects all recipients of the message. If multiple
+# REDIRECT actions fire, only the last one is exe-
# cuted.
#
# This feature is available in Postfix 2.1 and later.
#
# REPLACE text...
-# Replace the current line with the specified text,
+# Replace the current line with the specified text,
# and inspect the next input line.
#
# This feature is available in Postfix 2.2 and later.
-# The description below applies to Postfix 2.2.2 and
+# The description below applies to Postfix 2.2.2 and
# later.
#
# Notes:
#
-# o When replacing a message header line, the
-# replacement text must begin with a valid
+# o When replacing a message header line, the
+# replacement text must begin with a valid
# header label.
#
-# o The replaced text remains part of the input
-# stream. Unlike the result from the PREPEND
-# action, a replaced message header may be
-# subject to address rewriting and may affect
-# the way that Postfix adds missing message
+# o The replaced text remains part of the input
+# stream. Unlike the result from the PREPEND
+# action, a replaced message header may be
+# subject to address rewriting and may affect
+# the way that Postfix adds missing message
# headers.
#
# REJECT optional text...
-# Reject the entire message. Reply with optional
+# Reject the entire message. Reply with optional
# text... when the optional text is specified, other-
# wise reply with a generic error message.
#
-# Note: this action disables further header or
-# body_checks inspection of the current message and
+# Note: this action disables further header or
+# body_checks inspection of the current message and
# affects all recipients.
#
# Postfix version 2.3 and later support enhanced sta-
# enhanced status code of "5.7.1".
#
# WARN optional text...
-# Log a warning with the optional text... (or log a
-# generic message), and inspect the next input line.
+# Log a warning with the optional text... (or log a
+# generic message), and inspect the next input line.
# This action is useful for debugging and for testing
# a pattern before applying more drastic actions.
#
# BUGS
-# Many people overlook the main limitations of header and
+# Many people overlook the main limitations of header and
# body_checks rules.
#
-# o These rules operate on one logical message header
+# o 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.
#
-# o If text in the message body is encoded (RFC 2045)
-# then the rules have to specified for the encoded
+# o If text in the message body is encoded (RFC 2045)
+# then the rules need to be specified for the encoded
# form.
#
-# o Likewise, when message headers are encoded (RFC
-# 2047) then the rules need to be specified for the
+# o Likewise, when message headers are encoded (RFC
+# 2047) then the rules need to be specified for the
# encoded form.
#
-# Message headers added by the cleanup(8) daemon itself are
+# Message headers added by the cleanup(8) daemon itself are
# excluded from inspection. Examples of such message headers
# are From:, To:, Message-ID:, Date:.
#
-# Message headers deleted by the cleanup(8) daemon will be
+# Message headers deleted by the cleanup(8) daemon will be
# examined before they are deleted. Examples are: Bcc:, Con-
# tent-Length:, Return-Path:.
#
# body_checks
# Lookup tables with content filter rules for message
# body lines. These filters see one physical line at
-# a time, in chunks of at most $line_length_limit
+# a time, in chunks of at most $line_length_limit
# bytes.
#
# body_checks_size_limit
-# The amount of content per message body segment
+# The amount of content per message body segment
# (attachment) that is subjected to $body_checks fil-
# tering.
#
#
# nested_header_checks (default: $header_checks)
# Lookup tables with content filter rules for message
-# header lines: respectively, these are applied to
-# the initial message headers (not including MIME
-# headers), to the MIME headers anywhere in the mes-
-# sage, and to the initial headers of attached mes-
+# header lines: respectively, these are applied to
+# the initial message headers (not including MIME
+# headers), to the MIME headers anywhere in the mes-
+# sage, and to the initial headers of attached mes-
# sages.
#
-# Note: these filters see one logical message header
-# at a time, even when a message header spans multi-
-# ple lines. Message headers that are longer than
+# Note: these filters see one logical message header
+# at a time, even when a message header spans multi-
+# ple lines. Message headers that are longer than
# $header_size_limit characters are truncated.
#
# disable_mime_input_processing
-# While receiving mail, give no special treatment to
-# MIME related message headers; all text after the
+# While receiving mail, give no special treatment to
+# MIME related message headers; all text after the
# initial message headers is considered to be part of
-# the message body. This means that header_checks is
-# applied to all the initial message headers, and
+# the message body. This means that header_checks is
+# applied to all the initial message headers, and
# that body_checks is applied to the remainder of the
# message.
#
-# Note: when used in this manner, body_checks will
-# process a multi-line message header one line at a
+# Note: when used in this manner, body_checks will
+# process a multi-line message header one line at a
# time.
#
# EXAMPLES
-# Header pattern to block attachments with bad file name
+# Header pattern to block attachments with bad file name
# extensions.
#
# /etc/postfix/main.cf:
# RFC 2047, message header encoding for non-ASCII text
#
# README FILES
-# Use "postconf readme_directory" or "postconf html_direc-
+# Use "postconf readme_directory" or "postconf html_direc-
# tory" to locate this information.
# DATABASE_README, Postfix lookup table overview
# CONTENT_INSPECTION_README, Postfix content inspection overview
# BACKSCATTER_README, blocking returned forged mail
#
# LICENSE
-# The Secure Mailer license must be distributed with this
+# The Secure Mailer license must be distributed with this
# software.
#
# AUTHOR(S)
# The input format for the postmap(1) command is as follows:
#
# o An entry has one of the following form:
+#
# pattern new_location
+#
# Where new_location specifies contact information
# such as an email address, or perhaps a street
# address or telephone number.
# DESCRIPTION
# The optional transport(5) table specifies a mapping from
# email addresses to message delivery transports and next-
-# hop hosts. The table is searched by the trivial-rewrite(8)
-# daemon.
+# hop destinations. Message delivery transports such as
+# local or smtp are defined in the master.cf file, and next-
+# hop destinations are typically hosts or domain names. The
+# table is searched by the trivial-rewrite(8) daemon.
#
# This mapping overrides the default transport:nexthop
# selection that is built into Postfix:
#
# my.domain :
# .my.domain :
-# * smtp:outbound-relay.my.domain
+# * smtp:outbound-relay.my.domain
#
# In order to send mail for example.com and its subdomains
# via the uucp transport to the UUCP host named example:
#
# The error mailer can be used to bounce mail:
#
-# .example.com error:mail for *.example.com is not
-# deliverable
+# .example.com error:mail for *.example.com is not deliverable
#
-# This causes all mail for user@anything.example.com to be
+# This causes all mail for user@anything.example.com to be
# bounced.
#
# REGULAR EXPRESSION TABLES
-# This section describes how the table lookups change when
+# This section describes how the table lookups change when
# the table is given in the form of regular expressions. For
-# a description of regular expression lookup table syntax,
+# a description of regular expression lookup table syntax,
# see regexp_table(5) or pcre_table(5).
#
-# Each pattern is a regular expression that is applied to
-# the entire address being looked up. Thus,
-# some.domain.hierarchy is not looked up via its parent
-# domains, nor is user+foo@domain looked up as user@domain.
+# Each pattern is a regular expression that is applied to
+# the entire address being looked up. Thus,
+# some.domain.hierarchy is not looked up via its parent
+# domains, nor is user+foo@domain looked up as user@domain.
#
-# Patterns are applied in the order as specified in the ta-
-# ble, until a pattern is found that matches the search
+# Patterns are applied in the order as specified in the ta-
+# ble, until a pattern is found that matches the search
# string.
#
-# Results are the same as with indexed file lookups, with
-# the additional feature that parenthesized substrings from
-# the pattern can be interpolated as $1, $2 and so on.
+# The trivial-rewrite(8) server disallows regular expression
+# substitution of $1 etc. in regular expression lookup
+# tables, because that could open a security hole (Postfix
+# version 2.3 and later).
#
# TCP-BASED TABLES
# This section describes how the table lookups change when
# Postfix SMTP server accepts mail for any recipient
# in domain, regardless of whether that recipient
# exists. This may turn your mail system into a
-# backscatter source that returns undeliverable spam
-# to innocent people.
+# backscatter source: Postfix first accepts mail for
+# non-existent recipients and then tries to return
+# that mail as "undeliverable" to the often forged
+# sender address.
#
# RESULT ADDRESS REWRITING
# The lookup result is subject to address rewriting:
# /etc/postfix/main.cf:
# virtual_alias_maps = hash:/etc/postfix/virtual
#
-# Note: some systems use dbm databases instead of hash.
-# See the output from "postconf -m" for available data-
-# base types.
+# Note: some systems use dbm databases instead of hash. See
+# the output from "postconf -m" for available database
+# types.
#
# /etc/postfix/virtual:
-# virtual-alias.domain anything (right-hand content does not matter)
-# postmaster@virtual-alias.domain postmaster
-# user1@virtual-alias.domain address1
-# user2@virtual-alias.domain address2, address3
+# virtual-alias.domain anything (right-hand content does not matter)
+# postmaster@virtual-alias.domain postmaster
+# user1@virtual-alias.domain address1
+# user2@virtual-alias.domain address2, address3
#
# The virtual-alias.domain anything entry is required for a
# virtual alias domain. Without this entry, mail is rejected
<h2>Overview </h2>
This document describes features that require Postfix version 2.0
-or later.
+or later. The examples use Perl Compatible Regular Expressions
+(Postfix <a href="pcre_table.5.html">pcre</a>: tables), but also provide a translation to POSIX
+regular expressions (Postfix <a href="regexp_table.5.html">regexp</a>: tables). PCRE is preferred
+primarily because the implementation is often faster.</p>
<p> Topics covered in this document: </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
- <a href="postconf.5.html#header_checks">header_checks</a> = <a href="regexp_table.5.html">regexp</a>:/etc/postfix/header_checks
- <a href="postconf.5.html#body_checks">body_checks</a> = <a href="regexp_table.5.html">regexp</a>:/etc/postfix/body_checks
+ <a href="postconf.5.html#header_checks">header_checks</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/header_checks
+ <a href="postconf.5.html#body_checks">body_checks</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/body_checks
/etc/postfix/header_checks:
if /^Received:/
reject forged client name in Received: header: $1
/^Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^Message-ID:.* <!&!/ DUNNO
reject forged client name in Received: header: $1
/^[> ]*Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^[> ]*Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^[> ]*Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^[> ]*Message-ID:.* <!&!/ DUNNO
<ul>
+<li> <p> The example uses <a href="pcre_table.5.html">pcre</a>: tables mainly for speed; with minor
+modifications, you can use <a href="regexp_table.5.html">regexp</a>: tables as explained below. </p>
+
<li> <p> The example is simplified for educational purposes. In
reality my patterns list multiple domain names, as
"<tt>(domain|domain|...)</tt>". </p>
and "<tt>)</tt>" literally. Without the "<tt>\</tt>", the "<tt>(</tt>"
and "<tt>)</tt>" would be grouping operators. </p>
-<li> <p> The "<tt>[[:>:]]</tt>" matches the end of a word. On
-some systems you should specify "<tt>\></tt>" instead. For details
-see your system documentation. </p>
+<li> <p> The "<tt>\b</tt>" is used here to match the end of a word.
+If you use <a href="regexp_table.5.html">regexp</a>: tables, specify "<tt>[[:>:]]</tt>" (on some
+systems you should specify "<tt>\></tt>" instead; for details
+see your system documentation).
<li> <p> The "if /pattern/" and "endif" eliminate unnecessary
matching attempts. DO NOT indent lines starting with /pattern/
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
- <a href="postconf.5.html#header_checks">header_checks</a> = <a href="regexp_table.5.html">regexp</a>:/etc/postfix/header_checks
- <a href="postconf.5.html#body_checks">body_checks</a> = <a href="regexp_table.5.html">regexp</a>:/etc/postfix/body_checks
+ <a href="postconf.5.html#header_checks">header_checks</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/header_checks
+ <a href="postconf.5.html#body_checks">body_checks</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/body_checks
/etc/postfix/header_checks:
- /^(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
/etc/postfix/body_checks:
- /^[> ]*(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^[> ]*(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
</pre>
</blockquote>
<ul>
+<li> <p> The example uses <a href="pcre_table.5.html">pcre</a>: tables mainly for speed; with minor
+modifications, you can use <a href="regexp_table.5.html">regexp</a>: tables as explained below. </p>
+
<li> <p> The example is simplified for educational purposes. In
reality, my patterns list multiple email addresses as
"<tt>(user1@domain1\.tld|user2@domain2\.tld)</tt>". </p>
-<li> <p> The "<tt>[[:<:]]</tt>" and "<tt>[[:>:]]</tt>" match
-the beginning and end of a word, respectively. On some systems you
-should specify "<tt>\<</tt>" and "<tt>\></tt>" instead. For
-details see your system documentation. </p>
+<li> <p> The two "<tt>\b</tt>" as used in "<tt>\b(user@domain\.tld)\b</tt>"
+match the beginning and end of a word, respectively. If you use
+<a href="regexp_table.5.html">regexp</a>: tables, specify "<tt>[[:<:]]</tt> and <tt>[[:>:]]</tt>"
+(on some systems you should specify "<tt>\<</tt> and <tt>\></tt>"
+instead; for details see your system documentation). </p>
<li> <p> The "<tt>\.</tt>" matches "<tt>.</tt>" literally. Without
the "<tt>\</tt>", the "<tt>.</tt>" would match any character. </p>
Linux RedHat 3.x (January 2004) - 9.x <br>
Linux Slackware 3.x, 4.x, 7.x <br>
Linux SuSE 5.x, 6.x, 7.x <br>
+Linux Ubuntu 4.10..7.04<br>
Mac OS X <br>
NEXTSTEP 3.x <br>
NetBSD 1.x <br>
<li> <p> This was tested with sid-milter-0.2.10 and sid-milter-0.2.14. </p>
-<li> <p> This fixes only the ugly message header, but not the WARNING
-message. Fortunately, sid-milter logs that message only once. </p>
-
</ul>
<p> To fix the ugly message header with other Milter applications,
</table>
-<li> <p> The <a href="bounce.8.html">bounce(8)</a>, <a href="defer.8.html">defer(8)</a> and <a href="trace.8.html">trace(8)</a> servers each maintain
-their own queue directory trees with per-message logfiles. This
-information is used to send delivery or non-delivery notifications
-to the sender. </p>
+<li> <p> The <a href="bounce.8.html">bounce(8)</a>, <a href="defer.8.html">defer(8)</a> and <a href="trace.8.html">trace(8)</a> services each maintain
+their own queue directory trees with per-message logfiles. Postfix
+uses this information when sending "failed", "delayed" or "success"
+delivery status notifications to the sender. </p>
-<p> The <a href="trace.8.html">trace(8)</a> service implements support for the Postfix "sendmail
+<p> The <a href="trace.8.html">trace(8)</a> service also implements support for the Postfix
+"sendmail
-bv" and "sendmail -v" commands which produce reports about how
Postfix delivers mail, and is available with Postfix version 2.1
and later. See <a href="DEBUG_README.html#trace_mail"> DEBUG_README
1.2.3 REJECT
1.2.3.4 OK
- Execute the command "<b>postmap /etc/postfix/access</b>" after
+ Execute the command "<b>postmap /etc/postfix/access</b>" after
editing the file.
<b>BUGS</b>
- The table format does not understand quoting conventions.
+ The table format does not understand quoting conventions.
<b>SEE ALSO</b>
<a href="postmap.1.html">postmap(1)</a>, Postfix lookup table manager
<a href="DATABASE_README.html">DATABASE_README</a>, Postfix lookup table overview
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
something like:
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
- <a href="postconf.5.html#bounce_template_file">bounce_template_file</a> = /etc/postfix/bounce.cf
+ <a href="postconf.5.html#bounce_template_file">bounce_template_file</a> = /etc/postfix/bounce.cf
<b>TEMPLATE FILE FORMAT</b>
The template file can specify templates for failed mail,
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
- The mail system
+ The mail system
EOF
The usage and specification of bounce templates is subject
applied to recipient addresses, the Postfix SMTP
server accepts mail for any recipient in <i>domain</i>,
regardless of whether that recipient exists. This
- may turn your mail system into a backscatter source
- that returns undeliverable spam to innocent people.
+ may turn your mail system into a backscatter
+ source: Postfix first accepts mail for non-existent
+ recipients and then tries to return that mail as
+ "undeliverable" to the often forged sender address.
<b>RESULT ADDRESS REWRITING</b>
The lookup result is subject to address rewriting:
that the ISP supports "+" style address extensions).
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
- <a href="postconf.5.html#smtp_generic_maps">smtp_generic_maps</a> = hash:/etc/postfix/generic
+ <a href="postconf.5.html#smtp_generic_maps">smtp_generic_maps</a> = hash:/etc/postfix/generic
/etc/postfix/generic:
- his@localdomain.local hisaccount@hisisp.example
- her@localdomain.local heraccount@herisp.example
- @localdomain.local hisaccount+local@hisisp.example
+ his@localdomain.local hisaccount@hisisp.example
+ her@localdomain.local heraccount@herisp.example
+ @localdomain.local hisaccount+local@hisisp.example
Execute the command "<b>postmap /etc/postfix/generic</b>" when-
ever the table is changed. Instead of <b>hash</b>, some systems
time, even when a message header spans multiple lines.
Body lines are always examined one line at a time.
+<b>COMPATIBILITY</b>
+ With Postfix version 2.2 and earlier specify "<b>postmap -fq</b>"
+ to query a table that contains case sensitive patterns. By
+ default, <a href="regexp_table.5.html">regexp</a>: and <a href="pcre_table.5.html">pcre</a>: patterns are case insensitive.
+
<b>TABLE FORMAT</b>
- This document assumes that header and <a href="postconf.5.html#body_checks">body_checks</a> rules
- are specified in the form of Postfix regular expression
- lookup tables. Usually the best performance is obtained
+ This document assumes that header and <a href="postconf.5.html#body_checks">body_checks</a> rules
+ are specified in the form of Postfix regular expression
+ lookup tables. Usually the best performance is obtained
with <b>pcre</b> (Perl Compatible Regular Expression) tables, but
- the slower <b>regexp</b> (POSIX regular expressions) support is
- more widely available. Use the command "<b>postconf -m</b>" to
- find out what lookup table types your Postfix system sup-
+ the slower <b>regexp</b> (POSIX regular expressions) support is
+ more widely available. Use the command "<b>postconf -m</b>" to
+ find out what lookup table types your Postfix system sup-
ports.
The general format of Postfix regular expression tables is
- given below. For a discussion of specific pattern or
- flags syntax, see <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a> or <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a>,
+ given below. For a discussion of specific pattern or
+ flags syntax, see <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a> or <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a>,
respectively.
<b>/</b><i>pattern</i><b>/</b><i>flags action</i>
- When <i>pattern</i> matches the input string, execute the
- corresponding <i>action</i>. See below for a list of pos-
+ When <i>pattern</i> matches the input string, execute the
+ corresponding <i>action</i>. See below for a list of pos-
sible actions.
<b>!/</b><i>pattern</i><b>/</b><i>flags action</i>
- When <i>pattern</i> does <b>not</b> match the input string, exe-
+ When <i>pattern</i> does <b>not</b> match the input string, exe-
cute the corresponding <i>action</i>.
<b>if /</b><i>pattern</i><b>/</b><i>flags</i>
<b>endif</b> Match the input string against the patterns between
- <b>if</b> and <b>endif</b>, if and only if the same input string
+ <b>if</b> and <b>endif</b>, if and only if the same input string
also matches <i>pattern</i>. The <b>if</b>..<b>endif</b> can nest.
- Note: do not prepend whitespace to patterns inside
+ Note: do not prepend whitespace to patterns inside
<b>if</b>..<b>endif</b>.
<b>if !/</b><i>pattern</i><b>/</b><i>flags</i>
<b>endif</b> Match the input string against the patterns between
- <b>if</b> and <b>endif</b>, if and only if the same input string
+ <b>if</b> and <b>endif</b>, if and only if the same input string
does <b>not</b> match <i>pattern</i>. The <b>if</b>..<b>endif</b> can nest.
blank lines and comments
- Empty lines and whitespace-only lines are ignored,
- as are lines whose first non-whitespace character
+ Empty lines and whitespace-only lines are ignored,
+ as are lines whose first non-whitespace character
is a `#'.
multi-line text
- A pattern/action line starts with non-whitespace
- text. A line that starts with whitespace continues
+ A pattern/action line starts with non-whitespace
+ text. A line that starts with whitespace continues
a logical line.
<b>TABLE SEARCH ORDER</b>
- 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
+ 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.
<b>TEXT SUBSTITUTION</b>
- Substitution of substrings from the matched expression
- into the <i>action</i> string is possible using the conventional
- Perl syntax (<b>$1</b>, <b>$2</b>, etc.). The macros in the result
- string may need to be written as <b>${n}</b> or <b>$(n)</b> if they
+ Substitution of substrings from the matched expression
+ into the <i>action</i> string is possible using the conventional
+ Perl syntax (<b>$1</b>, <b>$2</b>, etc.). The macros in the result
+ string may need to be written as <b>${n}</b> or <b>$(n)</b> if they
aren't followed by whitespace.
- Note: since negated patterns (those preceded by <b>!</b>) return
+ Note: since negated patterns (those preceded by <b>!</b>) return
a result when the expression does not match, substitutions
are not available for negated patterns.
case for consistency with other Postfix documentation.
<b>DISCARD</b> <i>optional text...</i>
- Claim successful delivery and silently discard the
- message. Log the optional text if specified, oth-
+ Claim successful delivery and silently discard the
+ message. Log the optional text if specified, oth-
erwise log a generic message.
- Note: this action disables further header or
- <a href="postconf.5.html#body_checks">body_checks</a> inspection of the current message and
+ Note: this action disables further header or
+ <a href="postconf.5.html#body_checks">body_checks</a> inspection of the current message and
affects all recipients. To discard only one recip-
ient without discarding the entire message, use the
<a href="transport.5.html">transport(5)</a> table to direct mail to the <a href="discard.8.html">discard(8)</a>
This feature is available in Postfix 2.0 and later.
- <b>DUNNO</b> Pretend that the input line did not match any pat-
- tern, and inspect the next input line. This action
+ <b>DUNNO</b> Pretend that the input line did not match any pat-
+ tern, and inspect the next input line. This action
can be used to shorten the table search.
- For backwards compatibility reasons, Postfix also
- accepts <b>OK</b> but it is (and always has been) treated
+ For backwards compatibility reasons, Postfix also
+ accepts <b>OK</b> but it is (and always has been) treated
as <b>DUNNO</b>.
This feature is available in Postfix 2.1 and later.
<b>FILTER</b> <i>transport:destination</i>
- Write a content filter request to the queue file,
- and inspect the next input line. After the com-
- plete message is received it will be sent through
+ Write a content filter request to the queue file,
+ and inspect the next input line. After the com-
+ plete message is received it will be sent through
the specified external content filter. More infor-
- mation about external content filters is in the
+ mation about external content filters is in the
Postfix <a href="FILTER_README.html">FILTER_README</a> file.
Note: this action overrides the <b><a href="postconf.5.html#content_filter">content_filter</a></b> set-
ting, and affects all recipients of the message. In
- the case that multiple <b>FILTER</b> actions fire, only
+ the case that multiple <b>FILTER</b> actions fire, only
the last one is executed.
This feature is available in Postfix 2.0 and later.
<b>HOLD</b> <i>optional text...</i>
- Arrange for the message to be placed on the <b>hold</b>
- queue, and inspect the next input line. The mes-
- sage remains on <b>hold</b> until someone either deletes
- it or releases it for delivery. Log the optional
+ Arrange for the message to be placed on the <b>hold</b>
+ queue, and inspect the next input line. The mes-
+ sage remains on <b>hold</b> 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 <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
+ Mail that is placed on hold can be examined with
+ the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command.
- Note: use "<b>postsuper -r</b>" to release mail that was
- kept on hold for a significant fraction of <b>$<a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
+ Note: use "<b>postsuper -r</b>" to release mail that was
+ kept on hold for a significant fraction of <b>$<a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
<b><a href="postconf.5.html#maximal_queue_lifetime">mal_queue_lifetime</a></b> or <b>$<a href="postconf.5.html#bounce_queue_lifetime">bounce_queue_lifetime</a></b>, or
- longer. Use "<b>postsuper -H</b>" only for mail that will
+ longer. Use "<b>postsuper -H</b>" only for mail that will
not expire within a few delivery attempts.
- Note: this action affects all recipients of the
+ Note: this action affects all recipients of the
message.
This feature is available in Postfix 2.0 and later.
the next input line.
<b>PREPEND</b> <i>text...</i>
- Prepend one line with the specified text, and
+ Prepend one line with the specified text, and
inspect the next input line.
Notes:
- <b>o</b> The prepended text is output on a separate
+ <b>o</b> The prepended text is output on a separate
line, immediately before the input that
triggered the <b>PREPEND</b> action.
<b>o</b> The prepended text is not considered part of
- the input stream: it is not subject to
+ 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.
<b>o</b> When prepending text before a message header
- line, the prepended text must begin with a
+ line, the prepended text must begin with a
valid message header label.
<b>o</b> This action cannot be used to prepend multi-
This feature is available in Postfix 2.1 and later.
<b>REDIRECT</b> <i>user@domain</i>
- Write a message redirection request to the queue
- file, and inspect the next input line. After the
+ 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).
- Note: this action overrides the <b>FILTER</b> action, and
- affects all recipients of the message. If multiple
- <b>REDIRECT</b> actions fire, only the last one is exe-
+ Note: this action overrides the <b>FILTER</b> action, and
+ affects all recipients of the message. If multiple
+ <b>REDIRECT</b> actions fire, only the last one is exe-
cuted.
This feature is available in Postfix 2.1 and later.
<b>REPLACE</b> <i>text...</i>
- Replace the current line with the specified text,
+ Replace the current line with the specified text,
and inspect the next input line.
This feature is available in Postfix 2.2 and later.
- The description below applies to Postfix 2.2.2 and
+ The description below applies to Postfix 2.2.2 and
later.
Notes:
- <b>o</b> When replacing a message header line, the
- replacement text must begin with a valid
+ <b>o</b> When replacing a message header line, the
+ replacement text must begin with a valid
header label.
- <b>o</b> The replaced text remains part of the input
- stream. Unlike the result from the <b>PREPEND</b>
- action, a replaced message header may be
- subject to address rewriting and may affect
- the way that Postfix adds missing message
+ <b>o</b> The replaced text remains part of the input
+ stream. Unlike the result from the <b>PREPEND</b>
+ action, a replaced message header may be
+ subject to address rewriting and may affect
+ the way that Postfix adds missing message
headers.
<b>REJECT</b> <i>optional text...</i>
- Reject the entire message. Reply with <i>optional</i>
+ Reject the entire message. Reply with <i>optional</i>
<i>text...</i> when the optional text is specified, other-
wise reply with a generic error message.
- Note: this action disables further header or
- <a href="postconf.5.html#body_checks">body_checks</a> inspection of the current message and
+ Note: this action disables further header or
+ <a href="postconf.5.html#body_checks">body_checks</a> inspection of the current message and
affects all recipients.
Postfix version 2.3 and later support enhanced sta-
enhanced status code of "5.7.1".
<b>WARN</b> <i>optional text...</i>
- Log a warning with the <i>optional text...</i> (or log a
- generic message), and inspect the next input line.
+ Log a warning with the <i>optional text...</i> (or log a
+ generic message), and inspect the next input line.
This action is useful for debugging and for testing
a pattern before applying more drastic actions.
<b>BUGS</b>
- Many people overlook the main limitations of header and
+ Many people overlook the main limitations of header and
<a href="postconf.5.html#body_checks">body_checks</a> rules.
- <b>o</b> These rules operate on one logical message header
+ <b>o</b> 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.
- <b>o</b> If text in the message body is encoded (<a href="http://www.faqs.org/rfcs/rfc2045.html">RFC 2045</a>)
- then the rules have to specified for the encoded
+ <b>o</b> If text in the message body is encoded (<a href="http://www.faqs.org/rfcs/rfc2045.html">RFC 2045</a>)
+ then the rules need to be specified for the encoded
form.
- <b>o</b> Likewise, when message headers are encoded (<a href="http://www.faqs.org/rfcs/rfc2047.html">RFC</a>
- <a href="http://www.faqs.org/rfcs/rfc2047.html">2047</a>) then the rules need to be specified for the
+ <b>o</b> Likewise, when message headers are encoded (<a href="http://www.faqs.org/rfcs/rfc2047.html">RFC</a>
+ <a href="http://www.faqs.org/rfcs/rfc2047.html">2047</a>) then the rules need to be specified for the
encoded form.
- Message headers added by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon itself are
+ Message headers added by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon itself are
excluded from inspection. Examples of such message headers
are <b>From:</b>, <b>To:</b>, <b>Message-ID:</b>, <b>Date:</b>.
- Message headers deleted by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon will be
+ Message headers deleted by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon will be
examined before they are deleted. Examples are: <b>Bcc:, Con-</b>
<b>tent-Length:</b>, <b>Return-Path:</b>.
<b><a href="postconf.5.html#body_checks">body_checks</a></b>
Lookup tables with content filter rules for message
body lines. These filters see one physical line at
- a time, in chunks of at most <b>$<a href="postconf.5.html#line_length_limit">line_length_limit</a></b>
+ a time, in chunks of at most <b>$<a href="postconf.5.html#line_length_limit">line_length_limit</a></b>
bytes.
<b><a href="postconf.5.html#body_checks_size_limit">body_checks_size_limit</a></b>
- The amount of content per message body segment
+ The amount of content per message body segment
(attachment) that is subjected to <b>$<a href="postconf.5.html#body_checks">body_checks</a></b> fil-
tering.
<b><a href="postconf.5.html#nested_header_checks">nested_header_checks</a></b> (default: <b>$<a href="postconf.5.html#header_checks">header_checks</a></b>)
Lookup tables with content filter rules for message
- header lines: respectively, these are applied to
- the initial message headers (not including MIME
- headers), to the MIME headers anywhere in the mes-
- sage, and to the initial headers of attached mes-
+ header lines: respectively, these are applied to
+ the initial message headers (not including MIME
+ headers), to the MIME headers anywhere in the mes-
+ sage, and to the initial headers of attached mes-
sages.
- Note: these filters see one logical message header
- at a time, even when a message header spans multi-
- ple lines. Message headers that are longer than
+ Note: these filters see one logical message header
+ at a time, even when a message header spans multi-
+ ple lines. Message headers that are longer than
<b>$<a href="postconf.5.html#header_size_limit">header_size_limit</a></b> characters are truncated.
<b><a href="postconf.5.html#disable_mime_input_processing">disable_mime_input_processing</a></b>
- While receiving mail, give no special treatment to
- MIME related message headers; all text after the
+ While receiving mail, give no special treatment to
+ MIME related message headers; all text after the
initial message headers is considered to be part of
- the message body. This means that <b><a href="postconf.5.html#header_checks">header_checks</a></b> is
- applied to all the initial message headers, and
+ the message body. This means that <b><a href="postconf.5.html#header_checks">header_checks</a></b> is
+ applied to all the initial message headers, and
that <b><a href="postconf.5.html#body_checks">body_checks</a></b> is applied to the remainder of the
message.
- Note: when used in this manner, <b><a href="postconf.5.html#body_checks">body_checks</a></b> will
- process a multi-line message header one line at a
+ Note: when used in this manner, <b><a href="postconf.5.html#body_checks">body_checks</a></b> will
+ process a multi-line message header one line at a
time.
<b>EXAMPLES</b>
- Header pattern to block attachments with bad file name
+ Header pattern to block attachments with bad file name
extensions.
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="BACKSCATTER_README.html">BACKSCATTER_README</a>, blocking returned forged mail
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
are not performed. This can significantly reduce
the query load on the LDAP server.
- domain = postfix.org, hash:/etc/postfix/search-
- domains
+ domain = postfix.org, hash:/etc/postfix/searchdomains
- It is best not to use LDAP to store the domains
+ It is best not to use LDAP to store the domains
eligible for LDAP lookups.
- NOTE: DO NOT define this parameter for <a href="local.8.html">local(8)</a>
+ NOTE: DO NOT define this parameter for <a href="local.8.html">local(8)</a>
aliases.
This feature is available in Postfix 1.0 and later.
<b>result_attribute (default: maildrop)</b>
- The attribute(s) Postfix will read from any direc-
+ The attribute(s) Postfix will read from any direc-
tory entries returned by the lookup, to be resolved
to an email address.
<b>special_result_attribute (default: empty)</b>
The attribute(s) of directory entries that can con-
- tain DNs or URLs. If found, a recursive subsequent
+ tain DNs or URLs. If found, a recursive subsequent
search is done using their values.
special_result_attribute = memberdn
- DN recursion retrieves the same result_attributes
+ DN recursion retrieves the same result_attributes
as the main query, including the special attributes
- for further recursion. URI processing retrieves
- only those attributes that are included in the URI
- definition and are *also* listed in
- "result_attribute". If the URI lists any of the
- map's special result attributes, these are also
+ for further recursion. URI processing retrieves
+ only those attributes that are included in the URI
+ definition and are *also* listed in
+ "result_attribute". If the URI lists any of the
+ map's special result attributes, these are also
retrieved and used recursively.
<b>terminal_result_attribute (default: empty)</b>
- When one or more terminal result attributes are
+ When one or more terminal result attributes are
found in an LDAP entry, all other result attributes
are ignored and only the terminal result attributes
- are returned. This is useful for delegating expan-
- sion of group members to a particular host, by
- using an optional "maildrop" attribute on selected
+ are returned. This is useful for delegating expan-
+ sion of group members to a particular host, by
+ using an optional "maildrop" attribute on selected
groups to route the group to a specific host, where
- the group is expanded, possibly via mailing-list
+ the group is expanded, possibly via mailing-list
manager or other special processing.
terminal_result_attribute = maildrop
- This feature is available with Postfix 2.4 or
+ This feature is available with Postfix 2.4 or
later.
<b>leaf_result_attribute (default: empty)</b>
- When one or more special result attributes are
- found in a non-terminal (see above) LDAP entry,
+ When one or more special result attributes are
+ found in a non-terminal (see above) LDAP entry,
leaf result attributes are excluded from the expan-
- sion of that entry. This is useful when expanding
+ sion of that entry. This is useful when expanding
groups and the desired mail address attribute(s) of
the member objects obtained via DN or URI recursion
- are also present in the group object. To only
- return the attribute values from the leaf objects
- and not the containing group, add the attribute to
- the leaf_result_attribute list, and not the
- result_attribute list, which is always expanded.
- Note, the default value of "result_attribute" is
- not empty, you may want to set it explicitly empty
- when using "leaf_result_attribute" to expand the
- group to a list of member DN addresses. If groups
- have both member DN references AND attributes that
- hold multiple string valued rfc822 addresses, then
- the string attributes go in "result_attribute".
- The attributes that represent the email addresses
- of objects referenced via a DN (or LDAP URI) go in
+ are also present in the group object. To only
+ return the attribute values from the leaf objects
+ and not the containing group, add the attribute to
+ the leaf_result_attribute list, and not the
+ result_attribute list, which is always expanded.
+ Note, the default value of "result_attribute" is
+ not empty, you may want to set it explicitly empty
+ when using "leaf_result_attribute" to expand the
+ group to a list of member DN addresses. If groups
+ have both member DN references AND attributes that
+ hold multiple string valued rfc822 addresses, then
+ the string attributes go in "result_attribute".
+ The attributes that represent the email addresses
+ of objects referenced via a DN (or LDAP URI) go in
"leaf_result_attribute".
result_attribute = memberaddr
terminal_result_attribute = maildrop
leaf_result_attribute = mail
- This feature is available with Postfix 2.4 or
+ This feature is available with Postfix 2.4 or
later.
<b>scope (default: sub)</b>
- The LDAP search scope: <b>sub</b>, <b>base</b>, or <b>one</b>. These
+ The LDAP search scope: <b>sub</b>, <b>base</b>, or <b>one</b>. These
translate into LDAP_SCOPE_SUBTREE, LDAP_SCOPE_BASE,
and LDAP_SCOPE_ONELEVEL.
<b>bind (default: yes)</b>
- Whether or not to bind to the LDAP server. Newer
+ Whether or not to bind to the LDAP server. Newer
LDAP implementations don't require clients to bind,
which saves time. Example:
bind = no
- If you do need to bind, you might consider config-
- uring Postfix to connect to the local machine on a
- port that's an SSL tunnel to your LDAP server. If
- your LDAP server doesn't natively support SSL, put
+ If you do need to bind, you might consider config-
+ uring Postfix to connect to the local machine on a
+ port that's an SSL tunnel to your LDAP server. If
+ your LDAP server doesn't natively support SSL, put
a tunnel (wrapper, proxy, whatever you want to call
- it) on that system too. This should prevent the
- password from traversing the network in the clear.
+ it) on that system too. This should prevent the
+ password from traversing the network in the clear.
<b>bind_dn (default: empty)</b>
- If you do have to bind, do it with this distin-
+ If you do have to bind, do it with this distin-
guished name. Example:
bind_dn = uid=postfix, dc=your, dc=com
<b>bind_pw (default: empty)</b>
- The password for the distinguished name above. If
+ The password for the distinguished name above. If
you have to use this, you probably want to make the
map configuration file readable only by the Postfix
- user. When using the obsolete <a href="ldap_table.5.html">ldap</a>:ldapsource syn-
+ user. When using the obsolete <a href="ldap_table.5.html">ldap</a>:ldapsource syn-
tax, with map parameters in <a href="postconf.5.html">main.cf</a>, it is not pos-
- sible to securely store the bind password. This is
+ sible to securely store the bind password. This is
because <a href="postconf.5.html">main.cf</a> needs to be world readable to allow
local accounts to submit mail via the sendmail com-
mand. Example:
<b>cache_expiry (IGNORED with a warning)</b>
<b>cache_size (IGNORED with a warning)</b>
- The above parameters are NO LONGER SUPPORTED by
+ The above parameters are NO LONGER SUPPORTED by
Postfix. Cache support has been dropped from
OpenLDAP as of release 2.1.13.
<b>recursion_limit (default: 1000)</b>
- A limit on the nesting depth of DN and URL special
- result attribute evaluation. The limit must be a
+ A limit on the nesting depth of DN and URL special
+ result attribute evaluation. The limit must be a
non-zero positive number.
<b>expansion_limit (default: 0)</b>
- A limit on the total number of result elements
- returned (as a comma separated list) by a lookup
- against the map. A setting of zero disables the
- limit. Lookups fail with a temporary error if the
- limit is exceeded. Setting the limit to 1 ensures
+ A limit on the total number of result elements
+ returned (as a comma separated list) by a lookup
+ against the map. A setting of zero disables the
+ limit. Lookups fail with a temporary error if the
+ limit is exceeded. Setting the limit to 1 ensures
that lookups do not return multiple values.
<b>size_limit (default: $expansion_limit)</b>
- A limit on the number of LDAP entries returned by
- any single LDAP search performed as part of the
- lookup. A setting of 0 disables the limit. Expan-
- sion of DN and URL references involves nested LDAP
- queries, each of which is separately subjected to
+ A limit on the number of LDAP entries returned by
+ any single LDAP search performed as part of the
+ lookup. A setting of 0 disables the limit. Expan-
+ sion of DN and URL references involves nested LDAP
+ queries, each of which is separately subjected to
this limit.
- Note: even a single LDAP entry can generate multi-
- ple lookup results, via multiple result attributes
- and/or multi-valued result attributes. This limit
- caps the per search resource utilization on the
- LDAP server, not the final multiplicity of the
- lookup result. It is analogous to the "-z" option
+ Note: even a single LDAP entry can generate multi-
+ ple lookup results, via multiple result attributes
+ and/or multi-valued result attributes. This limit
+ caps the per search resource utilization on the
+ LDAP server, not the final multiplicity of the
+ lookup result. It is analogous to the "-z" option
of "ldapsearch".
<b>dereference (default: 0)</b>
- When to dereference LDAP aliases. (Note that this
+ When to dereference LDAP aliases. (Note that this
has nothing do with Postfix aliases.) The permitted
- values are those legal for the OpenLDAP/UM LDAP
+ values are those legal for the OpenLDAP/UM LDAP
implementations:
0 never
3 always
See ldap.h or the ldap_open(3) or ldapsearch(1) man
- pages for more information. And if you're using an
+ pages for more information. And if you're using an
LDAP package that has other possible values, please
- bring it to the attention of the postfix-
+ bring it to the attention of the postfix-
users@postfix.org mailing list.
<b>chase_referrals (default: 0)</b>
- Sets (or clears) LDAP_OPT_REFERRALS (requires LDAP
+ Sets (or clears) LDAP_OPT_REFERRALS (requires LDAP
version 3 support).
<b>version (default: 2)</b>
Specifies the LDAP protocol version to use.
<b>debuglevel (default: 0)</b>
- What level to set for debugging in the OpenLDAP
+ What level to set for debugging in the OpenLDAP
libraries.
<b>LDAP SSL AND STARTTLS PARAMETERS</b>
- If you're using the OpenLDAP libraries compiled with SSL
- support, Postfix can connect to LDAP SSL servers and can
+ If you're using the OpenLDAP libraries compiled with SSL
+ support, Postfix can connect to LDAP SSL servers and can
issue the STARTTLS command.
- LDAP SSL service can be requested by using a LDAP SSL URL
+ LDAP SSL service can be requested by using a LDAP SSL URL
in the server_host parameter:
server_host = ldaps://ldap.example.com:636
start_tls = yes
- Both forms require LDAP protocol version 3, which has to
+ Both forms require LDAP protocol version 3, which has to
be set explicitly with:
version = 3
If any of the Postfix programs querying the map is config-
- ured in <a href="master.5.html">master.cf</a> to run chrooted, all the certificates
+ ured in <a href="master.5.html">master.cf</a> to run chrooted, all the certificates
and keys involved have to be copied to the chroot jail. Of
- course, the private keys should only be readable by the
+ course, the private keys should only be readable by the
user "postfix".
- The following parameters are relevant to LDAP SSL and
+ The following parameters are relevant to LDAP SSL and
STARTTLS:
<b>start_tls (default: no)</b>
Whether or not to issue STARTTLS upon connection to
- the server. Don't set this with LDAP SSL (the SSL
+ the server. Don't set this with LDAP SSL (the SSL
session is setup automatically when the TCP connec-
tion is opened).
- <b>tls_ca_cert_dir (No default; set either this or</b>
+ <b>tls_ca_cert_dir (No default; set either this or</b>
<b>tls_ca_cert_file)</b>
Directory containing X509 Certificate Authority
- certificates in PEM format which are to be recog-
- nized by the client in SSL/TLS connections. The
- files each contain one CA certificate. The files
- are looked up by the CA subject name hash value,
- which must hence be available. If more than one CA
- certificate with the same name hash value exist,
- the extension must be different (e.g. 9d66eef0.0,
- 9d66eef0.1 etc). The search is performed in the
- ordering of the extension number, regardless of
+ certificates in PEM format which are to be recog-
+ nized by the client in SSL/TLS connections. The
+ files each contain one CA certificate. The files
+ are looked up by the CA subject name hash value,
+ which must hence be available. If more than one CA
+ certificate with the same name hash value exist,
+ the extension must be different (e.g. 9d66eef0.0,
+ 9d66eef0.1 etc). The search is performed in the
+ ordering of the extension number, regardless of
other properties of the certificates. Use the
c_rehash utility (from the OpenSSL distribution) to
create the necessary links.
- <b>tls_ca_cert_file (No default; set either this or</b>
+ <b>tls_ca_cert_file (No default; set either this or</b>
<b>tls_ca_cert_dir)</b>
File containing the X509 Certificate Authority cer-
- tificates in PEM format which are to be recognized
- by the client in SSL/TLS connections. This setting
+ tificates in PEM format which are to be recognized
+ by the client in SSL/TLS connections. This setting
takes precedence over tls_ca_cert_dir.
<b>tls_cert (No default; you must set this)</b>
- File containing client's X509 certificate to be
+ File containing client's X509 certificate to be
used by the client in SSL/ TLS connections.
<b>tls_key (No default; you must set this)</b>
- File containing the private key corresponding to
+ File containing the private key corresponding to
the above tls_cert.
<b>tls_require_cert (default: no)</b>
Whether or not to request server's X509 certificate
- and check its validity when establishing SSL/TLS
+ and check its validity when establishing SSL/TLS
connections.
<b>tls_random_file (No default)</b>
- Path of a file to obtain random bits from when
- /dev/[u]random is not available, to be used by the
+ Path of a file to obtain random bits from when
+ /dev/[u]random is not available, to be used by the
client in SSL/TLS connections.
<b>tls_cipher_suite (No default)</b>
Cipher suite to use in SSL/TLS negotiations.
<b>EXAMPLE</b>
- Here's a basic example for using LDAP to look up <a href="local.8.html">local(8)</a>
+ Here's a basic example for using LDAP to look up <a href="local.8.html">local(8)</a>
aliases. Assume that in <a href="postconf.5.html">main.cf</a>, you have:
<a href="postconf.5.html#alias_maps">alias_maps</a> = hash:/etc/aliases,
- <a href="ldap_table.5.html">ldap</a>:/etc/postfix/ldap-aliases.cf
+ <a href="ldap_table.5.html">ldap</a>:/etc/postfix/ldap-aliases.cf
and in <a href="ldap_table.5.html">ldap</a>:/etc/postfix/ldap-aliases.cf you have:
server_host = ldap.example.com
search_base = dc=example, dc=com
- Upon receiving mail for a local address "ldapuser" that
- isn't found in the /etc/aliases database, Postfix will
+ Upon receiving mail for a local address "ldapuser" that
+ isn't found in the /etc/aliases database, Postfix will
search the LDAP server listening at port 389 on ldap.exam-
- ple.com. It will bind anonymously, search for any direc-
- tory entries whose mailacceptinggeneralid attribute is
+ ple.com. It will bind anonymously, search for any direc-
+ tory entries whose mailacceptinggeneralid attribute is
"ldapuser", read the "maildrop" attributes of those found,
and build a list of their maildrops, which will be treated
- as <a href="http://www.faqs.org/rfcs/rfc822.html">RFC822</a> addresses to which the message will be deliv-
+ as <a href="http://www.faqs.org/rfcs/rfc822.html">RFC822</a> addresses to which the message will be deliv-
ered.
<b>SEE ALSO</b>
<a href="LDAP_README.html">LDAP_README</a>, Postfix LDAP client guide
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
- Carsten Hoeger, Hery Rakotoarisoa, John Hensley, Keith
- Stevenson, LaMont Jones, Liviu Daia, Manuel Guesdon, Mike
- Mattice, Prabhat K Singh, Sami Haahtinen, Samuel Tardieu,
+ Carsten Hoeger, Hery Rakotoarisoa, John Hensley, Keith
+ Stevenson, LaMont Jones, Liviu Daia, Manuel Guesdon, Mike
+ Mattice, Prabhat K Singh, Sami Haahtinen, Samuel Tardieu,
Victor Duchovni, and many others.
LDAP_TABLE(5)
Alternatively, lookup tables can be specified as MySQL
databases. In order to use MySQL lookups, define a MySQL
- source as a lookup table in main.cf, for example:
+ source as a lookup table in <a href="postconf.5.html">main.cf</a>, for example:
<a href="postconf.5.html#alias_maps">alias_maps</a> = <a href="mysql_table.5.html">mysql</a>:/etc/mysql-aliases.cf
The file /etc/postfix/mysql-aliases.cf has the same format
- as the Postfix main.cf file, and can specify the parame-
+ as the Postfix <a href="postconf.5.html">main.cf</a> file, and can specify the parame-
ters described below.
<b>BACKWARDS COMPATIBILITY</b>
For compatibility with other Postfix lookup tables, MySQL
- parameters can also be defined in main.cf. In order to do
+ parameters can also be defined in <a href="postconf.5.html">main.cf</a>. In order to do
that, specify as MySQL source a name that doesn't begin
with a slash or a dot. The MySQL parameters will then be
accessible as the name you've given the source in its def-
inition, an underscore, and the name of the parameter.
For example, if the map is specified as "<a href="mysql_table.5.html">mysql</a>:<i>mysqlname</i>",
- the parameter "hosts" below would be defined in main.cf as
+ the parameter "hosts" below would be defined in <a href="postconf.5.html">main.cf</a> as
"<i>mysqlname</i>_hosts".
Note: with this form, the passwords for the MySQL sources
- are written in main.cf, which is normally world-readable.
+ are written in <a href="postconf.5.html">main.cf</a>, which is normally world-readable.
Support for this form will be removed in a future Postfix
version.
<b>query</b> The SQL query template used to search the database,
where <b>%s</b> is a substitute for the address Postfix is
trying to resolve, e.g.
- query = SELECT replacement FROM aliases WHERE
- mailbox = '%s'
+ query = SELECT replacement FROM aliases WHERE mailbox = '%s'
- This parameter supports the following '%' expan-
+ This parameter supports the following '%' expan-
sions:
<b>%%</b> This is replaced by a literal '%' character.
- <b>%s</b> This is replaced by the input key. SQL
- quoting is used to make sure that the input
- key does not add unexpected metacharacters.
+ <b>%s</b> This is replaced by the input key. SQL
+ quoting is used to make sure that the input
+ key does not add unexpected metacharacters.
<b>%u</b> When the input key is an address of the form
user@domain, <b>%u</b> is replaced by the SQL
- quoted local part of the address. Other-
- wise, <b>%u</b> is replaced by the entire search
- string. If the localpart is empty, the
- query is suppressed and returns no results.
+ quoted local part of the address. Other-
+ wise, <b>%u</b> is replaced by the entire search
+ string. If the localpart is empty, the
+ query is suppressed and returns no results.
<b>%d</b> When the input key is an address of the form
user@domain, <b>%d</b> is replaced by the SQL
- quoted domain part of the address. Other-
+ quoted domain part of the address. Other-
wise, the query is suppressed and returns no
results.
<b>%[SUD]</b> The upper-case equivalents of the above
- expansions behave in the <b>query</b> parameter
+ expansions behave in the <b>query</b> parameter
identically to their lower-case counter-
parts. With the <b>result_format</b> parameter
(see below), they expand the input key
rather than the result value.
- <b>%[1-9]</b> The patterns %1, %2, ... %9 are replaced by
+ <b>%[1-9]</b> The patterns %1, %2, ... %9 are replaced by
the corresponding most significant component
- of the input key's domain. If the input key
+ of the input key's domain. If the input key
is <i>user@mail.example.com</i>, then %1 is <b>com</b>, %2
- is <b>example</b> and %3 is <b>mail</b>. If the input key
+ is <b>example</b> and %3 is <b>mail</b>. If the input key
is unqualified or does not have enough
- domain components to satisfy all the speci-
- fied patterns, the query is suppressed and
+ domain components to satisfy all the speci-
+ fied patterns, the query is suppressed and
returns no results.
- The <b>domain</b> parameter described below limits the
- input keys to addresses in matching domains. When
- the <b>domain</b> parameter is non-empty, SQL queries for
- unqualified addresses or addresses in non-matching
+ The <b>domain</b> parameter described below limits the
+ input keys to addresses in matching domains. When
+ the <b>domain</b> parameter is non-empty, SQL queries for
+ unqualified addresses or addresses in non-matching
domains are suppressed and return no results.
- This parameter is available with Postfix 2.2. In
- prior releases the SQL query was built from the
- separate parameters: <b>select_field</b>, <b>table</b>,
- <b>where_field</b> and <b>additional_conditions</b>. The mapping
+ This parameter is available with Postfix 2.2. In
+ prior releases the SQL query was built from the
+ separate parameters: <b>select_field</b>, <b>table</b>,
+ <b>where_field</b> and <b>additional_conditions</b>. The mapping
from the old parameters to the equivalent query is:
SELECT [<b>select_field</b>]
The '%s' in the <b>WHERE</b> clause expands to the escaped
search string. With Postfix 2.2 these legacy
- parameters are used if the <b>query</b> parameter is not
+ parameters are used if the <b>query</b> parameter is not
specified.
NOTE: DO NOT put quotes around the query parameter.
<b>result_format (default: %s</b>)
- Format template applied to result attributes. Most
- commonly used to append (or prepend) text to the
- result. This parameter supports the following '%'
+ Format template applied to result attributes. Most
+ commonly used to append (or prepend) text to the
+ result. This parameter supports the following '%'
expansions:
<b>%%</b> This is replaced by a literal '%' character.
- <b>%s</b> This is replaced by the value of the result
- attribute. When result is empty it is
+ <b>%s</b> This is replaced by the value of the result
+ attribute. When result is empty it is
skipped.
- <b>%u</b> When the result attribute value is an
+ <b>%u</b> When the result attribute value is an
address of the form user@domain, <b>%u</b> is
- replaced by the local part of the address.
+ replaced by the local part of the address.
When the result has an empty localpart it is
skipped.
- <b>%d</b> When a result attribute value is an address
- of the form user@domain, <b>%d</b> is replaced by
+ <b>%d</b> When a result attribute value is an address
+ of the form user@domain, <b>%d</b> is replaced by
the domain part of the attribute value. When
the result is unqualified it is skipped.
<b>%[SUD1-9]</b>
- The upper-case and decimal digit expansions
+ The upper-case and decimal digit expansions
interpolate the parts of the input key
- rather than the result. Their behavior is
- identical to that described with <b>query</b>, and
- in fact because the input key is known in
- advance, queries whose key does not contain
- all the information specified in the result
- template are suppressed and return no
+ rather than the result. Their behavior is
+ identical to that described with <b>query</b>, and
+ in fact because the input key is known in
+ advance, queries whose key does not contain
+ all the information specified in the result
+ template are suppressed and return no
results.
For example, using "result_format = <a href="smtp.8.html">smtp</a>:[%s]"
allows one to use a mailHost attribute as the basis
- of a <a href="transport.5.html">transport(5)</a> table. After applying the result
- format, multiple values are concatenated as comma
- separated strings. The expansion_limit and parame-
+ of a <a href="transport.5.html">transport(5)</a> table. After applying the result
+ format, multiple values are concatenated as comma
+ separated strings. The expansion_limit and parame-
ter explained below allows one to restrict the num-
- ber of values in the result, which is especially
+ ber of values in the result, which is especially
useful for maps that must return at most one value.
- The default value <b>%s</b> specifies that each result
+ The default value <b>%s</b> specifies that each result
value should be used as is.
- This parameter is available with Postfix 2.2 and
+ This parameter is available with Postfix 2.2 and
later.
NOTE: DO NOT put quotes around the result format!
<b>domain (default: no domain list)</b>
- This is a list of domain names, paths to files, or
- dictionaries. When specified, only fully qualified
- search keys with a *non-empty* localpart and a
- matching domain are eligible for lookup: 'user'
- lookups, bare domain lookups and "@domain" lookups
- are not performed. This can significantly reduce
+ This is a list of domain names, paths to files, or
+ dictionaries. When specified, only fully qualified
+ search keys with a *non-empty* localpart and a
+ matching domain are eligible for lookup: 'user'
+ lookups, bare domain lookups and "@domain" lookups
+ are not performed. This can significantly reduce
the query load on the MySQL server.
- domain = postfix.org, hash:/etc/postfix/search-
- domains
+ domain = postfix.org, hash:/etc/postfix/searchdomains
It is best not to use SQL to store the domains eli-
gible for SQL lookups.
A NIS+ aliases map might be queried as follows:
<a href="postconf.5.html#alias_maps">alias_maps</a> = dbm:/etc/mail/aliases,
- <a href="nisplus_table.5.html">nisplus</a>:[alias=%s];mail_aliases.org_dir.$<a href="postconf.5.html#mydomain">mydomain</a>.:1
+ <a href="nisplus_table.5.html">nisplus</a>:[alias=%s];mail_aliases.org_dir.$<a href="postconf.5.html#mydomain">mydomain</a>.:1
This queries the local aliases file before the NIS+ file.
<b>DESCRIPTION</b>
The Postfix mail system uses optional tables for address
- rewriting or mail routing. These tables are usually in <b>dbm</b>
- or <b>db</b> format.
+ rewriting, mail routing, or access control. These tables
+ are usually in <b>dbm</b> or <b>db</b> format.
Alternatively, lookup tables can be specified in Perl Com-
patible Regular Expression form. In this case, each input
Alternatively, lookup tables can be specified as Post-
greSQL databases. In order to use PostgreSQL lookups,
- define a PostgreSQL source as a lookup table in main.cf,
+ define a PostgreSQL source as a lookup table in <a href="postconf.5.html">main.cf</a>,
for example:
<a href="postconf.5.html#alias_maps">alias_maps</a> = <a href="pgsql_table.5.html">pgsql</a>:/etc/pgsql-aliases.cf
The file /etc/postfix/pgsql-aliases.cf has the same format
- as the Postfix main.cf file, and can specify the parame-
+ as the Postfix <a href="postconf.5.html">main.cf</a> file, and can specify the parame-
ters described below.
<b>BACKWARDS COMPATIBILITY</b>
For compatibility with other Postfix lookup tables, Post-
- greSQL parameters can also be defined in main.cf. In
+ greSQL parameters can also be defined in <a href="postconf.5.html">main.cf</a>. In
order to do that, specify as PostgreSQL source a name that
doesn't begin with a slash or a dot. The PostgreSQL
parameters will then be accessible as the name you've
given the source in its definition, an underscore, and the
name of the parameter. For example, if the map is speci-
fied as "<a href="pgsql_table.5.html">pgsql</a>:<i>pgsqlname</i>", the parameter "hosts" below
- would be defined in main.cf as "<i>pgsqlname</i>_hosts".
+ would be defined in <a href="postconf.5.html">main.cf</a> as "<i>pgsqlname</i>_hosts".
Note: with this form, the passwords for the PostgreSQL
- sources are written in main.cf, which is normally world-
+ sources are written in <a href="postconf.5.html">main.cf</a>, which is normally world-
readable. Support for this form will be removed in a
future Postfix version.
<b>query</b> The SQL query template used to search the database,
where <b>%s</b> is a substitute for the address Postfix is
trying to resolve, e.g.
- query = SELECT replacement FROM aliases WHERE
- mailbox = '%s'
+ query = SELECT replacement FROM aliases WHERE mailbox = '%s'
- This parameter supports the following '%' expan-
+ This parameter supports the following '%' expan-
sions:
<b>%%</b> This is replaced by a literal '%' character.
(Postfix 2.2 and later)
- <b>%s</b> This is replaced by the input key. SQL
- quoting is used to make sure that the input
- key does not add unexpected metacharacters.
+ <b>%s</b> This is replaced by the input key. SQL
+ quoting is used to make sure that the input
+ key does not add unexpected metacharacters.
<b>%u</b> When the input key is an address of the form
user@domain, <b>%u</b> is replaced by the SQL
- quoted local part of the address. Other-
- wise, <b>%u</b> is replaced by the entire search
- string. If the localpart is empty, the
- query is suppressed and returns no results.
+ quoted local part of the address. Other-
+ wise, <b>%u</b> is replaced by the entire search
+ string. If the localpart is empty, the
+ query is suppressed and returns no results.
<b>%d</b> When the input key is an address of the form
user@domain, <b>%d</b> is replaced by the SQL
- quoted domain part of the address. Other-
+ quoted domain part of the address. Other-
wise, the query is suppressed and returns no
results.
<b>%[SUD]</b> The upper-case equivalents of the above
- expansions behave in the <b>query</b> parameter
+ expansions behave in the <b>query</b> parameter
identically to their lower-case counter-
parts. With the <b>result_format</b> parameter
(see below), they expand the input key
rather than the result value.
- The above %S, %U and %D expansions are
+ The above %S, %U and %D expansions are
available with Postfix 2.2 and later
- <b>%[1-9]</b> The patterns %1, %2, ... %9 are replaced by
+ <b>%[1-9]</b> The patterns %1, %2, ... %9 are replaced by
the corresponding most significant component
- of the input key's domain. If the input key
+ of the input key's domain. If the input key
is <i>user@mail.example.com</i>, then %1 is <b>com</b>, %2
- is <b>example</b> and %3 is <b>mail</b>. If the input key
+ is <b>example</b> and %3 is <b>mail</b>. If the input key
is unqualified or does not have enough
- domain components to satisfy all the speci-
- fied patterns, the query is suppressed and
+ domain components to satisfy all the speci-
+ fied patterns, the query is suppressed and
returns no results.
- The above %1, ... %9 expansions are avail-
+ The above %1, ... %9 expansions are avail-
able with Postfix 2.2 and later
- The <b>domain</b> parameter described below limits the
- input keys to addresses in matching domains. When
- the <b>domain</b> parameter is non-empty, SQL queries for
- unqualified addresses or addresses in non-matching
+ The <b>domain</b> parameter described below limits the
+ input keys to addresses in matching domains. When
+ the <b>domain</b> parameter is non-empty, SQL queries for
+ unqualified addresses or addresses in non-matching
domains are suppressed and return no results.
- The precedence of this parameter has changed with
- Postfix 2.2, in prior releases the precedence was,
- from highest to lowest, <b>select_function</b>, <b>query</b>,
+ The precedence of this parameter has changed with
+ Postfix 2.2, in prior releases the precedence was,
+ from highest to lowest, <b>select_function</b>, <b>query</b>,
<b>select_field</b>, ...
- With Postfix 2.2 the <b>query</b> parameter has highest
+ With Postfix 2.2 the <b>query</b> parameter has highest
precedence, see COMPATIBILITY above.
NOTE: DO NOT put quotes around the <b>query</b> parameter.
<b>result_format (default: %s</b>)
- Format template applied to result attributes. Most
- commonly used to append (or prepend) text to the
- result. This parameter supports the following '%'
+ Format template applied to result attributes. Most
+ commonly used to append (or prepend) text to the
+ result. This parameter supports the following '%'
expansions:
<b>%%</b> This is replaced by a literal '%' character.
- <b>%s</b> This is replaced by the value of the result
- attribute. When result is empty it is
+ <b>%s</b> This is replaced by the value of the result
+ attribute. When result is empty it is
skipped.
- <b>%u</b> When the result attribute value is an
+ <b>%u</b> When the result attribute value is an
address of the form user@domain, <b>%u</b> is
- replaced by the local part of the address.
+ replaced by the local part of the address.
When the result has an empty localpart it is
skipped.
- <b>%d</b> When a result attribute value is an address
- of the form user@domain, <b>%d</b> is replaced by
+ <b>%d</b> When a result attribute value is an address
+ of the form user@domain, <b>%d</b> is replaced by
the domain part of the attribute value. When
the result is unqualified it is skipped.
<b>%[SUD1-9]</b>
- The upper-case and decimal digit expansions
+ The upper-case and decimal digit expansions
interpolate the parts of the input key
- rather than the result. Their behavior is
- identical to that described with <b>query</b>, and
- in fact because the input key is known in
- advance, queries whose key does not contain
- all the information specified in the result
- template are suppressed and return no
+ rather than the result. Their behavior is
+ identical to that described with <b>query</b>, and
+ in fact because the input key is known in
+ advance, queries whose key does not contain
+ all the information specified in the result
+ template are suppressed and return no
results.
For example, using "result_format = <a href="smtp.8.html">smtp</a>:[%s]"
allows one to use a mailHost attribute as the basis
- of a <a href="transport.5.html">transport(5)</a> table. After applying the result
- format, multiple values are concatenated as comma
- separated strings. The expansion_limit and parame-
+ of a <a href="transport.5.html">transport(5)</a> table. After applying the result
+ format, multiple values are concatenated as comma
+ separated strings. The expansion_limit and parame-
ter explained below allows one to restrict the num-
- ber of values in the result, which is especially
+ ber of values in the result, which is especially
useful for maps that must return at most one value.
- The default value <b>%s</b> specifies that each result
+ The default value <b>%s</b> specifies that each result
value should be used as is.
- This parameter is available with Postfix 2.2 and
+ This parameter is available with Postfix 2.2 and
later.
NOTE: DO NOT put quotes around the result format!
<b>domain (default: no domain list)</b>
- This is a list of domain names, paths to files, or
- dictionaries. When specified, only fully qualified
- search keys with a *non-empty* localpart and a
- matching domain are eligible for lookup: 'user'
- lookups, bare domain lookups and "@domain" lookups
- are not performed. This can significantly reduce
+ This is a list of domain names, paths to files, or
+ dictionaries. When specified, only fully qualified
+ search keys with a *non-empty* localpart and a
+ matching domain are eligible for lookup: 'user'
+ lookups, bare domain lookups and "@domain" lookups
+ are not performed. This can significantly reduce
the query load on the PostgreSQL server.
- domain = postfix.org, hash:/etc/postfix/search-
- domains
+ domain = postfix.org, hash:/etc/postfix/searchdomains
It is best not to use SQL to store the domains eli-
gible for SQL lookups.
<b>${sasl_sender</b>}
This macro expands to the SASL sender name
- (i.e. the original submitter as per RFC
- 2554) used during the reception of the mes-
+ (i.e. the original submitter as per <a href="http://www.faqs.org/rfcs/rfc2554.html">RFC</a>
+ <a href="http://www.faqs.org/rfcs/rfc2554.html">2554</a>) used during the reception of the mes-
sage.
This is available in Postfix 2.2 and later.
delete all mail with exactly one recipient
<b>user@example.com</b>:
- mailq | tail +2 | grep -v '^ *(' | awk 'BEGIN { RS
- = "" }
+ mailq | tail +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" }
# $7=sender, $8=recipient1, $9=recipient2
{ if ($8 == "user@example.com" && $9 == "")
print $1 }
' | tr -d '*!' | postsuper -d -
- Specify "<b>-d ALL</b>" to remove all messages; for exam-
- ple, specify "<b>-d ALL deferred</b>" to delete all mail
- in the <b>deferred</b> queue. As a safety measure, the
+ Specify "<b>-d ALL</b>" to remove all messages; for exam-
+ ple, specify "<b>-d ALL deferred</b>" to delete all mail
+ in the <b>deferred</b> queue. As a safety measure, the
word <b>ALL</b> must be specified in upper case.
- Warning: Postfix queue IDs are reused. There is a
- very small possibility that postsuper deletes the
- wrong message file when it is executed while the
+ Warning: Postfix queue IDs are reused. There is a
+ very small possibility that postsuper deletes the
+ wrong message file when it is executed while the
Postfix mail system is delivering mail.
The scenario is as follows:
- 1) The Postfix queue manager deletes the mes-
- sage that <a href="postsuper.1.html"><b>postsuper</b>(1)</a> is asked to delete,
+ 1) The Postfix queue manager deletes the mes-
+ sage that <a href="postsuper.1.html"><b>postsuper</b>(1)</a> is asked to delete,
because Postfix is finished with the message
- (it is delivered, or it is returned to the
+ (it is delivered, or it is returned to the
sender).
- 2) New mail arrives, and the new message is
- given the same queue ID as the message that
- <a href="postsuper.1.html"><b>postsuper</b>(1)</a> is supposed to delete. The
- probability for reusing a deleted queue ID
+ 2) New mail arrives, and the new message is
+ given the same queue ID as the message that
+ <a href="postsuper.1.html"><b>postsuper</b>(1)</a> is supposed to delete. The
+ probability for reusing a deleted queue ID
is about 1 in 2**15 (the number of different
microsecond values that the system clock can
distinguish within a second).
- 3) <a href="postsuper.1.html"><b>postsuper</b>(1)</a> deletes the new message,
- instead of the old message that it should
+ 3) <a href="postsuper.1.html"><b>postsuper</b>(1)</a> deletes the new message,
+ instead of the old message that it should
have deleted.
<b>-h</b> <i>queue</i><b>_</b><i>id</i>
- Put mail "on hold" so that no attempt is made to
- deliver it. Move one message with the named queue
+ Put mail "on hold" so that no attempt is made to
+ deliver it. Move one message with the named queue
ID from the named mail queue(s) (default: <b>incoming</b>,
<b>active</b> and <b>deferred</b>) to the <b>hold</b> queue.
- If a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads
+ If a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads
queue IDs from standard input.
Specify "<b>-h ALL</b>" to hold all messages; for example,
- specify "<b>-h ALL deferred</b>" to hold all mail in the
- <b>deferred</b> queue. As a safety measure, the word <b>ALL</b>
+ specify "<b>-h ALL deferred</b>" to hold all mail in the
+ <b>deferred</b> queue. As a safety measure, the word <b>ALL</b>
must be specified in upper case.
- Note: while mail is "on hold" it will not expire
- when its time in the queue exceeds the <b><a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
+ Note: while mail is "on hold" it will not expire
+ when its time in the queue exceeds the <b><a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
<b><a href="postconf.5.html#maximal_queue_lifetime">mal_queue_lifetime</a></b> or <b><a href="postconf.5.html#bounce_queue_lifetime">bounce_queue_lifetime</a></b> set-
- ting. It becomes subject to expiration after it is
+ ting. It becomes subject to expiration after it is
released from "hold".
<b>-H</b> <i>queue</i><b>_</b><i>id</i>
Release mail that was put "on hold". Move one mes-
- sage with the named queue ID from the named mail
+ sage with the named queue ID from the named mail
queue(s) (default: <b>hold</b>) to the <b>deferred</b> queue.
- If a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads
+ If a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads
queue IDs from standard input.
- Note: specify "<b>postsuper -r</b>" to release mail that
- was kept on hold for a significant fraction of
- <b>$<a href="postconf.5.html#maximal_queue_lifetime">maximal_queue_lifetime</a></b> or <b>$<a href="postconf.5.html#bounce_queue_lifetime">bounce_queue_lifetime</a></b>,
+ Note: specify "<b>postsuper -r</b>" to release mail that
+ was kept on hold for a significant fraction of
+ <b>$<a href="postconf.5.html#maximal_queue_lifetime">maximal_queue_lifetime</a></b> or <b>$<a href="postconf.5.html#bounce_queue_lifetime">bounce_queue_lifetime</a></b>,
or longer.
- Specify "<b>-H ALL</b>" to release all mail that is "on
- hold". As a safety measure, the word <b>ALL</b> must be
+ Specify "<b>-H ALL</b>" to release all mail that is "on
+ hold". As a safety measure, the word <b>ALL</b> must be
specified in upper case.
- <b>-p</b> Purge old temporary files that are left over after
+ <b>-p</b> Purge old temporary files that are left over after
system or software crashes.
<b>-r</b> <i>queue</i><b>_</b><i>id</i>
- Requeue the message with the named queue ID from
- the named mail queue(s) (default: <b>hold</b>, <b>incoming</b>,
- <b>active</b> and <b>deferred</b>). To requeue multiple mes-
+ Requeue the message with the named queue ID from
+ the named mail queue(s) (default: <b>hold</b>, <b>incoming</b>,
+ <b>active</b> and <b>deferred</b>). To requeue multiple mes-
sages, specify multiple <b>-r</b> command-line options.
Alternatively, if a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the
program reads queue IDs from standard input.
- Specify "<b>-r ALL</b>" to requeue all messages. As a
- safety measure, the word <b>ALL</b> must be specified in
+ Specify "<b>-r ALL</b>" to requeue all messages. As a
+ safety measure, the word <b>ALL</b> must be specified in
upper case.
- A requeued message is moved to the <b>maildrop</b> queue,
- from where it is copied by the <a href="pickup.8.html"><b>pickup</b>(8)</a> and
- <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemons to a new queue file. In many
- respects its handling differs from that of a new
+ A requeued message is moved to the <b>maildrop</b> queue,
+ from where it is copied by the <a href="pickup.8.html"><b>pickup</b>(8)</a> and
+ <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemons to a new queue file. In many
+ respects its handling differs from that of a new
local submission.
- <b>o</b> The message is not subjected to the
+ <b>o</b> The message is not subjected to the
<a href="postconf.5.html#smtpd_milters">smtpd_milters</a> or <a href="postconf.5.html#non_smtpd_milters">non_smtpd_milters</a> settings.
- When mail has passed through an external
+ When mail has passed through an external
content filter, this would produce incorrect
results with Milter applications that depend
- on original SMTP connection state informa-
+ on original SMTP connection state informa-
tion.
<b>o</b> The message is subjected again to mail
address rewriting and substitution. This is
- useful when rewriting rules or virtual map-
+ useful when rewriting rules or virtual map-
pings have changed.
The address rewriting context (local or
- remote) is the same as when the message was
+ remote) is the same as when the message was
received.
- <b>o</b> The message is subjected to the same <a href="postconf.5.html#content_filter">con</a>-
- <a href="postconf.5.html#content_filter">tent_filter</a> settings (if any) as used for
- new local mail submissions. This is useful
+ <b>o</b> The message is subjected to the same <a href="postconf.5.html#content_filter">con</a>-
+ <a href="postconf.5.html#content_filter">tent_filter</a> settings (if any) as used for
+ new local mail submissions. This is useful
when <a href="postconf.5.html#content_filter">content_filter</a> settings have changed.
- Warning: Postfix queue IDs are reused. There is a
- very small possibility that <a href="postsuper.1.html"><b>postsuper</b>(1)</a> requeues
- the wrong message file when it is executed while
- the Postfix mail system is running, but no harm
+ Warning: Postfix queue IDs are reused. There is a
+ very small possibility that <a href="postsuper.1.html"><b>postsuper</b>(1)</a> requeues
+ the wrong message file when it is executed while
+ the Postfix mail system is running, but no harm
should be done.
- <b>-s</b> Structure check and structure repair. This should
+ <b>-s</b> Structure check and structure repair. This should
be done once before Postfix startup.
- <b>o</b> Rename files whose name does not match the
+ <b>o</b> Rename files whose name does not match the
message file inode number. This operation is
- necessary after restoring a mail queue from
+ necessary after restoring a mail queue from
a different machine, or from backup media.
<b>o</b> Move queue files that are in the wrong place
in the file system hierarchy and remove sub-
directories that are no longer needed. File
- position rearrangements are necessary after
+ position rearrangements are necessary after
a change in the <b><a href="postconf.5.html#hash_queue_names">hash_queue_names</a></b> and/or
<b><a href="postconf.5.html#hash_queue_depth">hash_queue_depth</a></b> configuration parameters.
<b>-v</b> Enable verbose logging for debugging purposes. Mul-
- tiple <b>-v</b> options make the software increasingly
+ tiple <b>-v</b> options make the software increasingly
verbose.
<b>DIAGNOSTICS</b>
- Problems are reported to the standard error stream and to
+ Problems are reported to the standard error stream and to
<b>syslogd</b>(8).
- <a href="postsuper.1.html"><b>postsuper</b>(1)</a> reports the number of messages deleted with
- <b>-d</b>, the number of messages requeued with <b>-r</b>, and the num-
- ber of messages whose queue file name was fixed with <b>-s</b>.
- The report is written to the standard error stream and to
+ <a href="postsuper.1.html"><b>postsuper</b>(1)</a> reports the number of messages deleted with
+ <b>-d</b>, the number of messages requeued with <b>-r</b>, and the num-
+ ber of messages whose queue file name was fixed with <b>-s</b>.
+ The report is written to the standard error stream and to
<b>syslogd</b>(8).
<b>ENVIRONMENT</b>
Directory with the <a href="postconf.5.html"><b>main.cf</b></a> file.
<b>BUGS</b>
- Mail that is not sanitized by Postfix (i.e. mail in the
+ Mail that is not sanitized by Postfix (i.e. mail in the
<b>maildrop</b> queue) cannot be placed "on hold".
<b>CONFIGURATION PARAMETERS</b>
- The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant
+ The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant
to this program. The text below provides only a parameter
- summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for more details including exam-
+ summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for more details including exam-
ples.
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
- The default location of the Postfix <a href="postconf.5.html">main.cf</a> and
+ The default location of the Postfix <a href="postconf.5.html">main.cf</a> and
<a href="master.5.html">master.cf</a> configuration files.
<b><a href="postconf.5.html#hash_queue_depth">hash_queue_depth</a> (1)</b>
- The number of subdirectory levels for queue direc-
- tories listed with the <a href="postconf.5.html#hash_queue_names">hash_queue_names</a> parameter.
+ The number of subdirectory levels for queue direc-
+ tories listed with the <a href="postconf.5.html#hash_queue_names">hash_queue_names</a> parameter.
<b><a href="postconf.5.html#hash_queue_names">hash_queue_names</a> (deferred, defer)</b>
- The names of queue directories that are split
+ The names of queue directories that are split
across multiple subdirectory levels.
<b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
- The location of the Postfix top-level queue direc-
+ The location of the Postfix top-level queue direc-
tory.
<b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
The syslog facility of Postfix logging.
<b><a href="postconf.5.html#syslog_name">syslog_name</a> (postfix)</b>
- The mail system name that is prepended to the
- process name in syslog records, so that "smtpd"
+ The mail system name that is prepended to the
+ process name in syslog records, so that "smtpd"
becomes, for example, "postfix/smtpd".
<b>SEE ALSO</b>
<a href="postqueue.1.html">postqueue(1)</a>, unprivileged queue operations
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
<b>DESCRIPTION</b>
The Postfix mail system uses optional tables for address
- rewriting or mail routing. These tables are usually in <b>dbm</b>
- or <b>db</b> format.
+ rewriting, mail routing, or access control. These tables
+ are usually in <b>dbm</b> or <b>db</b> format.
Alternatively, lookup tables can be specified in POSIX
regular expression form. In this case, each input is com-
The input format for the <a href="postmap.1.html"><b>postmap</b>(1)</a> command is as follows:
<b>o</b> An entry has one of the following form:
+
<i>pattern new</i><b>_</b><i>location</i>
+
Where <i>new</i><b>_</b><i>location</i> specifies contact information
such as an email address, or perhaps a street
address or telephone number.
<b>DESCRIPTION</b>
The optional <a href="transport.5.html"><b>transport</b>(5)</a> table specifies a mapping from
email addresses to message delivery transports and next-
- hop hosts. The table is searched by the <a href="trivial-rewrite.8.html"><b>trivial-rewrite</b>(8)</a>
- daemon.
+ hop destinations. Message delivery transports such as
+ <b>local</b> or <b>smtp</b> are defined in the <a href="master.5.html"><b>master.cf</b></a> file, and next-
+ hop destinations are typically hosts or domain names. The
+ table is searched by the <a href="trivial-rewrite.8.html"><b>trivial-rewrite</b>(8)</a> daemon.
This mapping overrides the default <i>transport</i>:<i>nexthop</i>
selection that is built into Postfix:
<b>my.domain :</b>
<b>.my.domain :</b>
- <b>* <a href="smtp.8.html">smtp</a>:outbound-relay.my.domain</b>
+ <b>* <a href="smtp.8.html">smtp</a>:outbound-relay.my.domain</b>
In order to send mail for <b>example.com</b> and its subdomains
via the <b>uucp</b> transport to the UUCP host named <b>example</b>:
The error mailer can be used to bounce mail:
- <b>.example.com <a href="error.8.html">error</a>:mail for *.example.com is not</b>
- <b>deliverable</b>
+ <b>.example.com <a href="error.8.html">error</a>:mail for *.example.com is not deliverable</b>
- This causes all mail for <i>user</i>@<i>anything</i><b>.example.com</b> to be
+ This causes all mail for <i>user</i>@<i>anything</i><b>.example.com</b> to be
bounced.
<b>REGULAR EXPRESSION TABLES</b>
- This section describes how the table lookups change when
+ This section describes how the table lookups change when
the table is given in the form of regular expressions. For
- a description of regular expression lookup table syntax,
+ a description of regular expression lookup table syntax,
see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>.
- Each pattern is a regular expression that is applied to
- the entire address being looked up. Thus,
- <i>some.domain.hierarchy</i> is not looked up via its parent
- domains, nor is <i>user+foo@domain</i> looked up as <i>user@domain</i>.
+ Each pattern is a regular expression that is applied to
+ the entire address being looked up. Thus,
+ <i>some.domain.hierarchy</i> is not looked up via its parent
+ domains, nor is <i>user+foo@domain</i> looked up as <i>user@domain</i>.
- Patterns are applied in the order as specified in the ta-
- ble, until a pattern is found that matches the search
+ Patterns are applied in the order as specified in the ta-
+ ble, until a pattern is found that matches the search
string.
- Results are the same as with indexed file lookups, with
- the additional feature that parenthesized substrings from
- the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
+ The <a href="trivial-rewrite.8.html"><b>trivial-rewrite</b>(8)</a> server disallows regular expression
+ substitution of $1 etc. in regular expression lookup
+ tables, because that could open a security hole (Postfix
+ version 2.3 and later).
<b>TCP-BASED TABLES</b>
This section describes how the table lookups change when
Postfix SMTP server accepts mail for any recipient
in <i>domain</i>, regardless of whether that recipient
exists. This may turn your mail system into a
- backscatter source that returns undeliverable spam
- to innocent people.
+ backscatter source: Postfix first accepts mail for
+ non-existent recipients and then tries to return
+ that mail as "undeliverable" to the often forged
+ sender address.
<b>RESULT ADDRESS REWRITING</b>
The lookup result is subject to address rewriting:
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#virtual_alias_maps">virtual_alias_maps</a> = hash:/etc/postfix/virtual
- Note: some systems use <b>dbm</b> databases instead of <b>hash</b>.
- See the output from "<b>postconf -m</b>" for available data-
- base types.
+ Note: some systems use <b>dbm</b> databases instead of <b>hash</b>. See
+ the output from "<b>postconf -m</b>" for available database
+ types.
/etc/postfix/<a href="virtual.8.html">virtual</a>:
- <i>virtual-alias.domain anything</i> (right-hand content does not matter)
- <i>postmaster@virtual-alias.domain postmaster</i>
- <i>user1@virtual-alias.domain address1</i>
- <i>user2@virtual-alias.domain address2, address3</i>
+ <i>virtual-alias.domain anything</i> (right-hand content does not matter)
+ <i>postmaster@virtual-alias.domain postmaster</i>
+ <i>user1@virtual-alias.domain address1</i>
+ <i>user2@virtual-alias.domain address2, address3</i>
The <i>virtual-alias.domain anything</i> entry is required for a
<a href="ADDRESS_CLASS_README.html#virtual_alias_class">virtual alias domain</a>. <b>Without this entry, mail is rejected</b>
lookup tables, or updates an existing one. The input and output
file formats are expected to be compatible with:
-.ti +4
-\fBmakemap \fIfile_type\fR \fIfile_name\fR < \fIfile_name\fR
+.nf
+ \fBmakemap \fIfile_type\fR \fIfile_name\fR < \fIfile_name\fR
+.fi
If the result files do not exist they will be created with the
same group and other read permissions as their source file.
.IP \(bu
A table entry has the form
.sp
-.ti +5
-\fIkey\fR whitespace \fIvalue\fR
+.nf
+ \fIkey\fR whitespace \fIvalue\fR
+.fi
.IP \(bu
Empty lines and whitespace-only lines are ignored, as
are lines whose first non-whitespace character is a `#'.
queue IDs from standard input. For example, to delete all mail
with exactly one recipient \fBuser@example.com\fR:
.sp
+.nf
mailq | tail +2 | grep -v '^ *(' | awk \'BEGIN { RS = "" }
-.ti +4
-# $7=sender, $8=recipient1, $9=recipient2
-.ti +4
-{ if ($8 == "user@example.com" && $9 == "")
-.ti +10
-print $1 }
-.br
+ # $7=sender, $8=recipient1, $9=recipient2
+ { if ($8 == "user@example.com" && $9 == "")
+ print $1 }
\' | tr -d '*!' | postsuper -d -
+.fi
.sp
Specify "\fB-d ALL\fR" to remove all messages; for example, specify
"\fB-d ALL deferred\fR" to delete all mail in the \fBdeferred\fR queue.
"\fBpostconf -m\fR" to find out what lookup tables Postfix
supports on your system.
-.na
.nf
+.na
/etc/postfix/main.cf:
-.in +4
-smtpd_client_restrictions =
-.in +4
-check_client_access hash:/etc/postfix/access
+ smtpd_client_restrictions =
+ check_client_access hash:/etc/postfix/access
-.in -8
/etc/postfix/access:
-.in +4
-1.2.3 REJECT
-1.2.3.4 OK
-.in -4
+ 1.2.3 REJECT
+ 1.2.3.4 OK
+.fi
+.ad
Execute the command "\fBpostmap /etc/postfix/access\fR" after
editing the file.
.IP \(bu
An alias definition has the form
.sp
-.ti +5
-\fIname\fR: \fIvalue1\fR, \fIvalue2\fR, \fI...\fR
+.nf
+ \fIname\fR: \fIvalue1\fR, \fIvalue2\fR, \fI...\fR
+.fi
.IP \(bu
Empty lines and whitespace-only lines are ignored, as
are lines whose first non-whitespace character is a `#'.
To preview the results of $\fIname\fR expansions in the
template text, use the command
-.ti +4
-\fBpostconf -b\fR \fItemporary_file\fR
+.nf
+ \fBpostconf -b\fR \fItemporary_file\fR
+.fi
Errors in the template will be reported to the standard
error stream and to the syslog daemon.
Postfix configuration directory and specify in main.cf
something like:
+.nf
/etc/postfix/main.cf:
-.ti +4
bounce_template_file = /etc/postfix/bounce.cf
+.fi
.SH "TEMPLATE FILE FORMAT"
.na
.nf
it in quotes as with the shell or with Perl (\fItemplate_name\fB
= <<'EOF'\fR). Here is an example:
-.in +4
.nf
-.na
-# The failure template is used for undeliverable mail.
+ # The failure template is used for undeliverable mail.
-failure_template = <<EOF
-Charset: us-ascii
-From: MAILER-DAEMON (Mail Delivery System)
-Subject: Undelivered Mail Returned to Sender
-Postmaster-Subject: Postmaster Copy: Undelivered Mail
+ failure_template = <<EOF
+ Charset: us-ascii
+ From: MAILER-DAEMON (Mail Delivery System)
+ Subject: Undelivered Mail Returned to Sender
+ Postmaster-Subject: Postmaster Copy: Undelivered Mail
-This is the mail system at host $myhostname.
+ This is the mail system at host $myhostname.
-I'm sorry to have to inform you that your message could not
-be delivered to one or more recipients. It's attached below.
+ I'm sorry to have to inform you that your message could not
+ be delivered to one or more recipients. It's attached below.
-For further assistance, please send mail to postmaster.
+ For further assistance, please send mail to postmaster.
-If you do so, please include this problem report. You can
-delete your own text from the attached returned message.
+ If you do so, please include this problem report. You can
+ delete your own text from the attached returned message.
-.ti +12
- The mail system
-EOF
-.in -4
-.ad
+ The mail system
+ EOF
.fi
.PP
The usage and specification of bounce templates is
to recipient addresses, the Postfix SMTP server accepts
mail for any recipient in \fIdomain\fR, regardless of whether
that recipient exists. This may turn your mail system into
-a backscatter source that returns undeliverable spam to
-innocent people.
+a backscatter source: Postfix first accepts mail for
+non-existent recipients and then tries to return that mail
+as "undeliverable" to the often forged sender address.
.SH "RESULT ADDRESS REWRITING"
.na
.nf
.SH "EXAMPLE SMTPD ACCESS MAP"
.na
.nf
+.nf
/etc/postfix/main.cf:
-.ti +4
-smtpd_client_restrictions = ... cidr:/etc/postfix/client.cidr ...
+ smtpd_client_restrictions = ... cidr:/etc/postfix/client.cidr ...
/etc/postfix/client.cidr:
-.in +4
-# Rule order matters. Put more specific whitelist entries
-# before more general blacklist entries.
-192.168.1.1 OK
-192.168.0.0/16 REJECT
-.in -4
+ # Rule order matters. Put more specific whitelist entries
+ # before more general blacklist entries.
+ 192.168.1.1 OK
+ 192.168.0.0/16 REJECT
+.fi
.SH "SEE ALSO"
.na
.nf
.na
.nf
/etc/postfix/main.cf:
-.in +4
smtp_generic_maps = hash:/etc/postfix/generic
-.in -4
/etc/postfix/generic:
-.in +4
his@localdomain.local hisaccount@hisisp.example
her@localdomain.local heraccount@herisp.example
@localdomain.local hisaccount+local@hisisp.example
-.in -4
.ad
.fi
.SH "SYNOPSIS"
.na
.nf
+.nf
\fBheader_checks = pcre:/etc/postfix/header_checks\fR
-.br
\fBmime_header_checks = pcre:/etc/postfix/mime_header_checks\fR
-.br
\fBnested_header_checks = pcre:/etc/postfix/nested_header_checks\fR
-.br
\fBbody_checks = pcre:/etc/postfix/body_checks\fR
.sp
\fBpostmap -q "\fIstring\fB" pcre:/etc/postfix/\fIfilename\fR
-.br
\fBpostmap -q - pcre:/etc/postfix/\fIfilename\fR <\fIinputfile\fR
+.fi
.SH DESCRIPTION
.ad
.fi
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.
+.SH "COMPATIBILITY"
+.na
+.nf
+.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.
.SH "TABLE FORMAT"
.na
.nf
to the next line.
.IP \(bu
If text in the message body is encoded
-(RFC 2045) then the rules have to specified for the encoded
+(RFC 2045) then the rules need to be specified for the encoded
form.
.IP \(bu
Likewise, when message headers are encoded (RFC
.na
.nf
/etc/postfix/main.cf:
-.ti +4
-header_checks = regexp:/etc/postfix/header_checks
+ header_checks = regexp:/etc/postfix/header_checks
/etc/postfix/header_checks:
-.ti +4
-/^content-(type|disposition):.*name[[:space:]]*=.*\\.(exe|vbs)/
-.ti +8
-REJECT Bad attachment file name extension: $2
+ /^content-(type|disposition):.*name[[:space:]]*=.*\\.(exe|vbs)/
+ REJECT Bad attachment file name extension: $2
.ad
.fi
.na
.nf
/etc/postfix/main.cf:
-.ti +4
-body_checks = regexp:/etc/postfix/body_checks
+ body_checks = regexp:/etc/postfix/body_checks
/etc/postfix/body_checks:
-.ti +4
-/^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
-.ti +8
-REJECT IFRAME vulnerability exploit
+ /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
+ REJECT IFRAME vulnerability exploit
.SH "SEE ALSO"
.na
.nf
In order to use LDAP lookups, define an LDAP source as a lookup
table in main.cf, for example:
-.ti +4
-alias_maps = ldap:/etc/postfix/ldap-aliases.cf
+.nf
+ alias_maps = ldap:/etc/postfix/ldap-aliases.cf
+.fi
The file /etc/postfix/ldap-aliases.cf has the same format as
the Postfix main.cf file, and can specify the parameters
For example, NEVER do this in a map defining $mydestination:
-.in +4
-query_filter = domain=*
-.br
-result_attribute = domain
-.in -4
+.nf
+ query_filter = domain=*
+ result_attribute = domain
+.fi
Do this instead:
-.in +4
-query_filter = domain=%s
-.br
-result_attribute = domain
-.in -4
+.nf
+ query_filter = domain=%s
+ result_attribute = domain
+.fi
.SH "GENERAL LDAP PARAMETERS"
.na
.nf
.IP "\fBserver_host (default: localhost)\fR"
The name of the host running the LDAP server, e.g.
-.ti +4
-server_host = ldap.example.com
+.nf
+ server_host = ldap.example.com
+.fi
Depending on the LDAP client library you're using, it should
be possible to specify multiple servers here, with the library
be possible to give each server in the list a different port
(overriding \fBserver_port\fR below), by naming them like
-.ti +4
-server_host = ldap.example.com:1444
+.nf
+ server_host = ldap.example.com:1444
+.fi
With OpenLDAP, a (list of) LDAP URLs can be used to specify both
the hostname(s) and the port(s):
-.ti +4
-server_host = ldap://ldap.example.com:1444
-.ti +8
- ldap://ldap2.example.com:1444
+.nf
+ server_host = ldap://ldap.example.com:1444
+ ldap://ldap2.example.com:1444
+.fi
All LDAP URLs accepted by the OpenLDAP library are supported,
including connections over UNIX domain sockets, and LDAP SSL
(the last one provided that OpenLDAP was compiled with support
for SSL):
-.ti +4
-server_host = ldapi://%2Fsome%2Fpath
-.ti +8
- ldaps://ldap.example.com:636
+.nf
+ server_host = ldapi://%2Fsome%2Fpath
+ ldaps://ldap.example.com:636
+.fi
.IP "\fBserver_port (default: 389)\fR"
The port the LDAP server listens on, e.g.
-.ti +4
-server_port = 778
+.nf
+ server_port = 778
+.fi
.IP "\fBtimeout (default: 10 seconds)\fR"
The number of seconds a search can take before timing out, e.g.
-.ti +4
-timeout = 5
+.fi
+ timeout = 5
+.fi
.IP "\fBsearch_base (No default; you must configure this)\fR"
The RFC2253 base DN at which to conduct the search, e.g.
-.ti +4
-search_base = dc=your, dc=com
+.nf
+ search_base = dc=your, dc=com
+.fi
.IP
With Postfix 2.2 and later this parameter supports the
following '%' expansions:
is a substitute for the address Postfix is trying to resolve,
e.g.
-.ti +4
-query_filter = (&(mail=%s)(paid_up=true))
+.nf
+ query_filter = (&(mail=%s)(paid_up=true))
+.fi
This parameter supports the following '%' expansions:
.RS
and "@domain" lookups are not performed. This can significantly
reduce the query load on the LDAP server.
-.ti +4
-domain = postfix.org, hash:/etc/postfix/searchdomains
+.nf
+ domain = postfix.org, hash:/etc/postfix/searchdomains
+.fi
It is best not to use LDAP to store the domains eligible
for LDAP lookups.
entries returned by the lookup, to be resolved to an email
address.
-.ti +4
-result_attribute = mailbox, maildrop
+.nf
+ result_attribute = mailbox, maildrop
+.fi
.IP "\fBspecial_result_attribute (default: empty)\fR"
The attribute(s) of directory entries that can contain DNs
or URLs. If found, a recursive subsequent search is done
using their values.
-.ti +4
-special_result_attribute = memberdn
+.nf
+ special_result_attribute = memberdn
+.fi
DN recursion retrieves the same result_attributes as the
main query, including the special attributes for further
where the group is expanded, possibly via mailing-list manager or
other special processing.
-.ti +4
-terminal_result_attribute = maildrop
+.nf
+ terminal_result_attribute = maildrop
+.fi
This feature is available with Postfix 2.4 or later.
.IP "\fBleaf_result_attribute (default: empty)\fR"
The attributes that represent the email addresses of objects
referenced via a DN (or LDAP URI) go in "leaf_result_attribute".
-.in +4
-result_attribute = memberaddr
-.br
-special_result_attribute = memberdn
-.br
-terminal_result_attribute = maildrop
-.br
-leaf_result_attribute = mail
-.in -4
+.nf
+ result_attribute = memberaddr
+ special_result_attribute = memberdn
+ terminal_result_attribute = maildrop
+ leaf_result_attribute = mail
+.fi
This feature is available with Postfix 2.4 or later.
.IP "\fBscope (default: sub)\fR"
implementations don't require clients to bind, which saves
time. Example:
-.ti +4
-bind = no
+.nf
+ bind = no
+.fi
If you do need to bind, you might consider configuring
Postfix to connect to the local machine on a port that's
.IP "\fBbind_dn (default: empty)\fR"
If you do have to bind, do it with this distinguished name. Example:
-.ti +4
-bind_dn = uid=postfix, dc=your, dc=com
+.nf
+ bind_dn = uid=postfix, dc=your, dc=com
+.fi
.IP "\fBbind_pw (default: empty)\fR"
The password for the distinguished name above. If you have
to use this, you probably want to make the map configuration
to allow local accounts to submit mail via the sendmail
command. Example:
-.ti +4
-bind_pw = postfixpw
+.nf
+ bind_pw = postfixpw
+.fi
.IP "\fBcache (IGNORED with a warning)\fR"
.IP "\fBcache_expiry (IGNORED with a warning)\fR"
.IP "\fBcache_size (IGNORED with a warning)\fR"
LDAP SSL service can be requested by using a LDAP SSL URL
in the server_host parameter:
-.ti +4
-server_host = ldaps://ldap.example.com:636
+.nf
+ server_host = ldaps://ldap.example.com:636
+.fi
STARTTLS can be turned on with the start_tls parameter:
-.ti +4
-start_tls = yes
+.nf
+ start_tls = yes
+.fi
Both forms require LDAP protocol version 3, which has to be set
explicitly with:
-.ti +4
-version = 3
+.nf
+ version = 3
+.fi
If any of the Postfix programs querying the map is configured in
master.cf to run chrooted, all the certificates and keys involved
aliases.
Assume that in main.cf, you have:
-.ti +4
-alias_maps = hash:/etc/aliases,
-.ti +8
-ldap:/etc/postfix/ldap-aliases.cf
+.nf
+ alias_maps = hash:/etc/aliases,
+ ldap:/etc/postfix/ldap-aliases.cf
+.fi
and in ldap:/etc/postfix/ldap-aliases.cf you have:
-.in +4
-server_host = ldap.example.com
-.br
-search_base = dc=example, dc=com
-.in -4
+.nf
+ server_host = ldap.example.com
+ search_base = dc=example, dc=com
+.fi
Upon receiving mail for a local address "ldapuser" that
isn't found in the /etc/aliases database, Postfix will
Alternatively, lookup tables can be specified as MySQL databases.
In order to use MySQL lookups, define a MySQL source as a lookup
table in main.cf, for example:
-.ti +4
-alias_maps = mysql:/etc/mysql-aliases.cf
+.nf
+ alias_maps = mysql:/etc/mysql-aliases.cf
+.fi
The file /etc/postfix/mysql-aliases.cf has the same format as
the Postfix main.cf file, and can specify the parameters
The old interface will be gradually phased out. To migrate to
the new interface set:
-.ti +4
-\fBquery\fR = SELECT [\fIselect_field\fR]
-.ti +8
-FROM [\fItable\fR]
-.ti +8
-WHERE [\fIwhere_field\fR] = '%s'
-.ti +12
-[\fIadditional_conditions\fR]
+.nf
+ \fBquery\fR = SELECT [\fIselect_field\fR]
+ FROM [\fItable\fR]
+ WHERE [\fIwhere_field\fR] = '%s'
+ [\fIadditional_conditions\fR]
+.fi
Insert the value, not the name, of each legacy parameter. Note
that the \fBadditional_conditions\fR parameter is optional
The hosts that Postfix will try to connect to and query from.
Specify \fIunix:\fR for UNIX domain sockets, \fIinet:\fR for TCP
connections (default). Example:
-.ti +4
-hosts = host1.some.domain host2.some.domain
-.ti +4
-hosts = unix:/file/name
+.nf
+ hosts = host1.some.domain host2.some.domain
+ hosts = unix:/file/name
+.fi
The hosts are tried in random order, with all connections over
UNIX domain sockets being tried before those over TCP. The
prefix it with \fIinet:\fR), MySQL will connect to the default
UNIX domain socket. In order to instruct MySQL to connect to
localhost over TCP you have to specify
-.ti +4
-hosts = 127.0.0.1
+.nf
+ hosts = 127.0.0.1
+.fi
.IP "\fBuser, password\fR"
The user name and password to log into the mysql server.
Example:
-.in +4
-user = someone
-.br
-password = some_password
-.in -4
+.nf
+ user = someone
+ password = some_password
+.fi
.IP "\fBdbname\fR"
The database name on the servers. Example:
-.ti +4
-dbname = customer_database
+.nf
+ dbname = customer_database
+.fi
.IP "\fBquery\fR"
The SQL query template used to search the database, where \fB%s\fR
is a substitute for the address Postfix is trying to resolve,
e.g.
-.ti +4
-query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+.nf
+ query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+.fi
This parameter supports the following '%' expansions:
.RS
\fBadditional_conditions\fR. The mapping from the old parameters
to the equivalent query is:
-.ti +4
-SELECT [\fBselect_field\fR]
-.ti +4
-FROM [\fBtable\fR]
-.ti +4
-WHERE [\fBwhere_field\fR] = '%s'
-.ti +10
-[\fBadditional_conditions\fR]
+.nf
+ SELECT [\fBselect_field\fR]
+ FROM [\fBtable\fR]
+ WHERE [\fBwhere_field\fR] = '%s'
+ [\fBadditional_conditions\fR]
+.fi
The '%s' in the \fBWHERE\fR clause expands to the escaped search string.
With Postfix 2.2 these legacy parameters are used if the \fBquery\fR
are eligible for lookup: 'user' lookups, bare domain lookups
and "@domain" lookups are not performed. This can significantly
reduce the query load on the MySQL server.
-.ti +4
-domain = postfix.org, hash:/etc/postfix/searchdomains
+.nf
+ domain = postfix.org, hash:/etc/postfix/searchdomains
+.fi
It is best not to use SQL to store the domains eligible
for SQL lookups.
The following parameters can be used to fill in a
SELECT template statement of the form:
-.ti +4
-SELECT [\fBselect_field\fR]
-.ti +4
-FROM [\fBtable\fR]
-.ti +4
-WHERE [\fBwhere_field\fR] = '%s'
-.ti +10
-[\fBadditional_conditions\fR]
+.nf
+ SELECT [\fBselect_field\fR]
+ FROM [\fBtable\fR]
+ WHERE [\fBwhere_field\fR] = '%s'
+ [\fBadditional_conditions\fR]
+.fi
The specifier %s is replaced by the search string, and is
escaped so if it contains single quotes or other odd characters,
interface may be removed in a future release.
.IP "\fBselect_field\fR"
The SQL "select" parameter. Example:
-.ti +4
-\fBselect_field\fR = forw_addr
+.nf
+ \fBselect_field\fR = forw_addr
+.fi
.IP "\fBtable\fR"
The SQL "select .. from" table name. Example:
-.ti +4
-\fBtable\fR = mxaliases
+.nf
+ \fBtable\fR = mxaliases
+.fi
.IP "\fBwhere_field\fR
The SQL "select .. where" parameter. Example:
-.ti +4
-\fBwhere_field\fR = alias
+.nf
+ \fBwhere_field\fR = alias
+.fi
.IP "\fBadditional_conditions\fR
Additional conditions to the SQL query. Example:
-.ti +4
-\fBadditional_conditions\fR = AND status = 'paid'
+.nf
+ \fBadditional_conditions\fR = AND status = 'paid'
+.fi
.SH "SEE ALSO"
.na
.nf
Most of the NIS+ query is specified via the NIS+ map name. The
general format of a Postfix NIS+ map name is as follows:
-.ti +4
-\fBnisplus:[\fIname\fB=%s];\fIname.name.name\fB.:\fIcolumn\fR
+.fi
+ \fBnisplus:[\fIname\fB=%s];\fIname.name.name\fB.:\fIcolumn\fR
+.fi
Postfix NIS+ map names differ from what one normally
would use with commands such as \fBniscat\fR:
.SH "EXAMPLE"
.na
.nf
+.ad
+.fi
A NIS+ aliases map might be queried as follows:
-.ti +4
-alias_maps = dbm:/etc/mail/aliases,
-.ti +2
+.nf
+ alias_maps = dbm:/etc/mail/aliases,
nisplus:[alias=%s];mail_aliases.org_dir.$mydomain.:1
-.ad
.fi
This queries the local aliases file before the NIS+ file.
.ad
.fi
The Postfix mail system uses optional tables for address
-rewriting or mail routing. These tables are usually in
-\fBdbm\fR or \fBdb\fR format.
+rewriting, mail routing, or access control. 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
Alternatively, lookup tables can be specified as PostgreSQL
databases. In order to use PostgreSQL lookups, define a
PostgreSQL source as a lookup table in main.cf, for example:
-.ti +4
-alias_maps = pgsql:/etc/pgsql-aliases.cf
+.nf
+ alias_maps = pgsql:/etc/pgsql-aliases.cf
+.fi
The file /etc/postfix/pgsql-aliases.cf has the same format as
the Postfix main.cf file, and can specify the parameters
\fBwhere_field\fR and \fBadditional_conditions\fR parameters. To
migrate to the new interface set:
-.ti +4
-\fBquery\fR = SELECT \fIselect_function\fR('%s')
+.nf
+ \fBquery\fR = SELECT \fIselect_function\fR('%s')
+.fi
or in the absence of \fBselection_function\fR, the lower precedence:
-.ti +4
-\fBquery\fR = SELECT \fIselect_field\fR
-.ti +8
-FROM \fItable\fR
-.ti +8
-WHERE \fIwhere_field\fR = '%s'
-.ti +12
-\fIadditional_conditions\fR
+.nf
+ \fBquery\fR = SELECT \fIselect_field\fR
+ FROM \fItable\fR
+ WHERE \fIwhere_field\fR = '%s'
+ \fIadditional_conditions\fR
+.fi
Use the value, not the name, of each legacy parameter. Note
that the \fBadditional_conditions\fR parameter is optional
The hosts that Postfix will try to connect to and query from.
Specify \fIunix:\fR for UNIX-domain sockets, \fIinet:\fR for TCP
connections (default). Example:
-.ti +4
-hosts = host1.some.domain host2.some.domain
-.ti +4
-hosts = unix:/file/name
+.nf
+ hosts = host1.some.domain host2.some.domain
+ hosts = unix:/file/name
+.fi
The hosts are tried in random order, with all connections over
UNIX domain sockets being tried before those over TCP. The
.IP "\fBuser, password\fR"
The user name and password to log into the pgsql server.
Example:
-.in +4
-user = someone
-.br
-password = some_password
-.in -4
+.nf
+ user = someone
+ password = some_password
+.fi
.IP "\fBdbname\fR"
The database name on the servers. Example:
-.ti +4
-dbname = customer_database
+.nf
+ dbname = customer_database
+.fi
.IP "\fBquery\fR"
The SQL query template used to search the database, where \fB%s\fR
is a substitute for the address Postfix is trying to resolve,
e.g.
-.ti +4
-query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+.nf
+ query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+.fi
This parameter supports the following '%' expansions:
.RS
are eligible for lookup: 'user' lookups, bare domain lookups
and "@domain" lookups are not performed. This can significantly
reduce the query load on the PostgreSQL server.
-.ti +4
-domain = postfix.org, hash:/etc/postfix/searchdomains
+.nf
+ domain = postfix.org, hash:/etc/postfix/searchdomains
+.fi
It is best not to use SQL to store the domains eligible
for SQL lookups.
Pre-Postfix 2.2 legacy interfaces:
.IP "\fBselect_function\fR"
This parameter specifies a database function name. Example:
-.ti +4
-select_function = my_lookup_user_alias
+.nf
+ select_function = my_lookup_user_alias
+.fi
This is equivalent to:
-.ti +4
-query = SELECT my_lookup_user_alias('%s')
+.nf
+ query = SELECT my_lookup_user_alias('%s')
+.fi
This parameter overrides the legacy table-related fields (described
below). With Postfix versions prior to 2.2, it also overrides the
\fBselect_function\fR interface described above) can be used to
build the SQL select statement as follows:
-.ti +4
-SELECT [\fBselect_field\fR]
-.ti +4
-FROM [\fBtable\fR]
-.ti +4
-WHERE [\fBwhere_field\fR] = '%s'
-.ti +10
-[\fBadditional_conditions\fR]
+.nf
+ SELECT [\fBselect_field\fR]
+ FROM [\fBtable\fR]
+ WHERE [\fBwhere_field\fR] = '%s'
+ [\fBadditional_conditions\fR]
+.fi
The specifier %s is replaced with each lookup by the lookup key
and is escaped so if it contains single quotes or other odd
\fBquery\fR interface as this interface is slated to be phased out.
.IP "\fBselect_field\fR"
The SQL "select" parameter. Example:
-.ti +4
-\fBselect_field\fR = forw_addr
+.nf
+ \fBselect_field\fR = forw_addr
+.fi
.IP "\fBtable\fR"
The SQL "select .. from" table name. Example:
-.ti +4
-\fBtable\fR = mxaliases
+.nf
+ \fBtable\fR = mxaliases
+.fi
.IP "\fBwhere_field\fR
The SQL "select .. where" parameter. Example:
-.ti +4
-\fBwhere_field\fR = alias
+.nf
+ \fBwhere_field\fR = alias
+.fi
.IP "\fBadditional_conditions\fR
Additional conditions to the SQL query. Example:
-.ti +4
-\fBadditional_conditions\fR = AND status = 'paid'
+.nf
+ \fBadditional_conditions\fR = AND status = 'paid'
+.fi
.SH "SEE ALSO"
.na
.nf
.ad
.fi
The Postfix mail system uses optional tables for address
-rewriting or mail routing. These tables are usually in
-\fBdbm\fR or \fBdb\fR format.
+rewriting, mail routing, or access control. These tables
+are usually in \fBdbm\fR or \fBdb\fR format.
Alternatively, lookup tables can be specified in POSIX regular
expression form. In this case, each input is compared against a
The input format for the \fBpostmap\fR(1) command is as follows:
.IP \(bu
An entry has one of the following form:
-.ti +5
-\fIpattern new_location\fR
-.br
+
+.nf
+ \fIpattern new_location\fR
+.fi
+
Where \fInew_location\fR specifies contact information such as
an email address, or perhaps a street address or telephone number.
.IP \(bu
.ad
.fi
The optional \fBtransport\fR(5) table specifies a mapping from email
-addresses to message delivery transports and next-hop hosts. The
+addresses to message delivery transports and next-hop destinations.
+Message delivery transports such as \fBlocal\fR or \fBsmtp\fR
+are defined in the \fBmaster.cf\fR file, and next-hop
+destinations are typically hosts or domain names. The
table is searched by the \fBtrivial-rewrite\fR(8) daemon.
This mapping overrides the default \fItransport\fR:\fInexthop\fR
the nexthop information) and specify a wildcard for all other
destinations.
-.ti +5
-\fB\&my.domain :\fR
-.ti +5
-\fB\&.my.domain :\fR
-.ti +5
-\fB* smtp:outbound-relay.my.domain\fR
+.nf
+ \fB\&my.domain :\fR
+ \fB\&.my.domain :\fR
+ \fB* smtp:outbound-relay.my.domain\fR
+.fi
In order to send mail for \fBexample.com\fR and its subdomains
via the \fBuucp\fR transport to the UUCP host named \fBexample\fR:
-.ti +5
-\fBexample.com uucp:example\fR
-.ti +5
-\fB\&.example.com uucp:example\fR
+.nf
+ \fBexample.com uucp:example\fR
+ \fB\&.example.com uucp:example\fR
+.fi
When no nexthop host name is specified, the destination domain
name is used instead. For example, the following directs mail for
exchanger for \fBexample.com\fR. The \fBslow\fR transport could be
configured to run at most one delivery process at a time:
-.ti +5
-\fBexample.com slow:\fR
+.nf
+ \fBexample.com slow:\fR
+.fi
When no transport is specified, Postfix uses the transport that
matches the address domain class (see DESCRIPTION
above). The following sends all mail for \fBexample.com\fR and its
subdomains to host \fBgateway.example.com\fR:
-.ti +5
-\fBexample.com :[gateway.example.com]\fR
-.ti +5
-\fB\&.example.com :[gateway.example.com]\fR
+.nf
+ \fBexample.com :[gateway.example.com]\fR
+ \fB\&.example.com :[gateway.example.com]\fR
+.fi
In the above example, the [] suppress MX lookups.
This prevents mail routing loops when your machine is primary MX
In the case of delivery via SMTP, one may specify
\fIhostname\fR:\fIservice\fR instead of just a host:
-.ti +5
-\fBexample.com smtp:bar.example:2025\fR
+.nf
+ \fBexample.com smtp:bar.example:2025\fR
+.fi
This directs mail for \fIuser\fR@\fBexample.com\fR to host \fBbar.example\fR
port \fB2025\fR. Instead of a numerical port a symbolic name may be
The error mailer can be used to bounce mail:
-.ti +5
-\fB\&.example.com error:mail for *.example.com is not deliverable\fR
+.nf
+ \fB\&.example.com error:mail for *.example.com is not deliverable\fR
+.fi
This causes all mail for \fIuser\fR@\fIanything\fB.example.com\fR
to be bounced.
Patterns are applied in the order as specified in the table, until a
pattern is found that matches the search string.
-Results are the same as with indexed file lookups, with
-the additional feature that parenthesized substrings from the
-pattern can be interpolated as \fB$1\fR, \fB$2\fR and so on.
+The \fBtrivial-rewrite\fR(8) server disallows regular
+expression substitution of $1 etc. in regular expression
+lookup tables, because that could open a security hole
+(Postfix version 2.3 and later).
.SH "TCP-BASED TABLES"
.na
.nf
Postfix SMTP server accepts
mail for any recipient in \fIdomain\fR, regardless of whether
that recipient exists. This may turn your mail system into
-a backscatter source that returns undeliverable spam to
-innocent people.
+a backscatter source: Postfix first accepts mail for
+non-existent recipients and then tries to return that mail
+as "undeliverable" to the often forged sender address.
.SH "RESULT ADDRESS REWRITING"
.na
.nf
Support for a virtual alias domain looks like:
+.nf
/etc/postfix/main.cf:
-.in +4
-virtual_alias_maps = hash:/etc/postfix/virtual
+ virtual_alias_maps = hash:/etc/postfix/virtual
+.fi
Note: some systems use \fBdbm\fR databases instead of \fBhash\fR.
See the output from "\fBpostconf -m\fR" for available database types.
-.ti -4
-/etc/postfix/virtual:
.nf
-.na
-\fIvirtual-alias.domain anything\fR (right-hand content does not matter)
-\fIpostmaster@virtual-alias.domain postmaster\fR
-\fIuser1@virtual-alias.domain address1\fR
-\fIuser2@virtual-alias.domain address2, address3\fR
-.fi
-.in -4
-.ad
+/etc/postfix/virtual:
+ \fIvirtual-alias.domain anything\fR (right-hand content does not matter)
+ \fIpostmaster@virtual-alias.domain postmaster\fR
+ \fIuser1@virtual-alias.domain address1\fR
+ \fIuser2@virtual-alias.domain address2, address3\fR
.fi
.sp
The \fIvirtual-alias.domain anything\fR entry is required for a
.fi
To register a new connection send the following request to
the \fBanvil\fR(8) server:
-.PP
-.in +4
-\fBrequest=connect\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=connect\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server answers with the number of
simultaneous connections and the number of connections per
unit time for the (service, client) combination specified
with \fBident\fR:
-.PP
-.in +4
-\fBstatus=0\fR
-.br
-\fBcount=\fInumber\fR
-.br
-\fBrate=\fInumber\fR
-.in
-.PP
+
+.nf
+ \fBstatus=0\fR
+ \fBcount=\fInumber\fR
+ \fBrate=\fInumber\fR
+.fi
+
To register a disconnect event send the following request
to the \fBanvil\fR(8) server:
-.PP
-.in +4
-\fBrequest=disconnect\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=disconnect\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server replies with:
-.PP
-.ti +4
-\fBstatus=0\fR
+
+.nf
+ \fBstatus=0\fR
+.fi
.SH "MESSAGE RATE CONTROL"
.na
.nf
.fi
To register a message delivery request send the following
request to the \fBanvil\fR(8) server:
-.PP
-.in +4
-\fBrequest=message\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=message\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server answers with the number of message
delivery requests per unit time for the (service, client)
combination specified with \fBident\fR:
-.PP
-.in +4
-\fBstatus=0\fR
-.br
-\fBrate=\fInumber\fR
-.in
+
+.nf
+ \fBstatus=0\fR
+ \fBrate=\fInumber\fR
+.fi
.SH "RECIPIENT RATE CONTROL"
.na
.nf
.fi
To register a recipient request send the following request
to the \fBanvil\fR(8) server:
-.PP
-.in +4
-\fBrequest=recipient\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=recipient\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server answers with the number of recipient
addresses per unit time for the (service, client) combination
specified with \fBident\fR:
-.PP
-.in +4
-\fBstatus=0\fR
-.br
-\fBrate=\fInumber\fR
-.in
+
+.nf
+ \fBstatus=0\fR
+ \fBrate=\fInumber\fR
+.fi
.SH "TLS SESSION NEGOTIATION RATE CONTROL"
.na
.nf
To register a request for a new (i.e. not cached) TLS session
send the following request to the \fBanvil\fR(8) server:
-.PP
-.in +4
-\fBrequest=newtls\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=newtls\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server answers with the number of new
TLS session requests per unit time for the (service, client)
combination specified with \fBident\fR:
-.PP
-.in +4
-\fBstatus=0\fR
-.br
-\fBrate=\fInumber\fR
-.in
-.PP
+
+.nf
+ \fBstatus=0\fR
+ \fBrate=\fInumber\fR
+.fi
+
To retrieve new TLS session request rate information without
updating the counter information, send:
-.PP
-.in +4
-\fBrequest=newtls_report\fR
-.br
-\fBident=\fIstring\fR
-.in
-.PP
+
+.nf
+ \fBrequest=newtls_report\fR
+ \fBident=\fIstring\fR
+.fi
+
The \fBanvil\fR(8) server answers with the number of new
TLS session requests per unit time for the (service, client)
combination specified with \fBident\fR:
-.PP
-.in +4
-\fBstatus=0\fR
-.br
-\fBrate=\fInumber\fR
-.in
+
+.nf
+ \fBstatus=0\fR
+ \fBrate=\fInumber\fR
+.fi
.SH "SECURITY"
.na
.nf
To prevent Postfix from sending multiple recipients per delivery
request, specify
-
-.ti +4
-\fItransport\fB_destination_recipient_limit = 1\fR
+.sp
+.nf
+ \fItransport\fB_destination_recipient_limit = 1\fR
+.fi
in the Postfix \fBmain.cf\fR file, where \fItransport\fR
is the name in the first column of the Postfix \fBmaster.cf\fR
Caution: a null sender address is easily mis-parsed by
naive software. For example, when the \fBpipe\fR(8) daemon
executes a command such as:
-
-.ti +4
-command -f$sender -- $recipient (\fIbad\fR)
-
+.sp
+.nf
+ command -f$sender -- $recipient (\fIbad\fR)
+.fi
+.IP
the command will mis-parse the -f option value when the
sender address is a null string. For correct parsing,
specify \fB$sender\fR as an argument by itself:
-
-.ti +4
-command -f $sender -- $recipient (\fIgood\fR)
-
+.sp
+.nf
+ command -f $sender -- $recipient (\fIgood\fR)
+.fi
+.IP
This feature is available with Postfix 2.3 and later.
.IP "\fBsize\fR=\fIsize_limit\fR (optional)"
Messages greater in size than this limit (in bytes) will
practical to maintain a copy of the passwd file in the chroot
jail. The solution:
.sp
+.nf
local_recipient_maps =
-.ti +4
-proxy:unix:passwd.byname $alias_maps
+ proxy:unix:passwd.byname $alias_maps
+.fi
.IP \(bu
To consolidate the number of open lookup tables by sharing
one open table among multiple processes. For example, making
mysql connections from every Postfix daemon process results
in "too many connections" errors. The solution:
.sp
+.nf
virtual_alias_maps =
-.ti +4
-proxy:mysql:/etc/postfix/virtual_alias.cf
+ proxy:mysql:/etc/postfix/virtual_alias.cf
+.fi
.sp
The total number of connections is limited by the number of
proxymap server processes.
The mailbox pathname is constructed as follows:
-.ti +2
-\fB$virtual_mailbox_base/$virtual_mailbox_maps(\fIrecipient\fB)\fR
+.nf
+ \fB$virtual_mailbox_base/$virtual_mailbox_maps(\fIrecipient\fB)\fR
+.fi
where \fIrecipient\fR is the full recipient address.
.SH "UNIX MAILBOX FORMAT"
for file
do
echo ==== $file ====
- deroff $file | spell
-done | fgrep -vf proto/stop
+ deroff $file | spell | fgrep -vf proto/stop
+done
<h2>Overview </h2>
This document describes features that require Postfix version 2.0
-or later.
+or later. The examples use Perl Compatible Regular Expressions
+(Postfix pcre: tables), but also provide a translation to POSIX
+regular expressions (Postfix regexp: tables). PCRE is preferred
+primarily because the implementation is often faster.</p>
<p> Topics covered in this document: </p>
<blockquote>
<pre>
/etc/postfix/main.cf:
- header_checks = regexp:/etc/postfix/header_checks
- body_checks = regexp:/etc/postfix/body_checks
+ header_checks = pcre:/etc/postfix/header_checks
+ body_checks = pcre:/etc/postfix/body_checks
/etc/postfix/header_checks:
if /^Received:/
reject forged client name in Received: header: $1
/^Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^Message-ID:.* <!&!/ DUNNO
reject forged client name in Received: header: $1
/^[> ]*Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)(porcupine\.org)\)/
reject forged client name in Received: header: $2
- /^[> ]*Received:.* +by +(porcupine\.org)[[:>:]]/
+ /^[> ]*Received:.* +by +(porcupine\.org)\b/
reject forged mail server name in Received: header: $1
endif
/^[> ]*Message-ID:.* <!&!/ DUNNO
<ul>
+<li> <p> The example uses pcre: tables mainly for speed; with minor
+modifications, you can use regexp: tables as explained below. </p>
+
<li> <p> The example is simplified for educational purposes. In
reality my patterns list multiple domain names, as
"<tt>(domain|domain|...)</tt>". </p>
and "<tt>)</tt>" literally. Without the "<tt>\</tt>", the "<tt>(</tt>"
and "<tt>)</tt>" would be grouping operators. </p>
-<li> <p> The "<tt>[[:>:]]</tt>" matches the end of a word. On
-some systems you should specify "<tt>\></tt>" instead. For details
-see your system documentation. </p>
+<li> <p> The "<tt>\b</tt>" is used here to match the end of a word.
+If you use regexp: tables, specify "<tt>[[:>:]]</tt>" (on some
+systems you should specify "<tt>\></tt>" instead; for details
+see your system documentation).
<li> <p> The "if /pattern/" and "endif" eliminate unnecessary
matching attempts. DO NOT indent lines starting with /pattern/
<blockquote>
<pre>
/etc/postfix/main.cf:
- header_checks = regexp:/etc/postfix/header_checks
- body_checks = regexp:/etc/postfix/body_checks
+ header_checks = pcre:/etc/postfix/header_checks
+ body_checks = pcre:/etc/postfix/body_checks
/etc/postfix/header_checks:
- /^(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
/etc/postfix/body_checks:
- /^[> ]*(From|Return-Path):.*[[:<:]](user@domain\.tld)[[:>:]]/
+ /^[> ]*(From|Return-Path):.*\b(user@domain\.tld)\b/
reject forged sender address in $1: header: $2
</pre>
</blockquote>
<ul>
+<li> <p> The example uses pcre: tables mainly for speed; with minor
+modifications, you can use regexp: tables as explained below. </p>
+
<li> <p> The example is simplified for educational purposes. In
reality, my patterns list multiple email addresses as
"<tt>(user1@domain1\.tld|user2@domain2\.tld)</tt>". </p>
-<li> <p> The "<tt>[[:<:]]</tt>" and "<tt>[[:>:]]</tt>" match
-the beginning and end of a word, respectively. On some systems you
-should specify "<tt>\<</tt>" and "<tt>\></tt>" instead. For
-details see your system documentation. </p>
+<li> <p> The two "<tt>\b</tt>" as used in "<tt>\b(user@domain\.tld)\b</tt>"
+match the beginning and end of a word, respectively. If you use
+regexp: tables, specify "<tt>[[:<:]]</tt> and <tt>[[:>:]]</tt>"
+(on some systems you should specify "<tt>\<</tt> and <tt>\></tt>"
+instead; for details see your system documentation). </p>
<li> <p> The "<tt>\.</tt>" matches "<tt>.</tt>" literally. Without
the "<tt>\</tt>", the "<tt>.</tt>" would match any character. </p>
Linux RedHat 3.x (January 2004) - 9.x <br>
Linux Slackware 3.x, 4.x, 7.x <br>
Linux SuSE 5.x, 6.x, 7.x <br>
+Linux Ubuntu 4.10..7.04<br>
Mac OS X <br>
NEXTSTEP 3.x <br>
NetBSD 1.x <br>
<li> <p> This was tested with sid-milter-0.2.10 and sid-milter-0.2.14. </p>
-<li> <p> This fixes only the ugly message header, but not the WARNING
-message. Fortunately, sid-milter logs that message only once. </p>
-
</ul>
<p> To fix the ugly message header with other Milter applications,
</table>
-<li> <p> The bounce(8), defer(8) and trace(8) servers each maintain
-their own queue directory trees with per-message logfiles. This
-information is used to send delivery or non-delivery notifications
-to the sender. </p>
+<li> <p> The bounce(8), defer(8) and trace(8) services each maintain
+their own queue directory trees with per-message logfiles. Postfix
+uses this information when sending "failed", "delayed" or "success"
+delivery status notifications to the sender. </p>
-<p> The trace(8) service implements support for the Postfix "sendmail
+<p> The trace(8) service also implements support for the Postfix
+"sendmail
-bv" and "sendmail -v" commands which produce reports about how
Postfix delivers mail, and is available with Postfix version 2.1
and later. See <a href="DEBUG_README.html#trace_mail"> DEBUG_README
# "\fBpostconf -m\fR" to find out what lookup tables Postfix
# supports on your system.
#
-# .na
# .nf
+# .na
# /etc/postfix/main.cf:
-# .in +4
-# smtpd_client_restrictions =
-# .in +4
-# check_client_access hash:/etc/postfix/access
+# smtpd_client_restrictions =
+# check_client_access hash:/etc/postfix/access
#
-# .in -8
# /etc/postfix/access:
-# .in +4
-# 1.2.3 REJECT
-# 1.2.3.4 OK
-# .in -4
+# 1.2.3 REJECT
+# 1.2.3.4 OK
+# .fi
+# .ad
#
# Execute the command "\fBpostmap /etc/postfix/access\fR" after
# editing the file.
# .IP \(bu
# An alias definition has the form
# .sp
-# .ti +5
-# \fIname\fR: \fIvalue1\fR, \fIvalue2\fR, \fI...\fR
+# .nf
+# \fIname\fR: \fIvalue1\fR, \fIvalue2\fR, \fI...\fR
+# .fi
# .IP \(bu
# Empty lines and whitespace-only lines are ignored, as
# are lines whose first non-whitespace character is a `#'.
# To preview the results of $\fIname\fR expansions in the
# template text, use the command
#
-# .ti +4
-# \fBpostconf -b\fR \fItemporary_file\fR
+# .nf
+# \fBpostconf -b\fR \fItemporary_file\fR
+# .fi
#
# Errors in the template will be reported to the standard
# error stream and to the syslog daemon.
# Postfix configuration directory and specify in main.cf
# something like:
#
+# .nf
# /etc/postfix/main.cf:
-# .ti +4
# bounce_template_file = /etc/postfix/bounce.cf
+# .fi
# TEMPLATE FILE FORMAT
# .ad
# .fi
# it in quotes as with the shell or with Perl (\fItemplate_name\fB
# = <<'EOF'\fR). Here is an example:
#
-# .in +4
# .nf
-# .na
-# # The failure template is used for undeliverable mail.
+# # The failure template is used for undeliverable mail.
#
-# failure_template = <<EOF
-# Charset: us-ascii
-# From: MAILER-DAEMON (Mail Delivery System)
-# Subject: Undelivered Mail Returned to Sender
-# Postmaster-Subject: Postmaster Copy: Undelivered Mail
-#
-# This is the mail system at host $myhostname.
-#
-# I'm sorry to have to inform you that your message could not
-# be delivered to one or more recipients. It's attached below.
-#
-# For further assistance, please send mail to postmaster.
-#
-# If you do so, please include this problem report. You can
-# delete your own text from the attached returned message.
+# failure_template = <<EOF
+# Charset: us-ascii
+# From: MAILER-DAEMON (Mail Delivery System)
+# Subject: Undelivered Mail Returned to Sender
+# Postmaster-Subject: Postmaster Copy: Undelivered Mail
+#
+# This is the mail system at host $myhostname.
+#
+# I'm sorry to have to inform you that your message could not
+# be delivered to one or more recipients. It's attached below.
+#
+# For further assistance, please send mail to postmaster.
+#
+# If you do so, please include this problem report. You can
+# delete your own text from the attached returned message.
#
-# .ti +12
-# The mail system
-# EOF
-# .in -4
-# .ad
+# The mail system
+# EOF
# .fi
# .PP
# The usage and specification of bounce templates is
# to recipient addresses, the Postfix SMTP server accepts
# mail for any recipient in \fIdomain\fR, regardless of whether
# that recipient exists. This may turn your mail system into
-# a backscatter source that returns undeliverable spam to
-# innocent people.
+# a backscatter source: Postfix first accepts mail for
+# non-existent recipients and then tries to return that mail
+# as "undeliverable" to the often forged sender address.
# RESULT ADDRESS REWRITING
# .ad
# .fi
# Patterns are applied in the order as specified in the table, until a
# pattern is found that matches the search string.
# EXAMPLE SMTPD ACCESS MAP
+# .nf
# /etc/postfix/main.cf:
-# .ti +4
-# smtpd_client_restrictions = ... cidr:/etc/postfix/client.cidr ...
+# smtpd_client_restrictions = ... cidr:/etc/postfix/client.cidr ...
#
# /etc/postfix/client.cidr:
-# .in +4
-# # Rule order matters. Put more specific whitelist entries
-# # before more general blacklist entries.
-# 192.168.1.1 OK
-# 192.168.0.0/16 REJECT
-# .in -4
+# # Rule order matters. Put more specific whitelist entries
+# # before more general blacklist entries.
+# 192.168.1.1 OK
+# 192.168.0.0/16 REJECT
+# .fi
# SEE ALSO
# postmap(1), Postfix lookup table manager
# regexp_table(5), format of regular expression tables
# .na
# .nf
# /etc/postfix/main.cf:
-# .in +4
# smtp_generic_maps = hash:/etc/postfix/generic
-# .in -4
#
# /etc/postfix/generic:
-# .in +4
# his@localdomain.local hisaccount@hisisp.example
# her@localdomain.local heraccount@herisp.example
# @localdomain.local hisaccount+local@hisisp.example
-# .in -4
#
# .ad
# .fi
# SUMMARY
# Postfix built-in content inspection
# SYNOPSIS
+# .nf
# \fBheader_checks = pcre:/etc/postfix/header_checks\fR
-# .br
# \fBmime_header_checks = pcre:/etc/postfix/mime_header_checks\fR
-# .br
# \fBnested_header_checks = pcre:/etc/postfix/nested_header_checks\fR
-# .br
# \fBbody_checks = pcre:/etc/postfix/body_checks\fR
# .sp
# \fBpostmap -q "\fIstring\fB" pcre:/etc/postfix/\fIfilename\fR
-# .br
# \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
# 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.
+# 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
# to the next line.
# .IP \(bu
# If text in the message body is encoded
-# (RFC 2045) then the rules have to specified for the encoded
+# (RFC 2045) then the rules need to be specified for the encoded
# form.
# .IP \(bu
# Likewise, when message headers are encoded (RFC
# .na
# .nf
# /etc/postfix/main.cf:
-# .ti +4
-# header_checks = regexp:/etc/postfix/header_checks
+# header_checks = regexp:/etc/postfix/header_checks
#
# /etc/postfix/header_checks:
-# .ti +4
-# /^content-(type|disposition):.*name[[:space:]]*=.*\\.(exe|vbs)/
-# .ti +8
-# REJECT Bad attachment file name extension: $2
+# /^content-(type|disposition):.*name[[:space:]]*=.*\\.(exe|vbs)/
+# REJECT Bad attachment file name extension: $2
#
# .ad
# .fi
# .na
# .nf
# /etc/postfix/main.cf:
-# .ti +4
-# body_checks = regexp:/etc/postfix/body_checks
+# body_checks = regexp:/etc/postfix/body_checks
#
# /etc/postfix/body_checks:
-# .ti +4
-# /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
-# .ti +8
-# REJECT IFRAME vulnerability exploit
+# /^<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
# In order to use LDAP lookups, define an LDAP source as a lookup
# table in main.cf, for example:
#
-# .ti +4
-# alias_maps = ldap:/etc/postfix/ldap-aliases.cf
+# .nf
+# alias_maps = ldap:/etc/postfix/ldap-aliases.cf
+# .fi
#
# The file /etc/postfix/ldap-aliases.cf has the same format as
# the Postfix main.cf file, and can specify the parameters
#
# For example, NEVER do this in a map defining $mydestination:
#
-# .in +4
-# query_filter = domain=*
-# .br
-# result_attribute = domain
-# .in -4
+# .nf
+# query_filter = domain=*
+# result_attribute = domain
+# .fi
#
# Do this instead:
#
-# .in +4
-# query_filter = domain=%s
-# .br
-# result_attribute = domain
-# .in -4
+# .nf
+# query_filter = domain=%s
+# result_attribute = domain
+# .fi
# GENERAL LDAP PARAMETERS
# .ad
# .fi
# .IP "\fBserver_host (default: localhost)\fR"
# The name of the host running the LDAP server, e.g.
#
-# .ti +4
-# server_host = ldap.example.com
+# .nf
+# server_host = ldap.example.com
+# .fi
#
# Depending on the LDAP client library you're using, it should
# be possible to specify multiple servers here, with the library
# be possible to give each server in the list a different port
# (overriding \fBserver_port\fR below), by naming them like
#
-# .ti +4
-# server_host = ldap.example.com:1444
+# .nf
+# server_host = ldap.example.com:1444
+# .fi
#
# With OpenLDAP, a (list of) LDAP URLs can be used to specify both
# the hostname(s) and the port(s):
#
-# .ti +4
-# server_host = ldap://ldap.example.com:1444
-# .ti +8
-# ldap://ldap2.example.com:1444
+# .nf
+# server_host = ldap://ldap.example.com:1444
+# ldap://ldap2.example.com:1444
+# .fi
#
# All LDAP URLs accepted by the OpenLDAP library are supported,
# including connections over UNIX domain sockets, and LDAP SSL
# (the last one provided that OpenLDAP was compiled with support
# for SSL):
#
-# .ti +4
-# server_host = ldapi://%2Fsome%2Fpath
-# .ti +8
-# ldaps://ldap.example.com:636
+# .nf
+# server_host = ldapi://%2Fsome%2Fpath
+# ldaps://ldap.example.com:636
+# .fi
# .IP "\fBserver_port (default: 389)\fR"
# The port the LDAP server listens on, e.g.
#
-# .ti +4
-# server_port = 778
+# .nf
+# server_port = 778
+# .fi
# .IP "\fBtimeout (default: 10 seconds)\fR"
# The number of seconds a search can take before timing out, e.g.
#
-# .ti +4
-# timeout = 5
+# .fi
+# timeout = 5
+# .fi
# .IP "\fBsearch_base (No default; you must configure this)\fR"
# The RFC2253 base DN at which to conduct the search, e.g.
#
-# .ti +4
-# search_base = dc=your, dc=com
+# .nf
+# search_base = dc=your, dc=com
+# .fi
# .IP
# With Postfix 2.2 and later this parameter supports the
# following '%' expansions:
# is a substitute for the address Postfix is trying to resolve,
# e.g.
#
-# .ti +4
-# query_filter = (&(mail=%s)(paid_up=true))
+# .nf
+# query_filter = (&(mail=%s)(paid_up=true))
+# .fi
#
# This parameter supports the following '%' expansions:
# .RS
# and "@domain" lookups are not performed. This can significantly
# reduce the query load on the LDAP server.
#
-# .ti +4
-# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .nf
+# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .fi
#
# It is best not to use LDAP to store the domains eligible
# for LDAP lookups.
# entries returned by the lookup, to be resolved to an email
# address.
#
-# .ti +4
-# result_attribute = mailbox, maildrop
+# .nf
+# result_attribute = mailbox, maildrop
+# .fi
# .IP "\fBspecial_result_attribute (default: empty)\fR"
# The attribute(s) of directory entries that can contain DNs
# or URLs. If found, a recursive subsequent search is done
# using their values.
#
-# .ti +4
-# special_result_attribute = memberdn
+# .nf
+# special_result_attribute = memberdn
+# .fi
#
# DN recursion retrieves the same result_attributes as the
# main query, including the special attributes for further
# where the group is expanded, possibly via mailing-list manager or
# other special processing.
#
-# .ti +4
-# terminal_result_attribute = maildrop
+# .nf
+# terminal_result_attribute = maildrop
+# .fi
#
# This feature is available with Postfix 2.4 or later.
# .IP "\fBleaf_result_attribute (default: empty)\fR"
# The attributes that represent the email addresses of objects
# referenced via a DN (or LDAP URI) go in "leaf_result_attribute".
#
-# .in +4
-# result_attribute = memberaddr
-# .br
-# special_result_attribute = memberdn
-# .br
-# terminal_result_attribute = maildrop
-# .br
-# leaf_result_attribute = mail
-# .in -4
+# .nf
+# result_attribute = memberaddr
+# special_result_attribute = memberdn
+# terminal_result_attribute = maildrop
+# leaf_result_attribute = mail
+# .fi
#
# This feature is available with Postfix 2.4 or later.
# .IP "\fBscope (default: sub)\fR"
# implementations don't require clients to bind, which saves
# time. Example:
#
-# .ti +4
-# bind = no
+# .nf
+# bind = no
+# .fi
#
# If you do need to bind, you might consider configuring
# Postfix to connect to the local machine on a port that's
# .IP "\fBbind_dn (default: empty)\fR"
# If you do have to bind, do it with this distinguished name. Example:
#
-# .ti +4
-# bind_dn = uid=postfix, dc=your, dc=com
+# .nf
+# bind_dn = uid=postfix, dc=your, dc=com
+# .fi
# .IP "\fBbind_pw (default: empty)\fR"
# The password for the distinguished name above. If you have
# to use this, you probably want to make the map configuration
# to allow local accounts to submit mail via the sendmail
# command. Example:
#
-# .ti +4
-# bind_pw = postfixpw
+# .nf
+# bind_pw = postfixpw
+# .fi
# .IP "\fBcache (IGNORED with a warning)\fR"
# .IP "\fBcache_expiry (IGNORED with a warning)\fR"
# .IP "\fBcache_size (IGNORED with a warning)\fR"
# LDAP SSL service can be requested by using a LDAP SSL URL
# in the server_host parameter:
#
-# .ti +4
-# server_host = ldaps://ldap.example.com:636
+# .nf
+# server_host = ldaps://ldap.example.com:636
+# .fi
#
# STARTTLS can be turned on with the start_tls parameter:
#
-# .ti +4
-# start_tls = yes
+# .nf
+# start_tls = yes
+# .fi
#
# Both forms require LDAP protocol version 3, which has to be set
# explicitly with:
#
-# .ti +4
-# version = 3
+# .nf
+# version = 3
+# .fi
#
# If any of the Postfix programs querying the map is configured in
# master.cf to run chrooted, all the certificates and keys involved
# aliases.
# Assume that in main.cf, you have:
#
-# .ti +4
-# alias_maps = hash:/etc/aliases,
-# .ti +8
-# ldap:/etc/postfix/ldap-aliases.cf
+# .nf
+# alias_maps = hash:/etc/aliases,
+# ldap:/etc/postfix/ldap-aliases.cf
+# .fi
#
# and in ldap:/etc/postfix/ldap-aliases.cf you have:
#
-# .in +4
-# server_host = ldap.example.com
-# .br
-# search_base = dc=example, dc=com
-# .in -4
+# .nf
+# server_host = ldap.example.com
+# search_base = dc=example, dc=com
+# .fi
#
# Upon receiving mail for a local address "ldapuser" that
# isn't found in the /etc/aliases database, Postfix will
# Alternatively, lookup tables can be specified as MySQL databases.
# In order to use MySQL lookups, define a MySQL source as a lookup
# table in main.cf, for example:
-# .ti +4
-# alias_maps = mysql:/etc/mysql-aliases.cf
+# .nf
+# alias_maps = mysql:/etc/mysql-aliases.cf
+# .fi
#
# The file /etc/postfix/mysql-aliases.cf has the same format as
# the Postfix main.cf file, and can specify the parameters
# The old interface will be gradually phased out. To migrate to
# the new interface set:
#
-# .ti +4
-# \fBquery\fR = SELECT [\fIselect_field\fR]
-# .ti +8
-# FROM [\fItable\fR]
-# .ti +8
-# WHERE [\fIwhere_field\fR] = '%s'
-# .ti +12
-# [\fIadditional_conditions\fR]
+# .nf
+# \fBquery\fR = SELECT [\fIselect_field\fR]
+# FROM [\fItable\fR]
+# WHERE [\fIwhere_field\fR] = '%s'
+# [\fIadditional_conditions\fR]
+# .fi
#
# Insert the value, not the name, of each legacy parameter. Note
# that the \fBadditional_conditions\fR parameter is optional
# The hosts that Postfix will try to connect to and query from.
# Specify \fIunix:\fR for UNIX domain sockets, \fIinet:\fR for TCP
# connections (default). Example:
-# .ti +4
-# hosts = host1.some.domain host2.some.domain
-# .ti +4
-# hosts = unix:/file/name
+# .nf
+# hosts = host1.some.domain host2.some.domain
+# hosts = unix:/file/name
+# .fi
#
# The hosts are tried in random order, with all connections over
# UNIX domain sockets being tried before those over TCP. The
# prefix it with \fIinet:\fR), MySQL will connect to the default
# UNIX domain socket. In order to instruct MySQL to connect to
# localhost over TCP you have to specify
-# .ti +4
-# hosts = 127.0.0.1
+# .nf
+# hosts = 127.0.0.1
+# .fi
# .IP "\fBuser, password\fR"
# The user name and password to log into the mysql server.
# Example:
-# .in +4
-# user = someone
-# .br
-# password = some_password
-# .in -4
+# .nf
+# user = someone
+# password = some_password
+# .fi
# .IP "\fBdbname\fR"
# The database name on the servers. Example:
-# .ti +4
-# dbname = customer_database
+# .nf
+# dbname = customer_database
+# .fi
# .IP "\fBquery\fR"
# The SQL query template used to search the database, where \fB%s\fR
# is a substitute for the address Postfix is trying to resolve,
# e.g.
-# .ti +4
-# query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+# .nf
+# query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+# .fi
#
# This parameter supports the following '%' expansions:
# .RS
# \fBadditional_conditions\fR. The mapping from the old parameters
# to the equivalent query is:
#
-# .ti +4
-# SELECT [\fBselect_field\fR]
-# .ti +4
-# FROM [\fBtable\fR]
-# .ti +4
-# WHERE [\fBwhere_field\fR] = '%s'
-# .ti +10
-# [\fBadditional_conditions\fR]
+# .nf
+# SELECT [\fBselect_field\fR]
+# FROM [\fBtable\fR]
+# WHERE [\fBwhere_field\fR] = '%s'
+# [\fBadditional_conditions\fR]
+# .fi
#
# The '%s' in the \fBWHERE\fR clause expands to the escaped search string.
# With Postfix 2.2 these legacy parameters are used if the \fBquery\fR
# are eligible for lookup: 'user' lookups, bare domain lookups
# and "@domain" lookups are not performed. This can significantly
# reduce the query load on the MySQL server.
-# .ti +4
-# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .nf
+# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .fi
#
# It is best not to use SQL to store the domains eligible
# for SQL lookups.
# The following parameters can be used to fill in a
# SELECT template statement of the form:
#
-# .ti +4
-# SELECT [\fBselect_field\fR]
-# .ti +4
-# FROM [\fBtable\fR]
-# .ti +4
-# WHERE [\fBwhere_field\fR] = '%s'
-# .ti +10
-# [\fBadditional_conditions\fR]
+# .nf
+# SELECT [\fBselect_field\fR]
+# FROM [\fBtable\fR]
+# WHERE [\fBwhere_field\fR] = '%s'
+# [\fBadditional_conditions\fR]
+# .fi
#
# The specifier %s is replaced by the search string, and is
# escaped so if it contains single quotes or other odd characters,
# interface may be removed in a future release.
# .IP "\fBselect_field\fR"
# The SQL "select" parameter. Example:
-# .ti +4
-# \fBselect_field\fR = forw_addr
+# .nf
+# \fBselect_field\fR = forw_addr
+# .fi
# .IP "\fBtable\fR"
# The SQL "select .. from" table name. Example:
-# .ti +4
-# \fBtable\fR = mxaliases
+# .nf
+# \fBtable\fR = mxaliases
+# .fi
# .IP "\fBwhere_field\fR
# The SQL "select .. where" parameter. Example:
-# .ti +4
-# \fBwhere_field\fR = alias
+# .nf
+# \fBwhere_field\fR = alias
+# .fi
# .IP "\fBadditional_conditions\fR
# Additional conditions to the SQL query. Example:
-# .ti +4
-# \fBadditional_conditions\fR = AND status = 'paid'
+# .nf
+# \fBadditional_conditions\fR = AND status = 'paid'
+# .fi
# SEE ALSO
# postmap(1), Postfix lookup table maintenance
# postconf(5), configuration parameters
# Most of the NIS+ query is specified via the NIS+ map name. The
# general format of a Postfix NIS+ map name is as follows:
#
-# .ti +4
-# \fBnisplus:[\fIname\fB=%s];\fIname.name.name\fB.:\fIcolumn\fR
+# .fi
+# \fBnisplus:[\fIname\fB=%s];\fIname.name.name\fB.:\fIcolumn\fR
+# .fi
#
# Postfix NIS+ map names differ from what one normally
# would use with commands such as \fBniscat\fR:
# of the table column that provides the lookup result. When
# no ":\fIcolumn\fR" is specified the first column (1) is used.
# EXAMPLE
+# .ad
+# .fi
# A NIS+ aliases map might be queried as follows:
#
-# .ti +4
-# alias_maps = dbm:/etc/mail/aliases,
-# .ti +2
+# .nf
+# alias_maps = dbm:/etc/mail/aliases,
# nisplus:[alias=%s];mail_aliases.org_dir.$mydomain.:1
-# .ad
# .fi
#
# This queries the local aliases file before the NIS+ file.
# \fBpostmap -q - 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.
+# rewriting, mail routing, or access control. 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
# Alternatively, lookup tables can be specified as PostgreSQL
# databases. In order to use PostgreSQL lookups, define a
# PostgreSQL source as a lookup table in main.cf, for example:
-# .ti +4
-# alias_maps = pgsql:/etc/pgsql-aliases.cf
+# .nf
+# alias_maps = pgsql:/etc/pgsql-aliases.cf
+# .fi
#
# The file /etc/postfix/pgsql-aliases.cf has the same format as
# the Postfix main.cf file, and can specify the parameters
# \fBwhere_field\fR and \fBadditional_conditions\fR parameters. To
# migrate to the new interface set:
#
-# .ti +4
-# \fBquery\fR = SELECT \fIselect_function\fR('%s')
+# .nf
+# \fBquery\fR = SELECT \fIselect_function\fR('%s')
+# .fi
#
# or in the absence of \fBselection_function\fR, the lower precedence:
#
-# .ti +4
-# \fBquery\fR = SELECT \fIselect_field\fR
-# .ti +8
-# FROM \fItable\fR
-# .ti +8
-# WHERE \fIwhere_field\fR = '%s'
-# .ti +12
-# \fIadditional_conditions\fR
+# .nf
+# \fBquery\fR = SELECT \fIselect_field\fR
+# FROM \fItable\fR
+# WHERE \fIwhere_field\fR = '%s'
+# \fIadditional_conditions\fR
+# .fi
#
# Use the value, not the name, of each legacy parameter. Note
# that the \fBadditional_conditions\fR parameter is optional
# The hosts that Postfix will try to connect to and query from.
# Specify \fIunix:\fR for UNIX-domain sockets, \fIinet:\fR for TCP
# connections (default). Example:
-# .ti +4
-# hosts = host1.some.domain host2.some.domain
-# .ti +4
-# hosts = unix:/file/name
+# .nf
+# hosts = host1.some.domain host2.some.domain
+# hosts = unix:/file/name
+# .fi
#
# The hosts are tried in random order, with all connections over
# UNIX domain sockets being tried before those over TCP. The
# .IP "\fBuser, password\fR"
# The user name and password to log into the pgsql server.
# Example:
-# .in +4
-# user = someone
-# .br
-# password = some_password
-# .in -4
+# .nf
+# user = someone
+# password = some_password
+# .fi
# .IP "\fBdbname\fR"
# The database name on the servers. Example:
-# .ti +4
-# dbname = customer_database
+# .nf
+# dbname = customer_database
+# .fi
# .IP "\fBquery\fR"
# The SQL query template used to search the database, where \fB%s\fR
# is a substitute for the address Postfix is trying to resolve,
# e.g.
-# .ti +4
-# query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+# .nf
+# query = SELECT replacement FROM aliases WHERE mailbox = '%s'
+# .fi
#
# This parameter supports the following '%' expansions:
# .RS
# are eligible for lookup: 'user' lookups, bare domain lookups
# and "@domain" lookups are not performed. This can significantly
# reduce the query load on the PostgreSQL server.
-# .ti +4
-# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .nf
+# domain = postfix.org, hash:/etc/postfix/searchdomains
+# .fi
#
# It is best not to use SQL to store the domains eligible
# for SQL lookups.
# Pre-Postfix 2.2 legacy interfaces:
# .IP "\fBselect_function\fR"
# This parameter specifies a database function name. Example:
-# .ti +4
-# select_function = my_lookup_user_alias
+# .nf
+# select_function = my_lookup_user_alias
+# .fi
#
# This is equivalent to:
-# .ti +4
-# query = SELECT my_lookup_user_alias('%s')
+# .nf
+# query = SELECT my_lookup_user_alias('%s')
+# .fi
#
# This parameter overrides the legacy table-related fields (described
# below). With Postfix versions prior to 2.2, it also overrides the
# \fBselect_function\fR interface described above) can be used to
# build the SQL select statement as follows:
#
-# .ti +4
-# SELECT [\fBselect_field\fR]
-# .ti +4
-# FROM [\fBtable\fR]
-# .ti +4
-# WHERE [\fBwhere_field\fR] = '%s'
-# .ti +10
-# [\fBadditional_conditions\fR]
+# .nf
+# SELECT [\fBselect_field\fR]
+# FROM [\fBtable\fR]
+# WHERE [\fBwhere_field\fR] = '%s'
+# [\fBadditional_conditions\fR]
+# .fi
#
# The specifier %s is replaced with each lookup by the lookup key
# and is escaped so if it contains single quotes or other odd
# \fBquery\fR interface as this interface is slated to be phased out.
# .IP "\fBselect_field\fR"
# The SQL "select" parameter. Example:
-# .ti +4
-# \fBselect_field\fR = forw_addr
+# .nf
+# \fBselect_field\fR = forw_addr
+# .fi
# .IP "\fBtable\fR"
# The SQL "select .. from" table name. Example:
-# .ti +4
-# \fBtable\fR = mxaliases
+# .nf
+# \fBtable\fR = mxaliases
+# .fi
# .IP "\fBwhere_field\fR
# The SQL "select .. where" parameter. Example:
-# .ti +4
-# \fBwhere_field\fR = alias
+# .nf
+# \fBwhere_field\fR = alias
+# .fi
# .IP "\fBadditional_conditions\fR
# Additional conditions to the SQL query. Example:
-# .ti +4
-# \fBadditional_conditions\fR = AND status = 'paid'
+# .nf
+# \fBadditional_conditions\fR = AND status = 'paid'
+# .fi
# SEE ALSO
# postmap(1), Postfix lookup table manager
# postconf(5), configuration parameters
# \fBpostmap -q - regexp:/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.
+# rewriting, mail routing, or access control. These tables
+# are usually in \fBdbm\fR or \fBdb\fR format.
#
# Alternatively, lookup tables can be specified in POSIX regular
# expression form. In this case, each input is compared against a
# The input format for the \fBpostmap\fR(1) command is as follows:
# .IP \(bu
# An entry has one of the following form:
-# .ti +5
-# \fIpattern new_location\fR
-# .br
+#
+# .nf
+# \fIpattern new_location\fR
+# .fi
+#
# Where \fInew_location\fR specifies contact information such as
# an email address, or perhaps a street address or telephone number.
# .IP \(bu
# \fBpostmap -q - /etc/postfix/transport <\fIinputfile\fR
# DESCRIPTION
# The optional \fBtransport\fR(5) table specifies a mapping from email
-# addresses to message delivery transports and next-hop hosts. The
+# addresses to message delivery transports and next-hop destinations.
+# Message delivery transports such as \fBlocal\fR or \fBsmtp\fR
+# are defined in the \fBmaster.cf\fR file, and next-hop
+# destinations are typically hosts or domain names. The
# table is searched by the \fBtrivial-rewrite\fR(8) daemon.
#
# This mapping overrides the default \fItransport\fR:\fInexthop\fR
# the nexthop information) and specify a wildcard for all other
# destinations.
#
-# .ti +5
-# \fB\&my.domain :\fR
-# .ti +5
-# \fB\&.my.domain :\fR
-# .ti +5
-# \fB* smtp:outbound-relay.my.domain\fR
+# .nf
+# \fB\&my.domain :\fR
+# \fB\&.my.domain :\fR
+# \fB* smtp:outbound-relay.my.domain\fR
+# .fi
#
# In order to send mail for \fBexample.com\fR and its subdomains
# via the \fBuucp\fR transport to the UUCP host named \fBexample\fR:
#
-# .ti +5
-# \fBexample.com uucp:example\fR
-# .ti +5
-# \fB\&.example.com uucp:example\fR
+# .nf
+# \fBexample.com uucp:example\fR
+# \fB\&.example.com uucp:example\fR
+# .fi
#
# When no nexthop host name is specified, the destination domain
# name is used instead. For example, the following directs mail for
# exchanger for \fBexample.com\fR. The \fBslow\fR transport could be
# configured to run at most one delivery process at a time:
#
-# .ti +5
-# \fBexample.com slow:\fR
+# .nf
+# \fBexample.com slow:\fR
+# .fi
#
# When no transport is specified, Postfix uses the transport that
# matches the address domain class (see DESCRIPTION
# above). The following sends all mail for \fBexample.com\fR and its
# subdomains to host \fBgateway.example.com\fR:
#
-# .ti +5
-# \fBexample.com :[gateway.example.com]\fR
-# .ti +5
-# \fB\&.example.com :[gateway.example.com]\fR
+# .nf
+# \fBexample.com :[gateway.example.com]\fR
+# \fB\&.example.com :[gateway.example.com]\fR
+# .fi
#
# In the above example, the [] suppress MX lookups.
# This prevents mail routing loops when your machine is primary MX
# In the case of delivery via SMTP, one may specify
# \fIhostname\fR:\fIservice\fR instead of just a host:
#
-# .ti +5
-# \fBexample.com smtp:bar.example:2025\fR
+# .nf
+# \fBexample.com smtp:bar.example:2025\fR
+# .fi
#
# This directs mail for \fIuser\fR@\fBexample.com\fR to host \fBbar.example\fR
# port \fB2025\fR. Instead of a numerical port a symbolic name may be
#
# The error mailer can be used to bounce mail:
#
-# .ti +5
-# \fB\&.example.com error:mail for *.example.com is not deliverable\fR
+# .nf
+# \fB\&.example.com error:mail for *.example.com is not deliverable\fR
+# .fi
#
# This causes all mail for \fIuser\fR@\fIanything\fB.example.com\fR
# to be bounced.
# Patterns are applied in the order as specified in the table, until a
# pattern is found that matches the search string.
#
-# Results are the same as with indexed file lookups, with
-# the additional feature that parenthesized substrings from the
-# pattern can be interpolated as \fB$1\fR, \fB$2\fR and so on.
+# The \fBtrivial-rewrite\fR(8) server disallows regular
+# expression substitution of $1 etc. in regular expression
+# lookup tables, because that could open a security hole
+# (Postfix version 2.3 and later).
# TCP-BASED TABLES
# .ad
# .fi
# Postfix SMTP server accepts
# mail for any recipient in \fIdomain\fR, regardless of whether
# that recipient exists. This may turn your mail system into
-# a backscatter source that returns undeliverable spam to
-# innocent people.
+# a backscatter source: Postfix first accepts mail for
+# non-existent recipients and then tries to return that mail
+# as "undeliverable" to the often forged sender address.
# RESULT ADDRESS REWRITING
# .ad
# .fi
#
# Support for a virtual alias domain looks like:
#
+# .nf
# /etc/postfix/main.cf:
-# .in +4
-# virtual_alias_maps = hash:/etc/postfix/virtual
+# virtual_alias_maps = hash:/etc/postfix/virtual
+# .fi
#
# Note: some systems use \fBdbm\fR databases instead of \fBhash\fR.
# See the output from "\fBpostconf -m\fR" for available database types.
#
-# .ti -4
-# /etc/postfix/virtual:
# .nf
-# .na
-# \fIvirtual-alias.domain anything\fR (right-hand content does not matter)
-# \fIpostmaster@virtual-alias.domain postmaster\fR
-# \fIuser1@virtual-alias.domain address1\fR
-# \fIuser2@virtual-alias.domain address2, address3\fR
-# .fi
-# .in -4
-# .ad
+# /etc/postfix/virtual:
+# \fIvirtual-alias.domain anything\fR (right-hand content does not matter)
+# \fIpostmaster@virtual-alias.domain postmaster\fR
+# \fIuser1@virtual-alias.domain address1\fR
+# \fIuser2@virtual-alias.domain address2, address3\fR
# .fi
# .sp
# The \fIvirtual-alias.domain anything\fR entry is required for a
/* .fi
/* To register a new connection send the following request to
/* the \fBanvil\fR(8) server:
-/* .PP
-/* .in +4
-/* \fBrequest=connect\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=connect\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server answers with the number of
/* simultaneous connections and the number of connections per
/* unit time for the (service, client) combination specified
/* with \fBident\fR:
-/* .PP
-/* .in +4
-/* \fBstatus=0\fR
-/* .br
-/* \fBcount=\fInumber\fR
-/* .br
-/* \fBrate=\fInumber\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* \fBcount=\fInumber\fR
+/* \fBrate=\fInumber\fR
+/* .fi
+/*
/* To register a disconnect event send the following request
/* to the \fBanvil\fR(8) server:
-/* .PP
-/* .in +4
-/* \fBrequest=disconnect\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=disconnect\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server replies with:
-/* .PP
-/* .ti +4
-/* \fBstatus=0\fR
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* .fi
/* MESSAGE RATE CONTROL
/* .ad
/* .fi
/* To register a message delivery request send the following
/* request to the \fBanvil\fR(8) server:
-/* .PP
-/* .in +4
-/* \fBrequest=message\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=message\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server answers with the number of message
/* delivery requests per unit time for the (service, client)
/* combination specified with \fBident\fR:
-/* .PP
-/* .in +4
-/* \fBstatus=0\fR
-/* .br
-/* \fBrate=\fInumber\fR
-/* .in
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* \fBrate=\fInumber\fR
+/* .fi
/* RECIPIENT RATE CONTROL
/* .ad
/* .fi
/* To register a recipient request send the following request
/* to the \fBanvil\fR(8) server:
-/* .PP
-/* .in +4
-/* \fBrequest=recipient\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=recipient\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server answers with the number of recipient
/* addresses per unit time for the (service, client) combination
/* specified with \fBident\fR:
-/* .PP
-/* .in +4
-/* \fBstatus=0\fR
-/* .br
-/* \fBrate=\fInumber\fR
-/* .in
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* \fBrate=\fInumber\fR
+/* .fi
/* TLS SESSION NEGOTIATION RATE CONTROL
/* .ad
/* .fi
/*
/* To register a request for a new (i.e. not cached) TLS session
/* send the following request to the \fBanvil\fR(8) server:
-/* .PP
-/* .in +4
-/* \fBrequest=newtls\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=newtls\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server answers with the number of new
/* TLS session requests per unit time for the (service, client)
/* combination specified with \fBident\fR:
-/* .PP
-/* .in +4
-/* \fBstatus=0\fR
-/* .br
-/* \fBrate=\fInumber\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* \fBrate=\fInumber\fR
+/* .fi
+/*
/* To retrieve new TLS session request rate information without
/* updating the counter information, send:
-/* .PP
-/* .in +4
-/* \fBrequest=newtls_report\fR
-/* .br
-/* \fBident=\fIstring\fR
-/* .in
-/* .PP
+/*
+/* .nf
+/* \fBrequest=newtls_report\fR
+/* \fBident=\fIstring\fR
+/* .fi
+/*
/* The \fBanvil\fR(8) server answers with the number of new
/* TLS session requests per unit time for the (service, client)
/* combination specified with \fBident\fR:
-/* .PP
-/* .in +4
-/* \fBstatus=0\fR
-/* .br
-/* \fBrate=\fInumber\fR
-/* .in
+/*
+/* .nf
+/* \fBstatus=0\fR
+/* \fBrate=\fInumber\fR
+/* .fi
/* SECURITY
/* .ad
/* .fi
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
Your message could not be delivered for more than $delay_warning_time_hours hour(s).
It will be retried until it is $maximal_queue_lifetime_days day(s) old.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
Your message could not be delivered for more than $delay_warning_time_hours hour(s).
It will be retried until it is $maximal_queue_lifetime_days day(s) old.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
Your message could not be delivered for more than $delay_warning_time_hours hour(s).
It will be retried until it is $maximal_queue_lifetime_days day(s) old.
-For further assistance, please send mail to <postmaster>
+For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20070325"
-#define MAIL_VERSION_NUMBER "2.4"
+#define MAIL_RELEASE_DATE "20070328"
+#define MAIL_VERSION_NUMBER "2.5"
#ifdef SNAPSHOT
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
/*
/* To prevent Postfix from sending multiple recipients per delivery
/* request, specify
-/*
-/* .ti +4
-/* \fItransport\fB_destination_recipient_limit = 1\fR
+/* .sp
+/* .nf
+/* \fItransport\fB_destination_recipient_limit = 1\fR
+/* .fi
/*
/* in the Postfix \fBmain.cf\fR file, where \fItransport\fR
/* is the name in the first column of the Postfix \fBmaster.cf\fR
/* Caution: a null sender address is easily mis-parsed by
/* naive software. For example, when the \fBpipe\fR(8) daemon
/* executes a command such as:
-/*
-/* .ti +4
-/* command -f$sender -- $recipient (\fIbad\fR)
-/*
+/* .sp
+/* .nf
+/* command -f$sender -- $recipient (\fIbad\fR)
+/* .fi
+/* .IP
/* the command will mis-parse the -f option value when the
/* sender address is a null string. For correct parsing,
/* specify \fB$sender\fR as an argument by itself:
-/*
-/* .ti +4
-/* command -f $sender -- $recipient (\fIgood\fR)
-/*
+/* .sp
+/* .nf
+/* command -f $sender -- $recipient (\fIgood\fR)
+/* .fi
+/* .IP
/* This feature is available with Postfix 2.3 and later.
/* .IP "\fBsize\fR=\fIsize_limit\fR (optional)"
/* Messages greater in size than this limit (in bytes) will
/* lookup tables, or updates an existing one. The input and output
/* file formats are expected to be compatible with:
/*
-/* .ti +4
-/* \fBmakemap \fIfile_type\fR \fIfile_name\fR < \fIfile_name\fR
+/* .nf
+/* \fBmakemap \fIfile_type\fR \fIfile_name\fR < \fIfile_name\fR
+/* .fi
/*
/* If the result files do not exist they will be created with the
/* same group and other read permissions as their source file.
/* .IP \(bu
/* A table entry has the form
/* .sp
-/* .ti +5
-/* \fIkey\fR whitespace \fIvalue\fR
+/* .nf
+/* \fIkey\fR whitespace \fIvalue\fR
+/* .fi
/* .IP \(bu
/* Empty lines and whitespace-only lines are ignored, as
/* are lines whose first non-whitespace character is a `#'.
/* queue IDs from standard input. For example, to delete all mail
/* with exactly one recipient \fBuser@example.com\fR:
/* .sp
+/* .nf
/* mailq | tail +2 | grep -v '^ *(' | awk \'BEGIN { RS = "" }
-/* .ti +4
-/* # $7=sender, $8=recipient1, $9=recipient2
-/* .ti +4
-/* { if ($8 == "user@example.com" && $9 == "")
-/* .ti +10
-/* print $1 }
-/* .br
+/* # $7=sender, $8=recipient1, $9=recipient2
+/* { if ($8 == "user@example.com" && $9 == "")
+/* print $1 }
/* \' | tr -d '*!' | postsuper -d -
+/* .fi
/* .sp
/* Specify "\fB-d ALL\fR" to remove all messages; for example, specify
/* "\fB-d ALL deferred\fR" to delete all mail in the \fBdeferred\fR queue.
/* practical to maintain a copy of the passwd file in the chroot
/* jail. The solution:
/* .sp
+/* .nf
/* local_recipient_maps =
-/* .ti +4
-/* proxy:unix:passwd.byname $alias_maps
+/* proxy:unix:passwd.byname $alias_maps
+/* .fi
/* .IP \(bu
/* To consolidate the number of open lookup tables by sharing
/* one open table among multiple processes. For example, making
/* mysql connections from every Postfix daemon process results
/* in "too many connections" errors. The solution:
/* .sp
+/* .nf
/* virtual_alias_maps =
-/* .ti +4
-/* proxy:mysql:/etc/postfix/virtual_alias.cf
+/* proxy:mysql:/etc/postfix/virtual_alias.cf
+/* .fi
/* .sp
/* The total number of connections is limited by the number of
/* proxymap server processes.
/*
/* The mailbox pathname is constructed as follows:
/*
-/* .ti +2
-/* \fB$virtual_mailbox_base/$virtual_mailbox_maps(\fIrecipient\fB)\fR
+/* .nf
+/* \fB$virtual_mailbox_base/$virtual_mailbox_maps(\fIrecipient\fB)\fR
+/* .fi
/*
/* where \fIrecipient\fR is the full recipient address.
/* UNIX MAILBOX FORMAT