Update: common code factored out into db_common.c, and
adoption of Liviu Daia's connection aware MySQL quoting.
- Files: dict_ldap.c, dict_mysql.c, dict_pgsql.c, db_common.c.
+ Patch by Victor Duchovni. Files: dict_ldap.c, dict_mysql.c,
+ dict_pgsql.c, db_common.c.
+
+20050923
+
+ Safety: don't update the local(8) delivery agent's idea of
+ the Delivered-To: address while expanding aliases or .forward
+ files. When an alias or .forward file changes the Delivered-To:
+ address, it ties up one queue file and one cleanup process
+ instance while mail is being forwarded. To get the old
+ behavior, specify "frozen_delivered_to = no". Problem
+ reported by Michael Tokarev, but found independently by
+ others. Files: local/local.c, local/aliases.c, local/dotforward.c,
+ local/mailbox.c, local/maildir.c.
+
+ Cleanup: while expanding a local(8) alias that has an owner
+ alias, don't reset the owner-alias information when recursing
+ into an alias that has no owner alias. This produces better
+ error reports when delivering mail to nested aliases that
+ have an owner alias only at the top level. To get the old
+ behavior, specify "sticky_owner_alias = no". Problem
+ reported by Victor Duchovni. File: local/alias.c.
+
+ Logging: additional SASL debug logging by Andreas Winkelmann.
+ Files: */*sasl_glue.c.
Open problems:
If you upgrade from Postfix 2.1 or earlier, read RELEASE_NOTES-2.2
before proceeding.
+Incompatibility with snapshot 20050923
+======================================
+
+The Postfix local(8) delivery agent no longer updates its idea of
+the Delivered-To: address while it expands aliases or .forward
+files. With deeply nested aliases or .forward files, this can greatly
+reduce the number of queue files and cleanup process instances. To
+get the earlier behavior, specify "frozen_delivered_to = no".
+
+While expanding an alias that has an owner alias, the Postfix
+local(8) delivery agent no longer resets the owner information when
+it expands a subordinate alias that has no owner alias. This
+produces better error reporting with nested aliases that have an
+owner alias only at the top level. To get the earlier behavior,
+specify "sticky_owner_alias = no".
+
Incompatibility with snapshot 20050828
======================================
# trap decode to catch security attacks
decode: root
-# ALIASES(5) ALIASES(5)
+# ALIASES(5) ALIASES(5)
#
# NAME
# aliases - Postfix local alias database format
#
# In addition, when an alias exists for owner-name, delivery
# diagnostics are directed to that address, instead of to
-# the originator. This is typically used to direct delivery
-# errors to the owner of a mailing list, who is in a better
-# position to deal with mailing list delivery problems than
-# the originator of the undelivered mail.
+# the originator of the message. This is typically used to
+# direct delivery errors to the maintainer of a mailing
+# list, who is in a better position to deal with mailing
+# list delivery problems than the originator of the undeliv-
+# ered mail.
#
# The value contains one or more of the following:
#
# address
-# Mail is forwarded to address, which is compatible
+# Mail is forwarded to address, which is compatible
# with the RFC 822 standard.
#
# /file/name
-# Mail is appended to /file/name. See local(8) for
-# details of delivery to file. Delivery is not lim-
-# ited to regular files. For example, to dispose of
+# Mail is appended to /file/name. See local(8) for
+# details of delivery to file. Delivery is not lim-
+# ited to regular files. For example, to dispose of
# unwanted mail, deflect it to /dev/null.
#
# |command
-# Mail is piped into command. Commands that contain
-# special characters, such as whitespace, should be
-# enclosed between double quotes. See local(8) for
+# Mail is piped into command. Commands that contain
+# special characters, such as whitespace, should be
+# enclosed between double quotes. See local(8) for
# details of delivery to command.
#
# When the command fails, a limited amount of command
-# output is mailed back to the sender. The file
-# /usr/include/sysexits.h defines the expected exit
-# status codes. For example, use |"exit 67" to simu-
-# late a "user unknown" error, and |"exit 0" to
+# output is mailed back to the sender. The file
+# /usr/include/sysexits.h defines the expected exit
+# status codes. For example, use |"exit 67" to simu-
+# late a "user unknown" error, and |"exit 0" to
# implement an expensive black hole.
#
# :include:/file/name
-# Mail is sent to the destinations listed in the
+# Mail is sent to the destinations listed in the
# named file. Lines in :include: files have the same
# syntax as the right-hand side of alias entries.
#
#
# ADDRESS EXTENSION
# When alias database search fails, and the recipient local-
-# part contains the optional recipient delimiter (e.g.,
-# user+foo), the search is repeated for the unextended
+# part contains the optional recipient delimiter (e.g.,
+# user+foo), the search is repeated for the unextended
# address (e.g., user).
#
-# The propagate_unmatched_extensions parameter controls
-# whether an unmatched address extension (+foo) is propa-
+# The propagate_unmatched_extensions parameter controls
+# whether an unmatched address extension (+foo) is propa-
# gated to the result of table lookup.
#
# SECURITY
-# The local(8) delivery agent disallows regular expression
-# substitution of $1 etc. in alias_maps, because that would
+# The local(8) delivery agent disallows regular expression
+# substitution of $1 etc. in alias_maps, because that would
# open a security hole.
#
-# The local(8) delivery agent will silently ignore requests
-# to use the proxymap(8) server within alias_maps. Instead
-# it will open the table directly. Before Postfix version
-# 2.2, the local(8) delivery agent will terminate with a
+# The local(8) delivery agent will silently ignore requests
+# to use the proxymap(8) server within alias_maps. Instead
+# it will open the table directly. Before Postfix version
+# 2.2, the local(8) delivery agent will terminate with a
# fatal error.
#
# CONFIGURATION PARAMETERS
-# The following main.cf parameters are especially relevant.
-# The text below provides only a parameter summary. See
+# The following main.cf parameters are especially relevant.
+# The text below provides only a parameter summary. See
# postconf(5) for more details including examples.
#
# alias_database
-# List of alias databases that are updated by the
+# List of alias databases that are updated by the
# newaliases(1) command.
#
# alias_maps
-# List of alias databases queried by the local(8)
+# List of alias databases queried by the local(8)
# delivery agent.
#
# allow_mail_to_commands
-# Restrict the usage of mail delivery to external
+# Restrict the usage of mail delivery to external
# command.
#
# allow_mail_to_files
-# Restrict the usage of mail delivery to external
+# Restrict the usage of mail delivery to external
# file.
#
# expand_owner_alias
# When delivering to an alias that has an owner- com-
-# panion alias, set the envelope sender address to
-# the right-hand side of the owner alias, instead
+# panion alias, set the envelope sender address to
+# the right-hand side of the owner alias, instead
# using of the left-hand side address.
#
# propagate_unmatched_extensions
-# A list of address rewriting or forwarding mecha-
-# nisms that propagate an address extension from the
-# original address to the result. Specify zero or
-# more of canonical, virtual, alias, forward,
+# A list of address rewriting or forwarding mecha-
+# nisms that propagate an address extension from the
+# original address to the result. Specify zero or
+# more of canonical, virtual, alias, forward,
# include, or generic.
#
# owner_request_special
-# Give special treatment to owner-listname and list-
+# Give special treatment to owner-listname and list-
# name-request addresses.
#
# recipient_delimiter
-# Delimiter that separates recipients from address
+# Delimiter that separates recipients from address
# extensions.
#
+# Available in Postfix version 2.3 and later:
+#
+# frozen_delivered_to
+# Update the local(8) delivery agent's Delivered-To:
+# address (see prepend_delivered_header) only once,
+# at the start of a delivery; do not update the
+# Delivered-To: address while expanding aliases or
+# .forward files.
+#
+# sticky_owner_alias
+# When expanding a local(8) alias that has an owner
+# alias (see owner-name discussion above), use the
+# owner information even when the expansion invokes a
+# subordinate alias that has no owner alias.
+#
# STANDARDS
# RFC 822 (ARPA Internet Text Messages)
#
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#
-# ALIASES(5)
+# ALIASES(5)
In addition, when an alias exists for <b>owner-</b><i>name</i>, delivery
diagnostics are directed to that address, instead of to
- the originator. This is typically used to direct delivery
- errors to the owner of a mailing list, who is in a better
- position to deal with mailing list delivery problems than
- the originator of the undelivered mail.
+ the originator of the message. This is typically used to
+ direct delivery errors to the maintainer of a mailing
+ list, who is in a better position to deal with mailing
+ list delivery problems than the originator of the undeliv-
+ ered mail.
The <i>value</i> contains one or more of the following:
<i>address</i>
- Mail is forwarded to <i>address</i>, which is compatible
+ Mail is forwarded to <i>address</i>, which is compatible
with the <a href="http://www.faqs.org/rfcs/rfc822.html">RFC 822</a> standard.
<i>/file/name</i>
- Mail is appended to <i>/file/name</i>. See <a href="local.8.html"><b>local</b>(8)</a> for
- details of delivery to file. Delivery is not lim-
- ited to regular files. For example, to dispose of
+ Mail is appended to <i>/file/name</i>. See <a href="local.8.html"><b>local</b>(8)</a> for
+ details of delivery to file. Delivery is not lim-
+ ited to regular files. For example, to dispose of
unwanted mail, deflect it to <b>/dev/null</b>.
|<i>command</i>
- Mail is piped into <i>command</i>. Commands that contain
- special characters, such as whitespace, should be
- enclosed between double quotes. See <a href="local.8.html"><b>local</b>(8)</a> for
+ Mail is piped into <i>command</i>. Commands that contain
+ special characters, such as whitespace, should be
+ enclosed between double quotes. See <a href="local.8.html"><b>local</b>(8)</a> for
details of delivery to command.
When the command fails, a limited amount of command
- output is mailed back to the sender. The file
- <b>/usr/include/sysexits.h</b> defines the expected exit
- status codes. For example, use <b>|"exit 67"</b> to simu-
- late a "user unknown" error, and <b>|"exit 0"</b> to
+ output is mailed back to the sender. The file
+ <b>/usr/include/sysexits.h</b> defines the expected exit
+ status codes. For example, use <b>|"exit 67"</b> to simu-
+ late a "user unknown" error, and <b>|"exit 0"</b> to
implement an expensive black hole.
<b>:include:</b><i>/file/name</i>
- Mail is sent to the destinations listed in the
+ Mail is sent to the destinations listed in the
named file. Lines in <b>:include:</b> files have the same
syntax as the right-hand side of alias entries.
<b>ADDRESS EXTENSION</b>
When alias database search fails, and the recipient local-
- part contains the optional recipient delimiter (e.g.,
- <i>user+foo</i>), the search is repeated for the unextended
+ part contains the optional recipient delimiter (e.g.,
+ <i>user+foo</i>), the search is repeated for the unextended
address (e.g., <i>user</i>).
- The <b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a></b> parameter controls
- whether an unmatched address extension (<i>+foo</i>) is propa-
+ The <b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a></b> parameter controls
+ whether an unmatched address extension (<i>+foo</i>) is propa-
gated to the result of table lookup.
<b>SECURITY</b>
- The <a href="local.8.html"><b>local</b>(8)</a> delivery agent disallows regular expression
- substitution of $1 etc. in <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>, because that would
+ The <a href="local.8.html"><b>local</b>(8)</a> delivery agent disallows regular expression
+ substitution of $1 etc. in <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>, because that would
open a security hole.
- The <a href="local.8.html"><b>local</b>(8)</a> delivery agent will silently ignore requests
- to use the <a href="proxymap.8.html"><b>proxymap</b>(8)</a> server within <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>. Instead
- it will open the table directly. Before Postfix version
- 2.2, the <a href="local.8.html"><b>local</b>(8)</a> delivery agent will terminate with a
+ The <a href="local.8.html"><b>local</b>(8)</a> delivery agent will silently ignore requests
+ to use the <a href="proxymap.8.html"><b>proxymap</b>(8)</a> server within <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>. Instead
+ it will open the table directly. Before Postfix version
+ 2.2, the <a href="local.8.html"><b>local</b>(8)</a> delivery agent will terminate with a
fatal error.
<b>CONFIGURATION PARAMETERS</b>
- The following <b>main.cf</b> parameters are especially relevant.
- The text below provides only a parameter summary. See
+ The following <b>main.cf</b> parameters are especially relevant.
+ The text below provides only a parameter summary. See
<a href="postconf.5.html"><b>postconf</b>(5)</a> for more details including examples.
<b><a href="postconf.5.html#alias_database">alias_database</a></b>
- List of alias databases that are updated by the
+ List of alias databases that are updated by the
<a href="newaliases.1.html"><b>newaliases</b>(1)</a> command.
<b><a href="postconf.5.html#alias_maps">alias_maps</a></b>
- List of alias databases queried by the <a href="local.8.html"><b>local</b>(8)</a>
+ List of alias databases queried by the <a href="local.8.html"><b>local</b>(8)</a>
delivery agent.
<b><a href="postconf.5.html#allow_mail_to_commands">allow_mail_to_commands</a></b>
- Restrict the usage of mail delivery to external
+ Restrict the usage of mail delivery to external
command.
<b><a href="postconf.5.html#allow_mail_to_files">allow_mail_to_files</a></b>
- Restrict the usage of mail delivery to external
+ Restrict the usage of mail delivery to external
file.
<b><a href="postconf.5.html#expand_owner_alias">expand_owner_alias</a></b>
When delivering to an alias that has an <b>owner-</b> com-
- panion alias, set the envelope sender address to
- the right-hand side of the owner alias, instead
+ panion alias, set the envelope sender address to
+ the right-hand side of the owner alias, instead
using of the left-hand side address.
<b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a></b>
- A list of address rewriting or forwarding mecha-
- nisms that propagate an address extension from the
- original address to the result. Specify zero or
- more of <b>canonical</b>, <b>virtual</b>, <b>alias</b>, <b>forward</b>,
+ A list of address rewriting or forwarding mecha-
+ nisms that propagate an address extension from the
+ original address to the result. Specify zero or
+ more of <b>canonical</b>, <b>virtual</b>, <b>alias</b>, <b>forward</b>,
<b>include</b>, or <b>generic</b>.
<b><a href="postconf.5.html#owner_request_special">owner_request_special</a></b>
- Give special treatment to <b>owner-</b><i>listname</i> and <i>list-</i>
+ Give special treatment to <b>owner-</b><i>listname</i> and <i>list-</i>
<i>name</i><b>-request</b> addresses.
<b><a href="postconf.5.html#recipient_delimiter">recipient_delimiter</a></b>
- Delimiter that separates recipients from address
+ Delimiter that separates recipients from address
extensions.
+ Available in Postfix version 2.3 and later:
+
+ <b><a href="postconf.5.html#frozen_delivered_to">frozen_delivered_to</a></b>
+ Update the <a href="local.8.html">local(8)</a> delivery agent's Delivered-To:
+ address (see <a href="postconf.5.html#prepend_delivered_header">prepend_delivered_header</a>) only once,
+ at the start of a delivery; do not update the
+ Delivered-To: address while expanding aliases or
+ .forward files.
+
+ <b><a href="postconf.5.html#sticky_owner_alias">sticky_owner_alias</a></b>
+ When expanding a <a href="local.8.html">local(8)</a> alias that has an owner
+ alias (see owner-<i>name</i> discussion above), use the
+ owner information even when the expansion invokes a
+ subordinate alias that has no owner alias.
+
<b>STANDARDS</b>
<a href="http://www.faqs.org/rfcs/rfc822.html">RFC 822</a> (ARPA Internet Text Messages)
<b><a href="postconf.5.html#sun_mailtool_compatibility">sun_mailtool_compatibility</a> (no)</b>
Obsolete SUN mailtool compatibility feature.
+ Available in Postfix version 2.3 and later:
+
+ <b><a href="postconf.5.html#frozen_delivered_to">frozen_delivered_to</a> (yes)</b>
+ Update the <a href="local.8.html"><b>local</b>(8)</a> delivery agent's idea of the
+ Delivered-To: address (see prepend_deliv-
+ ered_header) only once, at the start of a delivery
+ attempt; do not update the Delivered-To: address
+ while expanding aliases or .forward files.
+
+ <b><a href="postconf.5.html#sticky_owner_alias">sticky_owner_alias</a> (yes)</b>
+ When expanding a <a href="local.8.html"><b>local</b>(8)</a> alias that has an owner
+ alias (see owner-<i>name</i> discussion in <a href="aliases.5.html"><b>aliases</b>(5)</a>),
+ use the owner information even when the expansion
+ invokes a subordinate alias that has no owner
+ alias.
+
<b>DELIVERY METHOD CONTROLS</b>
The precedence of <a href="local.8.html"><b>local</b>(8)</a> delivery methods from high to
low is: aliases, .forward files, <a href="postconf.5.html#mailbox_transport">mailbox_transport</a>, <a href="postconf.5.html#mailbox_command_maps">mail</a>-
<b><a href="postconf.5.html#prepend_delivered_header">prepend_delivered_header</a> (command, file, forward)</b>
The message delivery contexts where the Postfix
<a href="local.8.html"><b>local</b>(8)</a> delivery agent prepends a Delivered-To:
- message header.
+ message header with the address that the mail was
+ delivered to.
<b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
- The process ID of a Postfix command or daemon
+ The process ID of a Postfix command or daemon
process.
<b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
- The process name of a Postfix command or daemon
+ The process name of a Postfix command or daemon
process.
<b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a> (canonical, virtual)</b>
- What address lookup tables copy an address exten-
+ What address lookup tables copy an address exten-
sion from the lookup key to the lookup result.
<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#recipient_delimiter">recipient_delimiter</a> (empty)</b>
sions (user+foo).
<b><a href="postconf.5.html#require_home_directory">require_home_directory</a> (no)</b>
- Whether or not a <a href="local.8.html"><b>local</b>(8)</a> recipient's home direc-
- tory must exist before mail delivery is attempted.
+ Whether or not a <a href="local.8.html"><b>local</b>(8)</a> recipient's home direc-
+ tory must exist before mail delivery is attempted.
<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>FILES</b>
syslogd(8), system logging
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>HISTORY</b>
The <b>Delivered-To:</b> message header appears in the <b>qmail</b> sys-
tem by Daniel Bernstein.
- The <i>maildir</i> structure appears in the <b>qmail</b> system by
+ The <i>maildir</i> structure appears in the <b>qmail</b> system by
Daniel Bernstein.
<b>AUTHOR(S)</b>
</pre>
+</DD>
+
+<DT><b><a name="frozen_delivered_to">frozen_delivered_to</a>
+(default: yes)</b></DT><DD>
+
+<p> Update the <a href="local.8.html">local(8)</a> delivery agent's idea of the Delivered-To:
+address (see <a href="postconf.5.html#prepend_delivered_header">prepend_delivered_header</a>) only once, at the start of
+a delivery attempt; do not update the Delivered-To: address while
+expanding aliases or .forward files. </p>
+
+<p> This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting can be expensive with deeply nested aliases
+or .forward files. When an alias or .forward file changes the
+Delivered-To: address, it ties up one queue file and one cleanup
+process instance while mail is being forwarded. </p>
+
+
</DD>
<DT><b><a name="hash_queue_depth">hash_queue_depth</a>
<DT><b><a name="prepend_delivered_header">prepend_delivered_header</a>
(default: command, file, forward)</b></DT><DD>
-<p>
-The message delivery contexts where the Postfix <a href="local.8.html">local(8)</a> delivery
-agent prepends a Delivered-To: message header.
-</p>
+<p> The message delivery contexts where the Postfix <a href="local.8.html">local(8)</a> delivery
+agent prepends a Delivered-To: message header with the address
+that the mail was delivered to. This information is used for mail
+delivery loop detection. </p>
<p>
By default, the Postfix local delivery agent prepends a Delivered-To:
</p>
+</DD>
+
+<DT><b><a name="sticky_owner_alias">sticky_owner_alias</a>
+(default: yes)</b></DT><DD>
+
+<p> When expanding a <a href="local.8.html">local(8)</a> alias that has an owner alias (see
+owner-<i>name</i> discussion in <a href="aliases.5.html">aliases(5)</a>), use the owner information
+even when the expansion invokes a subordinate alias that has no
+owner alias. </p>
+
+<p> This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting provides poorer error reporting with nested
+aliases that only have an owner alias at the top level. </p>
+
+
</DD>
<DT><b><a name="strict_7bit_headers">strict_7bit_headers</a>
<b>-m</b> <i>message</i><b>_</b><i>count</i>
Send the specified number of messages (default: 1).
+ <b>-M</b> <i><a href="postconf.5.html#myhostname">myhostname</a></i>
+ Use the specified hostname or [address] in the
+ default sender and recipient addresses, instead of
+ the machine hostname.
+
<b>-r</b> <i>recipient</i><b>_</b><i>count</i>
Send the specified number of recipients per trans-
action (default: 1). Recipient names are generated
between messages. Suspending one thread does not
affect other delivery threads.
+ <b>-v</b> Make the program more verbose, for debugging pur-
+ poses.
+
<b>-w</b> <i>interval</i>
Wait a fixed time between messages. Suspending one
thread does not affect other delivery threads.
<a href="qmqp-sink.1.html">qmqp-sink(1)</a>, QMQP message dump
<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>
Use the specified sender address (default:
<foo@<a href="postconf.5.html#myhostname">myhostname</a>>).
- <b>-o</b> Old mode: don't send HELO, and don't send message
- headers.
-
<b>-l</b> <i>length</i>
- Send <i>length</i> bytes as message payload. The length
+ Send <i>length</i> bytes as message payload. The length
does not include message headers.
<b>-L</b> Speak LMTP rather than SMTP.
<b>-m</b> <i>message</i><b>_</b><i>count</i>
Send the specified number of messages (default: 1).
- <b>-N</b> Prepend a non-repeating sequence number to each
- recipient address. This avoids the artificial 100%
- hit rate in the resolve and rewrite client caches
- and exercises the trivial-rewrite daemon, better
- approximating Postfix performance under real-life
+ <b>-M</b> <i><a href="postconf.5.html#myhostname">myhostname</a></i>
+ Use the specified hostname or [address] in the HELO
+ command and in the default sender and recipient
+ addresses, instead of the machine hostname.
+
+ <b>-N</b> Prepend a non-repeating sequence number to each
+ recipient address. This avoids the artificial 100%
+ hit rate in the resolve and rewrite client caches
+ and exercises the trivial-rewrite daemon, better
+ approximating Postfix performance under real-life
work-loads.
+ <b>-o</b> Old mode: don't send HELO, and don't send message
+ headers.
+
<b>-r</b> <i>recipient</i><b>_</b><i>count</i>
Send the specified number of recipients per trans-
action (default: 1). Recipient names are generated
between messages. Suspending one thread does not
affect other delivery threads.
+ <b>-v</b> Make the program more verbose, for debugging pur-
+ poses.
+
<b>-w</b> <i>interval</i>
Wait a fixed time between messages. Suspending one
thread does not affect other delivery threads.
[<b>inet:</b>]<i>host</i>[:<i>port</i>]
- Connect via TCP to host <i>host</i>, port <i>port</i>. The
+ Connect via TCP to host <i>host</i>, port <i>port</i>. The
default port is <b>smtp</b>.
<b>unix:</b><i>pathname</i>
<a href="smtp-sink.1.html">smtp-sink(1)</a>, SMTP/LMTP message dump
<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>
includes the message headers.
.IP "\fB-m \fImessage_count\fR"
Send the specified number of messages (default: 1).
+.IP "\fB-M \fImyhostname\fR"
+Use the specified hostname or [address] in the default
+sender and recipient addresses, instead of the machine
+hostname.
.IP "\fB-r \fIrecipient_count\fR"
Send the specified number of recipients per transaction (default: 1).
Recipient names are generated by prepending a number to the
.IP "\fB-R \fIinterval\fR"
Wait for a random period of time 0 <= n <= interval between messages.
Suspending one thread does not affect other delivery threads.
+.IP \fB-v\fR
+Make the program more verbose, for debugging purposes.
.IP "\fB-w \fIinterval\fR"
Wait a fixed time between messages.
Suspending one thread does not affect other delivery threads.
message over the same connection.
.IP "\fB-f \fIfrom\fR"
Use the specified sender address (default: <foo@myhostname>).
-.IP \fB-o\fR
-Old mode: don't send HELO, and don't send message headers.
.IP "\fB-l \fIlength\fR"
Send \fIlength\fR bytes as message payload. The length does not
include message headers.
Speak LMTP rather than SMTP.
.IP "\fB-m \fImessage_count\fR"
Send the specified number of messages (default: 1).
+.IP "\fB-M \fImyhostname\fR"
+Use the specified hostname or [address] in the HELO command
+and in the default sender and recipient addresses, instead
+of the machine hostname.
.IP "\fB-N\fR"
Prepend a non-repeating sequence number to each recipient
address. This avoids the artificial 100% hit rate in the
resolve and rewrite client caches and exercises the
trivial-rewrite daemon, better approximating Postfix
performance under real-life work-loads.
+.IP \fB-o\fR
+Old mode: don't send HELO, and don't send message headers.
.IP "\fB-r \fIrecipient_count\fR"
Send the specified number of recipients per transaction (default: 1).
Recipient names are generated by prepending a number to the
.IP "\fB-R \fIinterval\fR"
Wait for a random period of time 0 <= n <= interval between messages.
Suspending one thread does not affect other delivery threads.
+.IP \fB-v\fR
+Make the program more verbose, for debugging purposes.
.IP "\fB-w \fIinterval\fR"
Wait a fixed time between messages.
Suspending one thread does not affect other delivery threads.
lowercase, in order to make database lookups case insensitive.
.PP
In addition, when an alias exists for \fBowner-\fIname\fR, delivery
-diagnostics are directed to that address, instead of to the originator.
-This is typically used to direct delivery errors to the owner of
+diagnostics are directed to that address, instead of to the originator
+of the message.
+This is typically used to direct delivery errors to the maintainer of
a mailing list, who is in a better position to deal with mailing
list delivery problems than the originator of the undelivered mail.
.PP
addresses.
.IP \fBrecipient_delimiter\fR
Delimiter that separates recipients from address extensions.
+.PP
+Available in Postfix version 2.3 and later:
+.IP \fBfrozen_delivered_to\fR
+Update the local(8) delivery agent's Delivered-To: address
+(see prepend_delivered_header) only once, at the start of
+a delivery; do not update the Delivered-To: address while
+expanding aliases or .forward files.
+.IP \fBsticky_owner_alias\fR
+When expanding a local(8) alias that has an owner alias
+(see owner-\fIname\fR discussion above), use the owner
+information even when the expansion invokes a subordinate
+alias that has no owner alias.
.SH "STANDARDS"
.na
.nf
.fi
.ad
.ft R
+.SH frozen_delivered_to (default: yes)
+Update the \fBlocal\fR(8) delivery agent's idea of the Delivered-To:
+address (see prepend_delivered_header) only once, at the start of
+a delivery attempt; do not update the Delivered-To: address while
+expanding aliases or .forward files.
+.PP
+This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting can be expensive with deeply nested aliases
+or .forward files. When an alias or .forward file changes the
+Delivered-To: address, it ties up one queue file and one cleanup
+process instance while mail is being forwarded.
.SH hash_queue_depth (default: 1)
The number of subdirectory levels for queue directories listed with
the hash_queue_names parameter.
This feature is available in Postfix 2.0 and later.
.SH prepend_delivered_header (default: command, file, forward)
The message delivery contexts where the Postfix \fBlocal\fR(8) delivery
-agent prepends a Delivered-To: message header.
+agent prepends a Delivered-To: message header with the address
+that the mail was delivered to. This information is used for mail
+delivery loop detection.
.PP
By default, the Postfix local delivery agent prepends a Delivered-To:
header when forwarding mail and when delivering to file (mailbox)
.PP
Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
The default time unit is s (seconds).
+.SH sticky_owner_alias (default: yes)
+When expanding a \fBlocal\fR(8) alias that has an owner alias (see
+owner-\fIname\fR discussion in \fBaliases\fR(5)), use the owner information
+even when the expansion invokes a subordinate alias that has no
+owner alias.
+.PP
+This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting provides poorer error reporting with nested
+aliases that only have an owner alias at the top level.
.SH strict_7bit_headers (default: no)
Reject mail with 8-bit text in message headers. This blocks mail
from poorly written applications.
recipient_delimiter is set to "-".
.IP "\fBsun_mailtool_compatibility (no)\fR"
Obsolete SUN mailtool compatibility feature.
+.PP
+Available in Postfix version 2.3 and later:
+.IP "\fBfrozen_delivered_to (yes)\fR"
+Update the \fBlocal\fR(8) delivery agent's idea of the Delivered-To:
+address (see prepend_delivered_header) only once, at the start of
+a delivery attempt; do not update the Delivered-To: address while
+expanding aliases or .forward files.
+.IP "\fBsticky_owner_alias (yes)\fR"
+When expanding a \fBlocal\fR(8) alias that has an owner alias (see
+owner-\fIname\fR discussion in \fBaliases\fR(5)), use the owner information
+even when the expansion invokes a subordinate alias that has no
+owner alias.
.SH "DELIVERY METHOD CONTROLS"
.na
.nf
process terminates.
.IP "\fBprepend_delivered_header (command, file, forward)\fR"
The message delivery contexts where the Postfix \fBlocal\fR(8) delivery
-agent prepends a Delivered-To: message header.
+agent prepends a Delivered-To: message header with the address
+that the mail was delivered to.
.IP "\fBprocess_id (read-only)\fR"
The process ID of a Postfix command or daemon process.
.IP "\fBprocess_name (read-only)\fR"
s;\btls_ran[-</Bb>]*\n* *[<Bb>]*dom_reseed_period\b;<a href="postconf.5.html#tls_random_reseed_period">$&</a>;g;
s;\btls_ran[-</Bb>]*\n* *[<Bb>]*dom_source\b;<a href="postconf.5.html#tls_random_source">$&</a>;g;
+ s;\bfrozen_delivered_to\b;<a href="postconf.5.html#frozen_delivered_to">$&</a>;g;
+ s;\bsticky_owner_alias\b;<a href="postconf.5.html#sticky_owner_alias">$&</a>;g;
+
# Undo hyperlinks of manual pages with the same name as parameters.
s/<a href="[^"]*">([^<]*)<\/a>\(/$1(/g;
# lowercase, in order to make database lookups case insensitive.
# .PP
# In addition, when an alias exists for \fBowner-\fIname\fR, delivery
-# diagnostics are directed to that address, instead of to the originator.
-# This is typically used to direct delivery errors to the owner of
+# diagnostics are directed to that address, instead of to the originator
+# of the message.
+# This is typically used to direct delivery errors to the maintainer of
# a mailing list, who is in a better position to deal with mailing
# list delivery problems than the originator of the undelivered mail.
# .PP
# addresses.
# .IP \fBrecipient_delimiter\fR
# Delimiter that separates recipients from address extensions.
+# .PP
+# Available in Postfix version 2.3 and later:
+# .IP \fBfrozen_delivered_to\fR
+# Update the local(8) delivery agent's Delivered-To: address
+# (see prepend_delivered_header) only once, at the start of
+# a delivery; do not update the Delivered-To: address while
+# expanding aliases or .forward files.
+# .IP \fBsticky_owner_alias\fR
+# When expanding a local(8) alias that has an owner alias
+# (see owner-\fIname\fR discussion above), use the owner
+# information even when the expansion invokes a subordinate
+# alias that has no owner alias.
# STANDARDS
# RFC 822 (ARPA Internet Text Messages)
# SEE ALSO
%PARAM prepend_delivered_header command, file, forward
-<p>
-The message delivery contexts where the Postfix local(8) delivery
-agent prepends a Delivered-To: message header.
-</p>
+<p> The message delivery contexts where the Postfix local(8) delivery
+agent prepends a Delivered-To: message header with the address
+that the mail was delivered to. This information is used for mail
+delivery loop detection. </p>
<p>
By default, the Postfix local delivery agent prepends a Delivered-To:
</pre>
<p> This feature is available in Postfix 2.3 and later. </p>
+
+%PARAM sticky_owner_alias yes
+
+<p> When expanding a local(8) alias that has an owner alias (see
+owner-<i>name</i> discussion in aliases(5)), use the owner information
+even when the expansion invokes a subordinate alias that has no
+owner alias. </p>
+
+<p> This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting provides poorer error reporting with nested
+aliases that only have an owner alias at the top level. </p>
+
+%PARAM frozen_delivered_to yes
+
+<p> Update the local(8) delivery agent's idea of the Delivered-To:
+address (see prepend_delivered_header) only once, at the start of
+a delivery attempt; do not update the Delivered-To: address while
+expanding aliases or .forward files. </p>
+
+<p> This feature is available in Postfix 2.3 and later. With older
+Postfix releases, the behavior is as if this parameter is set to
+"no". The old setting can be expensive with deeply nested aliases
+or .forward files. When an alias or .forward file changes the
+Delivered-To: address, it ties up one queue file and one cleanup
+process instance while mail is being forwarded. </p>
#define DEF_MSG_STRIP_CHARS ""
extern char *var_msg_strip_chars;
+ /*
+ * Local forwarding complexity controls.
+ */
+#define VAR_FROZEN_DELIVERED "frozen_delivered_to"
+#define DEF_FROZEN_DELIVERED 1
+extern bool var_frozen_delivered;
+
+#define VAR_STICKY_OWNER_ALIAS "sticky_owner_alias"
+#define DEF_STICKY_OWNER_ALIAS 1
+extern bool var_sticky_owner_alias;
+
/* LICENSE
/* .ad
/* .fi
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20050922"
+#define MAIL_RELEASE_DATE "20050923"
#define MAIL_VERSION_NUMBER "2.3"
#ifdef SNAPSHOT
#if SASL_VERSION_MAJOR < 2
/* SASL version 1.x */
-#define SASL_LOG_WARN SASL_LOG_WARNING
-#define SASL_LOG_NOTE SASL_LOG_INFO
#define SASL_CLIENT_NEW(srv, fqdn, lport, rport, prompt, secflags, pconn) \
sasl_client_new(srv, fqdn, prompt, secflags, pconn)
#define SASL_CLIENT_START(conn, mechlst, secret, prompt, clout, cllen, mech) \
{
switch (priority) {
case SASL_LOG_ERR: /* unusual errors */
- case SASL_LOG_WARN: /* non-fatal warnings */
+#ifdef SASL_LOG_WARN /* non-fatal warnings (Cyrus-SASL v2) */
+ case SASL_LOG_WARN:
+#endif
+#ifdef SASL_LOG_WARNING /* non-fatal warnings (Cyrus-SASL v1) */
+ case SASL_LOG_WARNING:
+#endif
msg_warn("SASL authentication problem: %s", message);
break;
- case SASL_LOG_NOTE: /* other info */
+#ifdef SASL_LOG_INFO
+ case SASL_LOG_INFO: /* other info (Cyrus-SASL v1) */
if (msg_verbose)
msg_info("SASL authentication info: %s", message);
break;
-#if SASL_VERSION_MAJOR >= 2
- case SASL_LOG_FAIL: /* authentication failures */
+#endif
+#ifdef SASL_LOG_NOTE
+ case SASL_LOG_NOTE: /* other info (Cyrus-SASL v2) */
+ if (msg_verbose)
+ msg_info("SASL authentication info: %s", message);
+ break;
+#endif
+#ifdef SASL_LOG_FAIL
+ case SASL_LOG_FAIL: /* authentication failures
+ * (Cyrus-SASL v2) */
msg_warn("SASL authentication failure: %s", message);
+ break;
+#endif
+#ifdef SASL_LOG_DEBUG
+ case SASL_LOG_DEBUG: /* more verbose than LOG_NOTE
+ * (Cyrus-SASL v2) */
+ if (msg_verbose > 1)
+ msg_info("SASL authentication debug: %s", message);
+ break;
+#endif
+#ifdef SASL_LOG_TRACE
+ case SASL_LOG_TRACE: /* traces of internal
+ * protocols (Cyrus-SASL v2) */
+ if (msg_verbose > 1)
+ msg_info("SASL authentication trace: %s", message);
+ break;
+#endif
+#ifdef SASL_LOG_PASS
+ case SASL_LOG_PASS: /* traces of internal
+ * protocols, including
+ * passwords (Cyrus-SASL v2) */
+ if (msg_verbose > 1)
+ msg_info("SASL authentication pass: %s", message);
+ break;
#endif
}
return (SASL_OK);
#endif
)
msg_fatal("incorrect SASL library version. "
- "Postfix was built with include files from version %d.%d.%d, "
+ "Postfix was built with include files from version %d.%d.%d, "
"but the run-time library version is %d.%d.%d",
SASL_VERSION_MAJOR, SASL_VERSION_MINOR, SASL_VERSION_STEP,
sasl_major, sasl_minor, sasl_step);
if (msg_verbose)
msg_info("%s: %s: SASL mechanisms %s",
- myname, session->namaddr, state->sasl_mechanism_list);
+ myname, session->namaddr, state->sasl_mechanism_list);
/*
* Start the client side authentication protocol.
&clientout, &clientoutlen, &mechanism);
if (result != SASL_OK && result != SASL_CONTINUE) {
dsb_update(why, "4.7.0", DSB_DEF_ACTION, DSB_SKIP_RMTA, DSB_DTYPE_SASL,
- 421, sasl_errstring(result, NO_SASL_LANGLIST,
- NO_SASL_OUTLANG),
- "cannot SASL authenticate to server %s: %s",
- session->namaddr,
- sasl_errstring(result, NO_SASL_LANGLIST,
- NO_SASL_OUTLANG));
+ 421, sasl_errstring(result, NO_SASL_LANGLIST,
+ NO_SASL_OUTLANG),
+ "cannot SASL authenticate to server %s: %s",
+ session->namaddr,
+ sasl_errstring(result, NO_SASL_LANGLIST,
+ NO_SASL_OUTLANG));
return (-1);
}
if (SASL_DECODE64(line, serverinlen, STR(state->sasl_decoded),
serverinlen, &enc_length) != SASL_OK) {
lmtp_dsn_update(why, "5.7.0", DSN_BY_LOCAL_MTA,
- 501, "501 malformed SASL challenge",
+ 501, "501 malformed SASL challenge",
"malformed SASL challenge from server %s",
session->namaddr);
return (-1);
SET_OWNER_ATTR(state.msg_attr, STR(canon_owner), state.level);
} else {
canon_owner = 0;
- RESET_OWNER_ATTR(state.msg_attr, state.level);
+ if (var_sticky_owner_alias == 0)
+ RESET_OWNER_ATTR(state.msg_attr, state.level);
}
/*
* Set the delivered message attribute to the recipient, so that
* this message will list the correct forwarding address.
*/
- state.msg_attr.delivered = state.msg_attr.rcpt.address;
+ if (var_frozen_delivered == 0)
+ state.msg_attr.delivered = state.msg_attr.rcpt.address;
/*
* Deliver.
* Set the delivered message attribute to the recipient, so that this
* message will list the correct forwarding address.
*/
- state.msg_attr.delivered = state.msg_attr.rcpt.address;
+ if (var_frozen_delivered == 0)
+ state.msg_attr.delivered = state.msg_attr.rcpt.address;
/*
* DELIVERY RIGHTS
/* recipient_delimiter is set to "-".
/* .IP "\fBsun_mailtool_compatibility (no)\fR"
/* Obsolete SUN mailtool compatibility feature.
+/* .PP
+/* Available in Postfix version 2.3 and later:
+/* .IP "\fBfrozen_delivered_to (yes)\fR"
+/* Update the \fBlocal\fR(8) delivery agent's idea of the Delivered-To:
+/* address (see prepend_delivered_header) only once, at the start of
+/* a delivery attempt; do not update the Delivered-To: address while
+/* expanding aliases or .forward files.
+/* .IP "\fBsticky_owner_alias (yes)\fR"
+/* When expanding a \fBlocal\fR(8) alias that has an owner alias (see
+/* owner-\fIname\fR discussion in \fBaliases\fR(5)), use the owner information
+/* even when the expansion invokes a subordinate alias that has no
+/* owner alias.
/* DELIVERY METHOD CONTROLS
/* .ad
/* .fi
/* process terminates.
/* .IP "\fBprepend_delivered_header (command, file, forward)\fR"
/* The message delivery contexts where the Postfix \fBlocal\fR(8) delivery
-/* agent prepends a Delivered-To: message header.
+/* agent prepends a Delivered-To: message header with the address
+/* that the mail was delivered to.
/* .IP "\fBprocess_id (read-only)\fR"
/* The process ID of a Postfix command or daemon process.
/* .IP "\fBprocess_name (read-only)\fR"
int var_mailtool_compat;
char *var_mailbox_lock;
int var_mailbox_limit;
+bool var_frozen_delivered;
+bool var_sticky_owner_alias;
int local_cmd_deliver_mask;
int local_file_deliver_mask;
VAR_EXP_OWN_ALIAS, DEF_EXP_OWN_ALIAS, &var_exp_own_alias,
VAR_STAT_HOME_DIR, DEF_STAT_HOME_DIR, &var_stat_home_dir,
VAR_MAILTOOL_COMPAT, DEF_MAILTOOL_COMPAT, &var_mailtool_compat,
+ VAR_FROZEN_DELIVERED, DEF_FROZEN_DELIVERED, &var_frozen_delivered,
+ VAR_STICKY_OWNER_ALIAS, DEF_STICKY_OWNER_ALIAS, &var_sticky_owner_alias,
0,
};
*/
if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
msg_fatal("seek message file %s: %m", VSTREAM_PATH(state.msg_attr.fp));
- state.msg_attr.delivered = state.msg_attr.rcpt.address;
+ if (var_frozen_delivered == 0)
+ state.msg_attr.delivered = state.msg_attr.rcpt.address;
mail_copy_status = MAIL_COPY_STAT_WRITE;
if (*var_home_mailbox) {
spool_dir = 0;
*/
if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
msg_fatal("seek message file %s: %m", VSTREAM_PATH(state.msg_attr.fp));
- state.msg_attr.delivered = state.msg_attr.rcpt.address;
+ if (var_frozen_delivered == 0)
+ state.msg_attr.delivered = state.msg_attr.rcpt.address;
mail_copy_status = MAIL_COPY_STAT_WRITE;
buf = vstring_alloc(100);
#if SASL_VERSION_MAJOR < 2
/* SASL version 1.x */
-#define SASL_LOG_WARN SASL_LOG_WARNING
-#define SASL_LOG_NOTE SASL_LOG_INFO
#define SASL_CLIENT_NEW(srv, fqdn, lport, rport, prompt, secflags, pconn) \
sasl_client_new(srv, fqdn, prompt, secflags, pconn)
#define SASL_CLIENT_START(conn, mechlst, secret, prompt, clout, cllen, mech) \
{
switch (priority) {
case SASL_LOG_ERR: /* unusual errors */
- case SASL_LOG_WARN: /* non-fatal warnings */
+#ifdef SASL_LOG_WARN /* non-fatal warnings (Cyrus-SASL v2) */
+ case SASL_LOG_WARN:
+#endif
+#ifdef SASL_LOG_WARNING /* non-fatal warnings (Cyrus-SASL v1) */
+ case SASL_LOG_WARNING:
+#endif
msg_warn("SASL authentication problem: %s", message);
break;
- case SASL_LOG_NOTE: /* other info */
+#ifdef SASL_LOG_INFO
+ case SASL_LOG_INFO: /* other info (Cyrus-SASL v1) */
if (msg_verbose)
msg_info("SASL authentication info: %s", message);
break;
+#endif
+#ifdef SASL_LOG_NOTE
+ case SASL_LOG_NOTE: /* other info (Cyrus-SASL v2) */
+ if (msg_verbose)
+ msg_info("SASL authentication info: %s", message);
+ break;
+#endif
#ifdef SASL_LOG_FAIL
- case SASL_LOG_FAIL: /* authentication failures */
+ case SASL_LOG_FAIL: /* authentication failures
+ * (Cyrus-SASL v2) */
msg_warn("SASL authentication failure: %s", message);
break;
#endif
#ifdef SASL_LOG_DEBUG
- case SASL_LOG_DEBUG:
+ case SASL_LOG_DEBUG: /* more verbose than LOG_NOTE
+ * (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication debug: %s", message);
break;
#endif
#ifdef SASL_LOG_TRACE
- case SASL_LOG_TRACE:
+ case SASL_LOG_TRACE: /* traces of internal
+ * protocols (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication trace: %s", message);
break;
#endif
#ifdef SASL_LOG_PASS
- case SASL_LOG_PASS:
+ case SASL_LOG_PASS: /* traces of internal
+ * protocols, including
+ * passwords (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication pass: %s", message);
break;
#if SASL_VERSION_MAJOR < 2
/* SASL version 1.x */
-#define SASL_LOG_WARN SASL_LOG_WARNING
-#define SASL_LOG_NOTE SASL_LOG_INFO
#define SASL_SERVER_NEW(srv, fqdn, rlm, lport, rport, cb, secflags, pconn) \
sasl_server_new(srv, fqdn, rlm, cb, secflags, pconn)
#define SASL_SERVER_START(conn, mech, clin, clinlen, srvout, srvoutlen, err) \
const char *message)
{
switch (priority) {
- case SASL_LOG_ERR:
- case SASL_LOG_WARN:
+ case SASL_LOG_ERR: /* unusual errors */
+#ifdef SASL_LOG_WARN /* non-fatal warnings (Cyrus-SASL v2) */
+ case SASL_LOG_WARN:
+#endif
+#ifdef SASL_LOG_WARNING /* non-fatal warnings (Cyrus-SASL v1) */
+ case SASL_LOG_WARNING:
+#endif
msg_warn("SASL authentication problem: %s", message);
break;
- case SASL_LOG_NOTE:
+#ifdef SASL_LOG_INFO
+ case SASL_LOG_INFO: /* other info (Cyrus-SASL v1) */
if (msg_verbose)
msg_info("SASL authentication info: %s", message);
break;
+#endif
+#ifdef SASL_LOG_NOTE
+ case SASL_LOG_NOTE: /* other info (Cyrus-SASL v2) */
+ if (msg_verbose)
+ msg_info("SASL authentication info: %s", message);
+ break;
+#endif
#ifdef SASL_LOG_FAIL
- case SASL_LOG_FAIL:
+ case SASL_LOG_FAIL: /* authentication failures
+ * (Cyrus-SASL v2) */
msg_warn("SASL authentication failure: %s", message);
break;
#endif
#ifdef SASL_LOG_DEBUG
- case SASL_LOG_DEBUG:
+ case SASL_LOG_DEBUG: /* more verbose than LOG_NOTE
+ * (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication debug: %s", message);
break;
#endif
#ifdef SASL_LOG_TRACE
- case SASL_LOG_TRACE:
+ case SASL_LOG_TRACE: /* traces of internal
+ * protocols (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication trace: %s", message);
break;
#endif
#ifdef SASL_LOG_PASS
- case SASL_LOG_PASS:
+ case SASL_LOG_PASS: /* traces of internal
+ * protocols, including
+ * passwords (Cyrus-SASL v2) */
if (msg_verbose > 1)
msg_info("SASL authentication pass: %s", message);
break;
#endif
}
- return SASL_OK;
+ return (SASL_OK);
}
/*
#endif
)
msg_fatal("incorrect SASL library version. "
- "Postfix was built with include files from version %d.%d.%d, "
+ "Postfix was built with include files from version %d.%d.%d, "
"but the run-time library version is %d.%d.%d",
SASL_VERSION_MAJOR, SASL_VERSION_MINOR, SASL_VERSION_STEP,
sasl_major, sasl_minor, sasl_step);
qmqp-source.o: ../../include/sane_connect.h
qmqp-source.o: ../../include/split_at.h
qmqp-source.o: ../../include/sys_defs.h
+qmqp-source.o: ../../include/valid_hostname.h
+qmqp-source.o: ../../include/valid_mailhost_addr.h
qmqp-source.o: ../../include/vbuf.h
qmqp-source.o: ../../include/vstream.h
qmqp-source.o: ../../include/vstring.h
smtp-source.o: ../../include/smtp_stream.h
smtp-source.o: ../../include/split_at.h
smtp-source.o: ../../include/sys_defs.h
+smtp-source.o: ../../include/valid_hostname.h
+smtp-source.o: ../../include/valid_mailhost_addr.h
smtp-source.o: ../../include/vbuf.h
smtp-source.o: ../../include/vstream.h
smtp-source.o: ../../include/vstring.h
/* includes the message headers.
/* .IP "\fB-m \fImessage_count\fR"
/* Send the specified number of messages (default: 1).
+/* .IP "\fB-M \fImyhostname\fR"
+/* Use the specified hostname or [address] in the default
+/* sender and recipient addresses, instead of the machine
+/* hostname.
/* .IP "\fB-r \fIrecipient_count\fR"
/* Send the specified number of recipients per transaction (default: 1).
/* Recipient names are generated by prepending a number to the
/* .IP "\fB-R \fIinterval\fR"
/* Wait for a random period of time 0 <= n <= interval between messages.
/* Suspending one thread does not affect other delivery threads.
+/* .IP \fB-v\fR
+/* Make the program more verbose, for debugging purposes.
/* .IP "\fB-w \fIinterval\fR"
/* Wait a fixed time between messages.
/* Suspending one thread does not affect other delivery threads.
#include <host_port.h>
#include <myaddrinfo.h>
#include <inet_proto.h>
+#include <valid_hostname.h>
+#include <valid_mailhost_addr.h>
/* Global library. */
static void usage(char *myname)
{
- msg_fatal("usage: %s -s sess -l msglen -m msgs -c -C count -f from -t to -R delay -v -w delay host[:port]", myname);
+ msg_fatal("usage: %s -cv -s sess -l msglen -m msgs -C count -M myhostname -f from -t to -R delay -w delay host[:port]", myname);
}
/* main - parse JCL and start the machine */
/*
* Parse JCL.
*/
- while ((ch = GETOPT(argc, argv, "46cC:f:l:m:r:R:s:t:vw:")) > 0) {
+ while ((ch = GETOPT(argc, argv, "46cC:f:l:m:M:r:R:s:t:vw:")) > 0) {
switch (ch) {
case '4':
protocols = INET_PROTO_NAME_IPV4;
if ((message_count = atoi(optarg)) <= 0)
usage(argv[0]);
break;
+ case 'M':
+ if (*optarg == '[') {
+ if (!valid_mailhost_literal(optarg, DO_GRIPE))
+ msg_fatal("bad address literal: %s", optarg);
+ } else {
+ if (!valid_hostname(optarg, DO_GRIPE))
+ msg_fatal("bad hostname: %s", optarg);
+ }
+ var_myhostname = optarg;
+ break;
case 'r':
if ((recipients = atoi(optarg)) <= 0)
usage(argv[0]);
/*
* Make sure we have sender and recipient addresses.
*/
- var_myhostname = get_hostname();
+ if (var_myhostname == 0)
+ var_myhostname = get_hostname();
if (sender == 0 || recipient == 0) {
vstring_sprintf(buffer, "foo@%s", var_myhostname);
defaddr = mystrdup(vstring_str(buffer));
/* message over the same connection.
/* .IP "\fB-f \fIfrom\fR"
/* Use the specified sender address (default: <foo@myhostname>).
-/* .IP \fB-o\fR
-/* Old mode: don't send HELO, and don't send message headers.
/* .IP "\fB-l \fIlength\fR"
/* Send \fIlength\fR bytes as message payload. The length does not
/* include message headers.
/* Speak LMTP rather than SMTP.
/* .IP "\fB-m \fImessage_count\fR"
/* Send the specified number of messages (default: 1).
+/* .IP "\fB-M \fImyhostname\fR"
+/* Use the specified hostname or [address] in the HELO command
+/* and in the default sender and recipient addresses, instead
+/* of the machine hostname.
/* .IP "\fB-N\fR"
/* Prepend a non-repeating sequence number to each recipient
/* address. This avoids the artificial 100% hit rate in the
/* resolve and rewrite client caches and exercises the
/* trivial-rewrite daemon, better approximating Postfix
/* performance under real-life work-loads.
+/* .IP \fB-o\fR
+/* Old mode: don't send HELO, and don't send message headers.
/* .IP "\fB-r \fIrecipient_count\fR"
/* Send the specified number of recipients per transaction (default: 1).
/* Recipient names are generated by prepending a number to the
/* .IP "\fB-R \fIinterval\fR"
/* Wait for a random period of time 0 <= n <= interval between messages.
/* Suspending one thread does not affect other delivery threads.
+/* .IP \fB-v\fR
+/* Make the program more verbose, for debugging purposes.
/* .IP "\fB-w \fIinterval\fR"
/* Wait a fixed time between messages.
/* Suspending one thread does not affect other delivery threads.
#include <host_port.h>
#include <myaddrinfo.h>
#include <inet_proto.h>
+#include <valid_hostname.h>
+#include <valid_mailhost_addr.h>
/* Global library. */
static void usage(char *myname)
{
- msg_fatal("usage: %s -cdLNov -s sess -l msglen -m msgs -C count -f from -t to -r rcptcount -R delay -w delay host[:port]", myname);
+ msg_fatal("usage: %s -cdLNov -s sess -l msglen -m msgs -C count -M myhostname -f from -t to -r rcptcount -R delay -w delay host[:port]", myname);
}
/* main - parse JCL and start the machine */
/*
* Parse JCL.
*/
- while ((ch = GETOPT(argc, argv, "46cC:df:l:Lm:Nor:R:s:S:t:vw:")) > 0) {
+ while ((ch = GETOPT(argc, argv, "46cC:df:l:Lm:M:Nor:R:s:S:t:vw:")) > 0) {
switch (ch) {
case '4':
protocols = INET_PROTO_NAME_IPV4;
if ((message_count = atoi(optarg)) <= 0)
msg_fatal("bad message count: %s", optarg);
break;
+ case 'M':
+ if (*optarg == '[') {
+ if (!valid_mailhost_literal(optarg, DO_GRIPE))
+ msg_fatal("bad address literal: %s", optarg);
+ } else {
+ if (!valid_hostname(optarg, DO_GRIPE))
+ msg_fatal("bad hostname: %s", optarg);
+ }
+ var_myhostname = optarg;
+ break;
case 'N':
number_rcpts = 1;
break;
/*
* Make sure we have sender and recipient addresses.
*/
- var_myhostname = get_hostname();
+ if (var_myhostname == 0)
+ var_myhostname = get_hostname();
if (sender == 0 || recipient == 0) {
vstring_sprintf(buffer, "foo@%s", var_myhostname);
defaddr = mystrdup(vstring_str(buffer));