2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 05:38:06 +00:00

postfix-2.3-20051114

This commit is contained in:
Wietse Venema 2005-11-14 00:00:00 -05:00 committed by Viktor Dukhovni
parent efd8a7a29e
commit 8f6da00739
32 changed files with 1084 additions and 174 deletions

View File

@ -11368,13 +11368,31 @@ Apologies for any names omitted.
20051112
Feature (grumble): configurable bounce message templates
based on contribution by Nicolas Riendeau. I kept the general
format of his templates, but placed them together in one
file to reduce process initialization overhead. Files:
bounce/bounce_template.c, bounce/dict_ml.c (to be moved to
library if useful enough). A sample bounce message template
file is installed as $config_directory/bounce.cf.default.
Feature: configurable bounce message templates based on
contribution by Nicolas Riendeau. I kept the general format
of his templates, but placed them together in one file to
reduce process initialization overhead (most requests to
the bounce daemon are not for sending bounce messages).
Files: bounce/bounce_template.c, bounce/dict_ml.c (to be
moved to library if useful enough). A sample bounce message
template file is installed as $config_directory/bounce.cf.default.
20051113
Feature: "postconf -b filename" to preview the non-default
bounce message templates with $name expansions in the text.
The actual work is of course done by the bounce daemon.
20051114
Feature: -V option to make Postfix daemons to log to stderr.
This is used when a daemon is invoked in stand-alone mode
by a (non-daemon) command.
Feature: "postconf -t" displays DSN templates, headers and
all; use postconf -t ''" to view built-ins.
Cleanup: renamed fail_template into failure_template.
Open problems:

View File

@ -17,6 +17,35 @@ Incompatibility with Postfix 2.1 and earlier
If you upgrade from Postfix 2.1 or earlier, read RELEASE_NOTES-2.2
before proceeding.
Major changes with snapshot 20051113
====================================
Configurable bounce messages, based on a format that was developed
by Nicolas Riendeau. The file with templates is specified with the
bounce_template_file parameter. Details are in the bounce(5) manual
page, and examples of the built-in templates can be found in a file
bounce.cf.default in the Postfix configuration directory. The
template for the default bounce message looks like this:
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_name program 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.
The $mail_name program
EOF
Incompatibility with snapshot 20051106
======================================

View File

@ -143,6 +143,7 @@ $manpage_directory/man1/sendmail.1:f:root:-:644
$manpage_directory/man5/access.5:f:root:-:644
$manpage_directory/man5/aliases.5:f:root:-:644
$manpage_directory/man5/body_checks.5:f:root:-:644
$manpage_directory/man5/bounce.5:f:root:-:644
$manpage_directory/man5/canonical.5:f:root:-:644
$manpage_directory/man5/cidr_table.5:f:root:-:644
$manpage_directory/man5/generics.5:f:root:-:644:o

View File

@ -18,7 +18,7 @@ CONFIG = access.5.html aliases.5.html canonical.5.html relocated.5.html \
transport.5.html virtual.5.html pcre_table.5.html regexp_table.5.html \
cidr_table.5.html tcp_table.5.html header_checks.5.html \
ldap_table.5.html mysql_table.5.html pgsql_table.5.html \
master.5.html nisplus_table.5.html generic.5.html
master.5.html nisplus_table.5.html generic.5.html bounce.5.html
OTHER = postfix-manuals.html
AWK = awk '{ print; if (NR == 2) print ".pl 9999\n.ll 65" }'
MAN2HTML = man2html -t "Postfix manual - `IFS=.; set \`echo $@\`; echo \"$$1($$2)\"`"
@ -229,6 +229,10 @@ aliases.5.html: ../proto/aliases
PATH=../mantools:$$PATH; \
srctoman - $? | $(AWK) | nroff -man | uniq | $(MAN2HTML) | postlink >$@
bounce.5.html: ../proto/bounce
PATH=../mantools:$$PATH; \
srctoman - $? | $(AWK) | nroff -man | uniq | $(MAN2HTML) | postlink >$@
canonical.5.html: ../proto/canonical
PATH=../mantools:$$PATH; \
srctoman - $? | $(AWK) | nroff -man | uniq | $(MAN2HTML) | postlink >$@

196
postfix/html/bounce.5.html Normal file
View File

@ -0,0 +1,196 @@
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<title> Postfix manual - bounce(5) </title>
</head> <body> <pre>
BOUNCE(5) BOUNCE(5)
<b>NAME</b>
bounce - Postfix bounce message template format
<b>SYNOPSIS</b>
<b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a> = /etc/postfix/bounce.cf</b>
<b>postconf -b</b> [<i>template</i><b>_</b><i>file</i>]
<b>DESCRIPTION</b>
The Postfix <a href="bounce.8.html"><b>bounce</b>(8)</a> server produces delivery status
notification (DSN) messages for undeliverable mail,
delayed mail, successful delivery or address verification
requests.
By default, these notifications are generated from built-
in templates with message headers and message text. Sites
can override the built-in information by specifying a
bounce template file with the <b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a></b> config-
uration parameter.
This document describes the general procedure to create a
bounce template file, followed by the specific details of
bounce template formats.
<b>GENERAL PROCEDURE</b>
To create customized bounce template file, create a tempo-
rary copy of the file <b>/etc/postfix/bounce.cf.default</b> and
edit the temporary file.
To preview the results of $<i>name</i> expansions in the template
text, use the command
<b>postconf -b</b> <i>temporary</i><b>_</b><i>file</i>
Errors in the template will be reported to the standard
error stream and to the syslog daemon.
While previewing the text, be sure to pay particular
attention to the expansion of time value parameters that
appear in the delayed mail notification text.
Once the result is satisfactory, copy the template to the
Postfix configuration directory and specify in main.cf
something like:
/etc/postfix/main.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,
delayed mail, successful delivery or for address verifica-
tion. These templates are named <b>failure_template</b>,
<b>delay_template</b>, <b>success_template</b> and <b>verify_template</b>,
respectively. You can but do not have to specify all four
templates in a bounce template file.
Each template starts with "<i>template</i><b>_</b><i>name</i> <b>=</b> &lt;&lt;<b>EOF</b>" and ends
with a line that contains the word "<b>EOF</b>" only. You can
change the word EOF, but you can't enclose it in quotes as
with the shell or with Perl (<i>template</i><b>_</b><i>name</i> <b>=</b> &lt;&lt;<b>'EOF'</b>).
Here is an example:
# The failure template is used for undeliverable mail.
failure_template = &lt;&lt;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 $<a href="postconf.5.html#mail_name">mail_name</a> program at host $<a href="postconf.5.html#myhostname">myhostname</a>.
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 &lt;postmaster&gt;
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The $<a href="postconf.5.html#mail_name">mail_name</a> program
EOF
No special meaning is given to the backslash character or
to leading whitespace; these are always taken literally.
Outside the &lt;&lt; context, lines beginning with "#" are
ignored, as are empty lines, and lines consisting of
whitespace only.
Examples of all templates can be found in the file
<b>bounce.cf.default</b> in the Postfix configuration directory.
<b>TEMPLATE HEADER FORMAT</b>
The first portion of a bounce template consists of
optional template headers. These either become message
headers in the delivery status notification, or control
the formatting of the notification. Headers not specified
in a template will be left at their default value.
The following headers are supported:
<b>Charset:</b>
The MIME character set of the template message
text. See the "TEMPLATE MESSAGE TEXT FORMAT"
description below.
<b>From:</b> The sender address that the recipient will see.
<b>Subject:</b>
The subject that the recipient will see.
<b>Postmaster-Subject:</b>
The subject that will be used in Postmaster copies
of undeliverable or delayed mail notifications.
These copies are sent under control of the
<a href="postconf.5.html#notify_classes">notify_classes</a> configuration parameter.
The usage and specification of template message headers is
subject to the following restrictions:
<b>o</b> Template message header names can be specified in
upper case, lower case or mixed case. Postfix
always uses the spelling as shown in the example
above.
<b>o</b> Template message headers must not span multiple
lines.
<b>o</b> Template message headers must not contain main.cf
$parameters.
<b>o</b> Template message headers must contain ASCII charac-
ters only.
<b>TEMPLATE MESSAGE TEXT FORMAT</b>
The second portion of a bounce template consists of mes-
sage text. As the above example shows, template message
text may contain main.cf $parameters. Besides the parame-
ters that are defined in main.cf, the following parameters
are treated specially depending on the suffix that is
appended to their name.
<b>delay_warning_time_</b><i>suffix</i>
Expands into the value of the <b><a href="postconf.5.html#delay_warning_time">delay_warning_time</a></b>
parameter, expressed in the time unit specified by
<i>suffix</i>, which is one of <b>seconds</b>, <b>minutes</b>, <b>hours,</b>
<b>days</b>, or <b>weeks</b>.
<b>maximal_queue_lifetime_</b><i>suffix</i>
Expands into the value of the <b><a href="postconf.5.html#maximal_queue_lifetime">maximal_queue_life</a>-</b>
<b><a href="postconf.5.html#maximal_queue_lifetime">time</a></b> parameter, expressed in the time unit speci-
fied by <i>suffix</i>. See above under <b><a href="postconf.5.html#delay_warning_time">delay_warning_time</a></b>
for possible <i>suffix</i> values.
The usage and specification of template message text is
subject to the following restrictions:
<b>o</b> The template message text is not sent in Postmaster
copies of delivery status notifications.
<b>o</b> If the template message text contains non-ASCII
characters, Postfix requires that the <b>Charset:</b> tem-
plate header is updated. Specify an appropriate
superset of US-ASCII. A superset is needed because
Postfix appends ASCII text after the message tem-
plate when it sends a delivery status notification.
<b>SEE ALSO</b>
<a href="bounce.8.html">bounce(8)</a>, Postfix delivery status notifications
<a href="postconf.5.html">postconf(5)</a>, configuration parameters
<b>LICENSE</b>
The Secure Mailer license must be distributed with this
software.
<b>HISTORY</b>
The Postfix bounce template format was originally devel-
oped by Nicolas Riendeau.
<b>AUTHOR(S)</b>
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA
BOUNCE(5)
</pre> </body> </html>

View File

@ -7,19 +7,18 @@
BOUNCE(8) BOUNCE(8)
<b>NAME</b>
bounce - Postfix message bounce or defer daemon
bounce - Postfix delivery status reports
<b>SYNOPSIS</b>
<b>bounce</b> [generic Postfix daemon options]
<b>DESCRIPTION</b>
The <a href="bounce.8.html"><b>bounce</b>(8)</a> daemon maintains per-message log files with
non-delivery status information. Each log file is named
after the queue file that it corresponds to, and is kept
in a queue subdirectory named after the service name in
the <b>master.cf</b> file (either <b>bounce</b>, <b>defer</b> or <b>trace</b>). This
program expects to be run from the <a href="master.8.html"><b>master</b>(8)</a> process man-
ager.
delivery status information. Each log file is named after
the queue file that it corresponds to, and is kept in a
queue subdirectory named after the service name in the
<b>master.cf</b> file (either <b>bounce</b>, <b>defer</b> or <b>trace</b>). This pro-
gram expects to be run from the <a href="master.8.html"><b>master</b>(8)</a> process manager.
The <a href="bounce.8.html"><b>bounce</b>(8)</a> daemon processes two types of service
requests:
@ -78,7 +77,7 @@ BOUNCE(8) BOUNCE(8)
The maximal amount of original message text that is
sent in a non-delivery notification.
<b>bounce_template_file (empty)</b>
<b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a> (empty)</b>
Pathname of a configuration file with bounce mes-
sage templates.
@ -152,6 +151,7 @@ BOUNCE(8) BOUNCE(8)
/var/spool/postfix/trace/* delivery status records
<b>SEE ALSO</b>
<a href="bounce.5.html">bounce(5)</a>, bounce message template format
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
<a href="postconf.5.html">postconf(5)</a>, configuration parameters
<a href="master.5.html">master(5)</a>, generic daemon options

View File

@ -14,14 +14,31 @@ POSTCONF(1) POSTCONF(1)
<b>postconf</b> [<b>-ev</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<i>parameter=value ...</i>]
<b>postconf</b> [<b>-btv</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<i>template</i><b>_</b><i>file</i>]
<b>DESCRIPTION</b>
The <a href="postconf.1.html"><b>postconf</b>(1)</a> command prints the actual value of <i>parame-</i>
<i>ter</i> (all known parameters by default) one parameter per
line, changes its value, or prints other information about
The <a href="postconf.1.html"><b>postconf</b>(1)</a> command displays the actual values of con-
figuration parameters, changes configuration parameter
values, or displays other configuration information about
the Postfix mail system.
Options:
<b>-b</b> [<i>template</i><b>_</b><i>file</i>]
Display the message text that appears at the begin-
ning of delivery status notification (DSN) mes-
sages, with $<b>name</b> expressions replaced by actual
values. To override the built-in message text,
specify a template file at the end of the command
line, or specify a template file in main.cf with
the <b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a></b> parameter. To force
selection of the built-in message text templates,
specify an empty template file name (in shell lan-
guage: "").
This feature is available with Postfix 2.3 and
later.
<b>-c</b> <i>config</i><b>_</b><i>dir</i>
The <b>main.cf</b> configuration file is in the named
directory instead of the default configuration
@ -151,15 +168,27 @@ POSTCONF(1) POSTCONF(1)
is a group file entry in <b>group</b>(5)
format.
Other table types may exist depending on how Postfix was
built.
Other table types may exist depending on how Post-
fix was built.
<b>-n</b> Print parameter settings that are not left at their
built-in default value, because they are explicitly
specified in main.cf.
<b>-t</b> [<i>template</i><b>_</b><i>file</i>]
Display the templates for delivery status notifica-
tion (DSN) messages. To override the built-in tem-
plates, specify a template file at the end of the
command line, or specify a template file in main.cf
with the <b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a></b> parameter. To force
selection of the built-in templates, specify an
empty template file name (in shell language: "").
This feature is available with Postfix 2.3 and
later.
<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>
@ -170,20 +199,25 @@ POSTCONF(1) POSTCONF(1)
Directory with Postfix configuration files.
<b>CONFIGURATION PARAMETERS</b>
The following <b>main.cf</b> parameters are especially relevant
The following <b>main.cf</b> parameters are especially relevant
to this program.
The text below provides only a parameter summary. See
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#config_directory">config_directory</a> (see 'postconf -d' output)</b>
The default location of the Postfix main.cf and
The default location of the Postfix main.cf and
master.cf configuration files.
<b><a href="postconf.5.html#bounce_template_file">bounce_template_file</a> (empty)</b>
Pathname of a configuration file with bounce mes-
sage templates.
<b>FILES</b>
/etc/postfix/main.cf, Postfix configuration parameters
<b>SEE ALSO</b>
<a href="bounce.5.html">bounce(5)</a>, bouce template file format
<a href="postconf.5.html">postconf(5)</a>, configuration parameters
<b>README FILES</b>

View File

@ -1108,7 +1108,15 @@ proportionally. </p>
(default: empty)</b></DT><DD>
<p> Pathname of a configuration file with bounce message templates.
</p>
These override the <a href="bounce.8.html">bounce(8)</a> server built-in templates of delivery
status notification (DSN) messages for undeliverable mail, for
delayed mail, for successful delivery, or for mail delivery
verification. </p>
<p> Template message body text may contain $name references to
Postfix configuration parameters. The result of $name expansion can
be previewed with "<b>postconf -b <i>file_name</i></b>" before the file
is placed into the Postfix configuration directory. </p>
<p> This feature is available in Postfix 2.3 and later. </p>

View File

@ -111,6 +111,8 @@ the following convention: </p>
<ul>
<li> <a href="bounce.5.html">bounce(5)</a>, Postfix bounce message templates
<li> <a href="master.5.html">master(5)</a>, Postfix master.cf file syntax
<li> <a href="postconf.5.html">postconf(5)</a>, Postfix main.cf file syntax

View File

@ -213,6 +213,7 @@ POSTFIX(1) POSTFIX(1)
<a href="sendmail.1.html">sendmail(1)</a>, Sendmail compatibility interface
Postfix configuration:
<a href="bounce.5.html">bounce(5)</a>, Postfix bounce message templates
<a href="master.5.html">master(5)</a>, Postfix master.cf file syntax
<a href="postconf.5.html">postconf(5)</a>, Postfix main.cf file syntax

View File

@ -17,7 +17,7 @@ CONFIG = man5/access.5 man5/aliases.5 man5/canonical.5 man5/relocated.5 \
man5/cidr_table.5 man5/tcp_table.5 man5/header_checks.5 \
man5/body_checks.5 man5/ldap_table.5 man5/mysql_table.5 \
man5/pgsql_table.5 man5/master.5 man5/nisplus_table.5 \
man5/generic.5
man5/generic.5 man5/bounce.5
TOOLS = man1/smtp-sink.1 man1/smtp-source.1 man1/qmqp-sink.1 \
man1/qmqp-source.1 man1/qshape.1
@ -235,6 +235,9 @@ man5/access.5: ../proto/access
man5/aliases.5: ../proto/aliases
../mantools/srctoman - $? >$@
man5/bounce.5: ../proto/bounce
../mantools/srctoman - $? >$@
man5/canonical.5: ../proto/canonical
../mantools/srctoman - $? >$@

View File

@ -14,15 +14,28 @@ Postfix configuration utility
\fBpostconf\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
[\fIparameter=value ...\fR]
\fBpostconf\fR [\fB-btv\fR] [\fB-c \fIconfig_dir\fR] [\fItemplate_file\fR]
.SH DESCRIPTION
.ad
.fi
The \fBpostconf\fR(1) command prints the actual value of
\fIparameter\fR (all known parameters by default) one
parameter per line, changes its value, or prints other
information about the Postfix mail system.
The \fBpostconf\fR(1) command displays the actual values
of configuration parameters, changes configuration parameter
values, or displays other configuration information about
the Postfix mail system.
Options:
.IP "\fB-b\fR [\fItemplate_file\fR]"
Display the message text that appears at the beginning of
delivery status notification (DSN) messages, with $\fBname\fR
expressions replaced by actual values. To override the
built-in message text, specify a template file at the end
of the command line, or specify a template file in main.cf
with the \fBbounce_template_file\fR parameter.
To force selection of the built-in message text templates,
specify an empty template file name (in shell language: "").
This feature is available with Postfix 2.3 and later.
.IP "\fB-c \fIconfig_dir\fR"
The \fBmain.cf\fR configuration file is in the named directory
instead of the default configuration directory.
@ -123,11 +136,21 @@ The table is the UNIX group database. The key is a group name.
The result is a group file entry in \fBgroup\fR(5) format.
.RE
.RE
.sp
.IP
Other table types may exist depending on how Postfix was built.
.IP \fB-n\fR
Print parameter settings that are not left at their built-in
default value, because they are explicitly specified in main.cf.
.IP "\fB-t\fR [\fItemplate_file\fR]"
Display the templates for delivery status notification (DSN)
messages. To override the built-in templates, specify a
template file at the end of the command line, or specify a
template file in main.cf with the \fBbounce_template_file\fR
parameter. To force selection of the built-in templates,
specify an empty template file name (in shell language:
"").
This feature is available with Postfix 2.3 and later.
.IP \fB-v\fR
Enable verbose logging for debugging purposes. Multiple \fB-v\fR
options make the software increasingly verbose.
@ -155,6 +178,8 @@ The text below provides only a parameter summary. See
.IP "\fBconfig_directory (see 'postconf -d' output)\fR"
The default location of the Postfix main.cf and master.cf
configuration files.
.IP "\fBbounce_template_file (empty)\fR"
Pathname of a configuration file with bounce message templates.
.SH "FILES"
.na
.nf
@ -162,6 +187,7 @@ configuration files.
.SH "SEE ALSO"
.na
.nf
bounce(5), bouce template file format
postconf(5), configuration parameters
.SH "README FILES"
.na

View File

@ -179,6 +179,7 @@ newaliases(1), Sendmail compatibility interface
sendmail(1), Sendmail compatibility interface
Postfix configuration:
bounce(5), Postfix bounce message templates
master(5), Postfix master.cf file syntax
postconf(5), Postfix main.cf file syntax

210
postfix/man/man5/bounce.5 Normal file
View File

@ -0,0 +1,210 @@
.TH BOUNCE 5
.ad
.fi
.SH NAME
bounce
\-
Postfix bounce message template format
.SH "SYNOPSIS"
.na
.nf
\fBbounce_template_file = /etc/postfix/bounce.cf\fR
\fBpostconf -b\fR [\fItemplate_file\fR]
.SH DESCRIPTION
.ad
.fi
The Postfix \fBbounce\fR(8) server produces delivery status
notification (DSN) messages for undeliverable mail, delayed
mail, successful delivery or address verification requests.
By default, these notifications are generated from built-in
templates with message headers and message text. Sites can
override the built-in information by specifying a bounce
template file with the \fBbounce_template_file\fR configuration
parameter.
This document describes the general procedure to create a
bounce template file, followed by the specific details of
bounce template formats.
.SH "GENERAL PROCEDURE"
.na
.nf
.ad
.fi
To create customized bounce template file, create a temporary
copy of the file \fB/etc/postfix/bounce.cf.default\fR and
edit the temporary file.
To preview the results of $\fIname\fR expansions in the
template text, use the command
.ti +4
\fBpostconf -b\fR \fItemporary_file\fR
Errors in the template will be reported to the standard
error stream and to the syslog daemon.
While previewing the text, be sure to pay particular attention
to the expansion of time value parameters that appear in
the delayed mail notification text.
Once the result is satisfactory, copy the template to the
Postfix configuration directory and specify in main.cf
something like:
/etc/postfix/main.cf:
.ti +4
bounce_template_file = /etc/postfix/bounce.cf
.SH "TEMPLATE FILE FORMAT"
.na
.nf
.ad
.fi
The template file can specify templates for failed mail,
delayed mail, successful delivery or for address verification.
These templates are named \fBfailure_template\fR,
\fBdelay_template\fR, \fBsuccess_template\fR and
\fBverify_template\fR, respectively. You can but do not
have to specify all four templates in a bounce template
file.
Each template starts with "\fItemplate_name\fB = <<EOF\fR"
and ends with a line that contains the word "\fBEOF\fR"
only. You can change the word EOF, but you can't enclose
it in quotes as with the shell or with Perl (\fItemplate_name\fB
= <<'EOF'\fR). Here is an example:
.in +2
.nf
.na
# 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_name program 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_name program
EOF
.in -2
.ad
.fi
No special meaning is given to the backslash character or
to leading whitespace; these are always taken literally.
Outside the << context, lines beginning with "#" are ignored,
as are empty lines, and lines consisting of whitespace only.
Examples of all templates can be found in the file
\fBbounce.cf.default\fR in the Postfix configuration
directory.
.SH "TEMPLATE HEADER FORMAT"
.na
.nf
.ad
.fi
The first portion of a bounce template consists of optional
template headers. These either become message headers in
the delivery status notification, or control the formatting
of the notification. Headers not specified in a template
will be left at their default value.
The following headers are supported:
.IP \fBCharset:\fR
The MIME character set of the template message text. See
the "TEMPLATE MESSAGE TEXT FORMAT" description below.
.IP \fBFrom:\fR
The sender address that the recipient will see.
.IP \fBSubject:\fR
The subject that the recipient will see.
.IP \fBPostmaster-Subject:\fR
The subject that will be used in Postmaster copies of
undeliverable or delayed mail notifications. These copies
are sent under control of the notify_classes configuration
parameter.
.PP
The usage and specification of template message headers is
subject to the following restrictions:
.IP \(bu
Template message header names can be specified in upper
case, lower case or mixed case. Postfix always uses the
spelling as shown in the example above.
.IP \(bu
Template message headers must not span multiple lines.
.IP \(bu
Template message headers must not contain main.cf $parameters.
.IP \(bu
Template message headers must contain ASCII characters only.
.SH "TEMPLATE MESSAGE TEXT FORMAT"
.na
.nf
.ad
.fi
The second portion of a bounce template consists of message
text. As the above example shows, template message text may
contain main.cf $parameters. Besides the parameters that are
defined in main.cf, the following parameters are treated
specially depending on the suffix that is appended to their
name.
.IP \fBdelay_warning_time_\fIsuffix\fR
Expands into the value of the \fBdelay_warning_time\fR
parameter, expressed in the time unit specified by
\fIsuffix\fR, which is one of \fBseconds\fR, \fBminutes\fR,
\fBhours\fB, \fBdays\fR, or \fBweeks\fR.
.IP \fBmaximal_queue_lifetime_\fIsuffix\fR
Expands into the value of the \fBmaximal_queue_lifetime\fR
parameter, expressed in the time unit specified by
\fIsuffix\fR. See above under \fBdelay_warning_time\fR for
possible \fIsuffix\fR values.
.PP
The usage and specification of template message text is
subject to the following restrictions:
.IP \(bu
The template message text is not sent in Postmaster copies
of delivery status notifications.
.IP \(bu
If the template message text contains non-ASCII characters,
Postfix requires that the \fBCharset:\fR template header
is updated. Specify an appropriate superset of US-ASCII.
A superset is needed because Postfix appends ASCII text
after the message template when it sends a delivery status
notification.
.SH "SEE ALSO"
.na
.nf
bounce(8), Postfix delivery status notifications
postconf(5), configuration parameters
.SH "LICENSE"
.na
.nf
.ad
.fi
The Secure Mailer license must be distributed with this software.
.SH "HISTORY"
.na
.nf
.ad
.fi
The Postfix bounce template format was originally developed by
Nicolas Riendeau.
.SH "AUTHOR(S)"
.na
.nf
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA

View File

@ -601,6 +601,15 @@ this limit, then you should increase the mime_nesting_limit value
proportionally.
.SH bounce_template_file (default: empty)
Pathname of a configuration file with bounce message templates.
These override the \fBbounce\fR(8) server built-in templates of delivery
status notification (DSN) messages for undeliverable mail, for
delayed mail, for successful delivery, or for mail delivery
verification.
.PP
Template message body text may contain $name references to
Postfix configuration parameters. The result of $name expansion can
be previewed with "\fBpostconf -b \fIfile_name\fR\fR" before the file
is placed into the Postfix configuration directory.
.PP
This feature is available in Postfix 2.3 and later.
.SH broken_sasl_auth_clients (default: no)

View File

@ -4,7 +4,7 @@
.SH NAME
bounce
\-
Postfix message bounce or defer daemon
Postfix delivery status reports
.SH "SYNOPSIS"
.na
.nf
@ -13,7 +13,7 @@ Postfix message bounce or defer daemon
.ad
.fi
The \fBbounce\fR(8) daemon maintains per-message log files with
non-delivery status information. Each log file is named after the
delivery status information. Each log file is named after the
queue file that it corresponds to, and is kept in a queue subdirectory
named after the service name in the \fBmaster.cf\fR file (either
\fBbounce\fR, \fBdefer\fR or \fBtrace\fR).
@ -125,6 +125,7 @@ records, so that "smtpd" becomes, for example, "postfix/smtpd".
.SH "SEE ALSO"
.na
.nf
bounce(5), bounce message template format
qmgr(8), queue manager
postconf(5), configuration parameters
master(5), generic daemon options

View File

@ -106,6 +106,7 @@ while (<>) {
s;\bbounce_queue_lifetime\b;<a href="postconf.5.html#bounce_queue_lifetime">$&</a>;g;
s;\bbounce_service_name\b;<a href="postconf.5.html#bounce_service_name">$&</a>;g;
s;\bbounce_size_limit\b;<a href="postconf.5.html#bounce_size_limit">$&</a>;g;
s;\bbounce_template_file\b;<a href="postconf.5.html#bounce_template_file">$&</a>;g;
s;\bbroken_sasl_auth_clients\b;<a href="postconf.5.html#broken_sasl_auth_clients">$&</a>;g;
s;\bcanonical_classes\b;<a href="postconf.5.html#canonical_classes">$&</a>;g;
s;\bcanonical_maps\b;<a href="postconf.5.html#canonical_maps">$&</a>;g;
@ -141,7 +142,7 @@ while (<>) {
s;\bdefer_transports\b;<a href="postconf.5.html#defer_transports">$&</a>;g;
s;\bdelay_logging_resolution_limit\b;<a href="postconf.5.html#delay_logging_resolution_limit">$&</a>;g;
s;\bdelay_notice_recip[-</bB>]*\n* *[<bB>]*ient\b;<a href="postconf.5.html#delay_notice_recipient">$&</a>;g;
s;\bdelay_warning_time\b;<a href="postconf.5.html#delay_warning_time">$&</a>;g;
s;\bdelay_warn[-</bB>]*\n*[ <bB>]*ing_time\b;<a href="postconf.5.html#delay_warning_time">$&</a>;g;
s;\bdeliver_lock_attempts\b;<a href="postconf.5.html#deliver_lock_attempts">$&</a>;g;
s;\bdeliver_lock_delay\b;<a href="postconf.5.html#deliver_lock_delay">$&</a>;g;
s;\bdisable_dns_lookups\b;<a href="postconf.5.html#disable_dns_lookups">$&</a>;g;
@ -234,7 +235,7 @@ while (<>) {
s;\bmax_idle\b;<a href="postconf.5.html#max_idle">$&</a>;g;
s;\bmax_use\b;<a href="postconf.5.html#max_use">$&</a>;g;
s;\bmaxi[-</bB>]*\n*[ <bB>]*mal_backoff_time\b;<a href="postconf.5.html#maximal_backoff_time">$&</a>;g;
s;\bmaxi[-</bB>]*\n*[ <bB>]*mal_queue_lifetime\b;<a href="postconf.5.html#maximal_queue_lifetime">$&</a>;g;
s;\bmaxi[-</bB>]*\n*[ <bB>]*mal_queue_life[-</bB>]*\n*[ <bB>]*time\b;<a href="postconf.5.html#maximal_queue_lifetime">$&</a>;g;
s;\bmessage_reject_characters\b;<a href="postconf.5.html#message_reject_characters">$&</a>;g;
s;\bmessage_size_limit\b;<a href="postconf.5.html#message_size_limit">$&</a>;g;
s;\bmessage_strip_characters\b;<a href="postconf.5.html#message_strip_characters">$&</a>;g;
@ -544,7 +545,7 @@ while (<>) {
s/[<bB>]*newaliases[<\/bB>]*\(1\)/<a href="newaliases.1.html">$&<\/a>/g;
s/[<bB>]*postalias[<\/bB>]*\(1\)/<a href="postalias.1.html">$&<\/a>/g;
s/[<bB>]*postcat[<\/bB>]*\(1\)/<a href="postcat.1.html">$&<\/a>/g;
s/[<bB>]*postconf[<\/bB>]*\(1\)/<a href="postconf.1.html">$&<\/a>/g;
s/[<bB>]*post[-<\/bB>]*\n*[ <bB>]*conf[<\/bB>]*\(1\)/<a href="postconf.1.html">$&<\/a>/g;
s/[<bB>]*postdrop[<\/bB>]*\(1\)/<a href="postdrop.1.html">$&<\/a>/g;
s/[<bB>]*postfix[<\/bB>]*\(1\)/<a href="postfix.1.html">$&<\/a>/g;
s/[<bB>]*postkick[<\/bB>]*\(1\)/<a href="postkick.1.html">$&<\/a>/g;
@ -561,6 +562,7 @@ while (<>) {
s/[<bB>]*qshape[<\/bB>]*\(1\)/<a href="qshape.1.html">$&<\/a>/g;
s/[<bB>]*access[<\/bB>]*\(5\)/<a href="access.5.html">$&<\/a>/g;
s/[<bB>]*aliases[<\/bB>]*\(5\)/<a href="aliases.5.html">$&<\/a>/g;
s/[<bB>]*bounce[<\/bB>]*\(5\)/<a href="bounce.5.html">$&<\/a>/g;
s/[<bB>]*canonical[<\/bB>]*\(5\)/<a href="canonical.5.html">$&<\/a>/g;
s/[<bB>]*gener[-<\/bB>]*\n* *[<bB>]*ic[<\/bB>]*\(5\)/<a href="generic.5.html">$&<\/a>/g;
s/[<bB>]*ldap[<\/bBiI>]*_[<\/iIbB>]*ta[-<\/bB>]*\n*[ <bB>]*ble[<\/bB>]*\(5\)/<a href="ldap_table.5.html">$&<\/a>/g;

189
postfix/proto/bounce Normal file
View File

@ -0,0 +1,189 @@
#++
# NAME
# bounce 5
# SUMMARY
# Postfix bounce message template format
# SYNOPSIS
# \fBbounce_template_file = /etc/postfix/bounce.cf\fR
#
# \fBpostconf -b\fR [\fItemplate_file\fR]
# DESCRIPTION
# The Postfix \fBbounce\fR(8) server produces delivery status
# notification (DSN) messages for undeliverable mail, delayed
# mail, successful delivery or address verification requests.
#
# By default, these notifications are generated from built-in
# templates with message headers and message text. Sites can
# override the built-in information by specifying a bounce
# template file with the \fBbounce_template_file\fR configuration
# parameter.
#
# This document describes the general procedure to create a
# bounce template file, followed by the specific details of
# bounce template formats.
# GENERAL PROCEDURE
# .ad
# .fi
# To create customized bounce template file, create a temporary
# copy of the file \fB/etc/postfix/bounce.cf.default\fR and
# edit the temporary file.
#
# To preview the results of $\fIname\fR expansions in the
# template text, use the command
#
# .ti +4
# \fBpostconf -b\fR \fItemporary_file\fR
#
# Errors in the template will be reported to the standard
# error stream and to the syslog daemon.
#
# While previewing the text, be sure to pay particular attention
# to the expansion of time value parameters that appear in
# the delayed mail notification text.
#
# Once the result is satisfactory, copy the template to the
# Postfix configuration directory and specify in main.cf
# something like:
#
# /etc/postfix/main.cf:
# .ti +4
# bounce_template_file = /etc/postfix/bounce.cf
# TEMPLATE FILE FORMAT
# .ad
# .fi
# The template file can specify templates for failed mail,
# delayed mail, successful delivery or for address verification.
# These templates are named \fBfailure_template\fR,
# \fBdelay_template\fR, \fBsuccess_template\fR and
# \fBverify_template\fR, respectively. You can but do not
# have to specify all four templates in a bounce template
# file.
#
# Each template starts with "\fItemplate_name\fB = <<EOF\fR"
# and ends with a line that contains the word "\fBEOF\fR"
# only. You can change the word EOF, but you can't enclose
# it in quotes as with the shell or with Perl (\fItemplate_name\fB
# = <<'EOF'\fR). Here is an example:
#
# .in +2
# .nf
# .na
# # 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_name program 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_name program
# EOF
# .in -2
# .ad
# .fi
#
# No special meaning is given to the backslash character or
# to leading whitespace; these are always taken literally.
#
# Outside the << context, lines beginning with "#" are ignored,
# as are empty lines, and lines consisting of whitespace only.
#
# Examples of all templates can be found in the file
# \fBbounce.cf.default\fR in the Postfix configuration
# directory.
# TEMPLATE HEADER FORMAT
# .ad
# .fi
# The first portion of a bounce template consists of optional
# template headers. These either become message headers in
# the delivery status notification, or control the formatting
# of the notification. Headers not specified in a template
# will be left at their default value.
#
# The following headers are supported:
# .IP \fBCharset:\fR
# The MIME character set of the template message text. See
# the "TEMPLATE MESSAGE TEXT FORMAT" description below.
# .IP \fBFrom:\fR
# The sender address that the recipient will see.
# .IP \fBSubject:\fR
# The subject that the recipient will see.
# .IP \fBPostmaster-Subject:\fR
# The subject that will be used in Postmaster copies of
# undeliverable or delayed mail notifications. These copies
# are sent under control of the notify_classes configuration
# parameter.
# .PP
# The usage and specification of template message headers is
# subject to the following restrictions:
# .IP \(bu
# Template message header names can be specified in upper
# case, lower case or mixed case. Postfix always uses the
# spelling as shown in the example above.
# .IP \(bu
# Template message headers must not span multiple lines.
# .IP \(bu
# Template message headers must not contain main.cf $parameters.
# .IP \(bu
# Template message headers must contain ASCII characters only.
# TEMPLATE MESSAGE TEXT FORMAT
# .ad
# .fi
# The second portion of a bounce template consists of message
# text. As the above example shows, template message text may
# contain main.cf $parameters. Besides the parameters that are
# defined in main.cf, the following parameters are treated
# specially depending on the suffix that is appended to their
# name.
# .IP \fBdelay_warning_time_\fIsuffix\fR
# Expands into the value of the \fBdelay_warning_time\fR
# parameter, expressed in the time unit specified by
# \fIsuffix\fR, which is one of \fBseconds\fR, \fBminutes\fR,
# \fBhours\fB, \fBdays\fR, or \fBweeks\fR.
# .IP \fBmaximal_queue_lifetime_\fIsuffix\fR
# Expands into the value of the \fBmaximal_queue_lifetime\fR
# parameter, expressed in the time unit specified by
# \fIsuffix\fR. See above under \fBdelay_warning_time\fR for
# possible \fIsuffix\fR values.
# .PP
# The usage and specification of template message text is
# subject to the following restrictions:
# .IP \(bu
# The template message text is not sent in Postmaster copies
# of delivery status notifications.
# .IP \(bu
# If the template message text contains non-ASCII characters,
# Postfix requires that the \fBCharset:\fR template header
# is updated. Specify an appropriate superset of US-ASCII.
# A superset is needed because Postfix appends ASCII text
# after the message template when it sends a delivery status
# notification.
# SEE ALSO
# bounce(8), Postfix delivery status notifications
# postconf(5), configuration parameters
# LICENSE
# .ad
# .fi
# The Secure Mailer license must be distributed with this software.
# HISTORY
# .ad
# .fi
# The Postfix bounce template format was originally developed by
# Nicolas Riendeau.
# AUTHOR(S)
# Wietse Venema
# IBM T.J. Watson Research
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#--

View File

@ -8679,7 +8679,15 @@ precision. </p>
%PARAM bounce_template_file empty
<p> Pathname of a configuration file with bounce message templates.
</p>
These override the bounce(8) server built-in templates of delivery
status notification (DSN) messages for undeliverable mail, for
delayed mail, for successful delivery, or for mail delivery
verification. </p>
<p> Template message body text may contain $name references to
Postfix configuration parameters. The result of $name expansion can
be previewed with "<b>postconf -b <i>file_name</i></b>" before the file
is placed into the Postfix configuration directory. </p>
<p> This feature is available in Postfix 2.3 and later. </p>

View File

@ -22,9 +22,12 @@ LIBS = ../../lib/libmaster.a ../../lib/libglobal.a ../../lib/libutil.a
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
../../conf/bounce.cf.default: $(PROG) fix-template.pl
# Avoid dependency on installed Postfix.
../../conf/bounce.cf.default: $(PROG) annotate.pl
rm -f $@
./$(PROG) -Szn default | perl fix-template.pl >$@
echo queue_directory=. >main.cf
MAIL_CONFIG=. ./$(PROG) -SVzndump_templates | perl annotate.pl >$@
rm -f main.cf
$(OBJS): ../../conf/makedefs.out
@ -52,15 +55,18 @@ lint:
lint $(DEFS) $(SRCS) $(LINTFIX)
clean:
rm -f *.o *core $(PROG) $(TESTPROG) junk
rm -f *.o *core $(PROG) $(TESTPROG) junk main.cf
rm -rf printfck
tidy: clean
template_test:
./bounce -Szn default >junk
./bounce -Szn actual -o bounce_template_file=`pwd`/junk | diff junk -
rm -f junk
# Avoid dependency on installed Postfix.
template_test: $(PROG)
echo queue_directory=. >main.cf
MAIL_CONFIG=. ./$(PROG) -SVzndump_templates >junk
MAIL_CONFIG=. ./$(PROG) -SVzndump_templates \
-o bounce_template_file=junk | diff junk -
rm -f junk main.cf
depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \

View File

@ -4,51 +4,69 @@ print <<'EOF'
# notification (DSN) messages that are built into Postfix.
#
# To change Postfix DSN messages, perhaps to add non-English text,
# follow instructions in the BOUNCE_README document.
# follow instructions in the bounce(5) manual page.
#
EOF
# QUICK INSTRUCTIONS:
#
# Copy this file to $config_directory/bounce.cf, edit that file,
# then specify in main.cf:
#
# bounce_template_file = $config_directory/bounce.cf
#-Edit a temporary copy of this file, and preview the result of $name
# expansions with "postconf -b temporary_file". If there are any
# problems, Postfix will log "warning" or "fatal" messages to the
# maillog file.
#
#-The template file can specify bounce message templates for
# failed mail, delayed mail, successful delivery, and verbose delivery.
# You don't have to specify templates for all of these. If there is
# anything about a template that Postfix does not like it logs a
# warning and keeps using its built-in template.
#
#-Each template consists of a few headers and message text. The
# headers control what the recipient sees as From: and Subject:, and
# what MIME information Postfix will generate. The message text is
# not sent in Postmaster copies of delivery status notifications.
#
#-You can specify main.cf parameters in a template message text.
# Some parameters have additional features as described below.
#
#-You cannot specify main.cf parameters in template headers.
# failed mail, for delayed mail, for successful delivery, or for
# verbose delivery. You don't have to specify all templates.
#
#-Each template starts with "template_name = <<EOF" and ends
# with a line that contains the word "EOF" only. You can change the
# word EOF if you like, but you can't do shell/perl/etc like things
# such as enclosing it in quotes (template_name = <<'EOF').
#
# IMPORTANT:
#-Each template consists of a few headers and message text. The
# headers control what the recipient sees as From: and Subject:, and
# what MIME information Postfix will generate.
#
# If you add non-ASCII text then you MUST change the CHARSET: value,
#-Template message headers must not span multiple lines.
#
#-Template message headers must not contain main.cf $parameters.
#
#-Template message headers must contain ASCII characters only.
#
#-The template message text is not sent in Postmaster copies of
# delivery status notifications.
#
#-Template message text may contain main.cf $parameters. Some
# parameters have additional features as described below with the
# delayed mail message template.
#
#-Template message text may contain non-ASCII text. In that case you
# MUST change the character set value in the CHARSET: template header,
# otherwise Postfix will not use your template. You must specify a
# character set that is a superset of US-ASCII, because Postfix
# appends ASCII text after the message template.
# appends ASCII text after the message template when it sends a
# delivery status notification.
#
EOF
#-When previewing the result with "postconf -b temporary_file", be
# sure to pay particular attention to the time values that appear
# in the delayed mail notification text.
#
#-Once you're satisfied with the result, and once Postfix stops
# logging warning messages, copy the template to the Postfix
# configuration directory and specify in main.cf something like:
#
# /etc/postfix/main.cf:
# bounce_template_file = $config_directory/bounce.cf
#
#EOF
;
while (<>) {
if (/^fail_template/) { print <<'EOF'
if (/^failure_template/) { print <<'EOF'
#
# The fail template is used when mail is returned to the sender;
# The failure template is used when mail is returned to the sender;
# either the destination rejected the message, or the destination
# could not be reached before the message expired in the queue.
#

View File

@ -2,12 +2,12 @@
/* NAME
/* bounce 8
/* SUMMARY
/* Postfix message bounce or defer daemon
/* Postfix delivery status reports
/* SYNOPSIS
/* \fBbounce\fR [generic Postfix daemon options]
/* DESCRIPTION
/* The \fBbounce\fR(8) daemon maintains per-message log files with
/* non-delivery status information. Each log file is named after the
/* delivery status information. Each log file is named after the
/* queue file that it corresponds to, and is kept in a queue subdirectory
/* named after the service name in the \fBmaster.cf\fR file (either
/* \fBbounce\fR, \fBdefer\fR or \fBtrace\fR).
@ -109,6 +109,7 @@
/* /var/spool/postfix/defer/* non-delivery records
/* /var/spool/postfix/trace/* delivery status records
/* SEE ALSO
/* bounce(5), bounce message template format
/* qmgr(8), queue manager
/* postconf(5), configuration parameters
/* master(5), generic daemon options
@ -129,6 +130,7 @@
#include <sys_defs.h>
#include <string.h>
#include <stdlib.h>
#ifdef STRCASECMP_IN_STRINGS_H
#include <strings.h>
@ -444,16 +446,6 @@ static void bounce_service(VSTREAM *client, char *service_name, char **argv)
if (mail_queue_name_ok(service_name) == 0)
msg_fatal("malformed service name: %s", service_name);
/*
* Special case: dump the built-in templates. This is not part of the
* public interface.
*/
if (strcmp(service_name, "default") == 0) {
bounce_template_dump_default(VSTREAM_OUT);
vstream_fflush(VSTREAM_OUT);
exit(0);
}
/*
* Read and validate the first parameter of the client request. Let the
* request-specific protocol routines take care of the remainder.
@ -516,11 +508,16 @@ static void pre_jail_init(char *service_name, char **unused_argv)
bounce_template_load(var_bounce_tmpl);
/*
* Special case: dump the actual templates. This is not part of the
* public interface.
* Special case: dump bounce templates. This is not part of the
* master(5) public interface.
*/
if (strcmp(service_name, "actual") == 0) {
bounce_template_dump_actual(VSTREAM_OUT);
if (strcmp(service_name, "dump_templates") == 0) {
bounce_template_dump_all(VSTREAM_OUT);
vstream_fflush(VSTREAM_OUT);
exit(0);
}
if (strcmp(service_name, "expand_templates") == 0) {
bounce_template_expand_all(VSTREAM_OUT);
vstream_fflush(VSTREAM_OUT);
exit(0);
}

View File

@ -208,7 +208,7 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
const char *queue_id,
const char *encoding,
const char *dsn_envid,
const BOUNCE_TEMPLATE *template,
const BOUNCE_TEMPLATE *template,
BOUNCE_LOG *log_handle)
{
BOUNCE_INFO *bounce_info;
@ -390,6 +390,7 @@ void bounce_mail_free(BOUNCE_INFO *bounce_info)
int bounce_header(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
const char *dest)
{
const BOUNCE_TEMPLATE *template = bounce_info->template;
int postmaster_copy;
/*
@ -402,22 +403,22 @@ int bounce_header(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
* XXX This should be caller specified.
*/
postmaster_copy =
(bounce_info->template->postmaster_subject != 0
(template->postmaster_subject != 0
&& (dest == var_bounce_rcpt || dest == var_2bounce_rcpt
|| dest == var_delay_rcpt));
/*
* Generic headers.
*/
post_mail_fprintf(bounce, "From: %s", bounce_info->template->from);
post_mail_fprintf(bounce, "From: %s", template->from);
post_mail_fprintf(bounce, "Subject: %s", postmaster_copy ?
bounce_info->template->postmaster_subject :
bounce_info->template->subject);
template->postmaster_subject : template->subject);
post_mail_fprintf(bounce, "To: %s",
STR(quote_822_local(bounce_info->buf, dest)));
/*
* MIME header.
* MIME header. Use 8bit encoding when either the bounced message or the
* template requires it.
*/
post_mail_fprintf(bounce, "MIME-Version: 1.0");
post_mail_fprintf(bounce, "Content-Type: %s; report-type=%s;",
@ -425,7 +426,8 @@ int bounce_header(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
post_mail_fprintf(bounce, "\tboundary=\"%s\"", bounce_info->mime_boundary);
if (bounce_info->mime_encoding)
post_mail_fprintf(bounce, "Content-Transfer-Encoding: %s",
bounce_info->mime_encoding);
STREQ(bounce_info->mime_encoding, MAIL_ATTR_ENC_7BIT) ?
template->mime_encoding : bounce_info->mime_encoding);
post_mail_fputs(bounce, "");
post_mail_fputs(bounce, "This is a MIME-encapsulated message.");
@ -436,7 +438,7 @@ int bounce_header(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
post_mail_fprintf(bounce, "--%s", bounce_info->mime_boundary);
post_mail_fprintf(bounce, "Content-Description: %s", "Notification");
post_mail_fprintf(bounce, "Content-Type: %s; charset=%s",
"text/plain", bounce_info->template->charset);
"text/plain", template->charset);
post_mail_fputs(bounce, "");
return (vstream_ferror(bounce));
@ -450,7 +452,7 @@ int bounce_boilerplate(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
/*
* Print the boiler-plate text.
*/
bounce_template_expand(bounce, bounce_info->template);
bounce_template_expand(post_mail_fputs, bounce, bounce_info->template);
return (vstream_ferror(bounce));
}
@ -523,7 +525,7 @@ int bounce_diagnostic_log(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
*/
if (bounce_info->log_handle == 0
|| bounce_log_rewind(bounce_info->log_handle)) {
if (bounce_info->template == FAIL_TEMPLATE()) {
if (IS_FAIL_TEMPLATE(bounce_info->template)) {
post_mail_fputs(bounce, "\t--- Delivery report unavailable ---");
count = 1; /* XXX don't abort */
}
@ -615,7 +617,7 @@ int bounce_recipient_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
bounce_info->log_handle->rcpt.orig_addr);
}
post_mail_fprintf(bounce, "Action: %s",
bounce_info->template == FAIL_TEMPLATE() ?
IS_FAIL_TEMPLATE(bounce_info->template) ?
"failed" : bounce_info->log_handle->dsn.action);
post_mail_fprintf(bounce, "Status: %s",
bounce_info->log_handle->dsn.status);
@ -637,7 +639,7 @@ int bounce_recipient_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
post_mail_fprintf(bounce, "Last-Attempt-Date: %s",
bounce_info->log_handle->log_time);
#endif
if (bounce_info->template == DELAY_TEMPLATE())
if (IS_DELAY_TEMPLATE(bounce_info->template))
post_mail_fprintf(bounce, "Will-Retry-Until: %s",
mail_date(bounce_info->arrival_time + var_max_queue_time));
return (vstream_ferror(bounce));
@ -661,7 +663,7 @@ int bounce_diagnostic_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
*/
if (bounce_info->log_handle == 0
|| bounce_log_rewind(bounce_info->log_handle)) {
if (bounce_info->template == FAIL_TEMPLATE())
if (IS_FAIL_TEMPLATE(bounce_info->template))
count = 1; /* XXX don't abort */
} else {
while (bounce_log_read(bounce_info->log_handle) != 0) {
@ -697,13 +699,13 @@ int bounce_original(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
/*
* MIME headers.
*/
#define UNDELIVERED(template) \
((template) == FAIL_TEMPLATE() || (template) == DELAY_TEMPLATE())
#define IS_UNDELIVERED_TEMPLATE(template) \
(IS_FAIL_TEMPLATE(template) || IS_DELAY_TEMPLATE(template))
post_mail_fputs(bounce, "");
post_mail_fprintf(bounce, "--%s", bounce_info->mime_boundary);
post_mail_fprintf(bounce, "Content-Description: %s%s",
UNDELIVERED(bounce_info->template) ?
IS_UNDELIVERED_TEMPLATE(bounce_info->template) ?
"Undelivered " : "",
headers_only == DSN_RET_HDRS ?
"Message Headers" : "Message");

View File

@ -62,26 +62,32 @@ extern void bounce_cleanup_unregister(void);
* bounce_template.c
*/
typedef struct {
const char *class; /* template type */
const char *charset; /* character set */
const char *encoding; /* 7bit or 8bit */
const char *from; /* originator */
const char *subject; /* general subject line */
const char *postmaster_subject; /* postmaster subject line */
const char **message_text; /* message text */
const char *class; /* for diagnostics (fixed) */
const char *charset; /* character set (configurable) */
const char *mime_encoding; /* 7bit or 8bit (derived) */
const char *from; /* originator (configurable) */
const char *subject; /* general subject (configurable) */
const char *postmaster_subject; /* postmaster subject (configurable) */
const char **message_text; /* message text (configurable) */
} BOUNCE_TEMPLATE;
typedef int (*BOUNCE_OUT_FN)(VSTREAM *, const char *);
extern void bounce_template_load(const char *);
extern void bounce_template_expand(VSTREAM *, const BOUNCE_TEMPLATE *);
extern void bounce_template_expand(BOUNCE_OUT_FN, VSTREAM *, const BOUNCE_TEMPLATE *);
extern const BOUNCE_TEMPLATE *bounce_template_find(const char *, const BOUNCE_TEMPLATE *);
extern void bounce_template_dump_default(VSTREAM *);
extern void bounce_template_dump_actual(VSTREAM *);
extern void bounce_template_dump_all(VSTREAM *);
extern void bounce_template_expand_all(VSTREAM *);
#define BOUNCE_TMPL_CLASS_FAIL "failure"
#define BOUNCE_TMPL_CLASS_DELAY "delay"
#define BOUNCE_TMPL_CLASS_SUCCESS "success"
#define BOUNCE_TMPL_CLASS_VERIFY "verify"
#define BOUNCE_TEMPLATE_DICT "bounce_templates"
#define BOUNCE_TMPL_DICT_FAIL "fail_template"
#define BOUNCE_TMPL_DICT_DELAY "delay_template"
#define BOUNCE_TMPL_DICT_SUCCESS "success_template"
#define BOUNCE_TMPL_DICT_VERIFY "verify_template"
#define BOUNCE_TMPL_DICT_FAIL (BOUNCE_TMPL_CLASS_FAIL "_template")
#define BOUNCE_TMPL_DICT_DELAY (BOUNCE_TMPL_CLASS_DELAY "_template")
#define BOUNCE_TMPL_DICT_SUCCESS (BOUNCE_TMPL_CLASS_SUCCESS "_template")
#define BOUNCE_TMPL_DICT_VERIFY (BOUNCE_TMPL_CLASS_VERIFY "_template")
#define FAIL_TEMPLATE() \
(bounce_fail_template ? bounce_fail_template : \
@ -107,6 +113,15 @@ extern void bounce_template_dump_actual(VSTREAM *);
bounce_template_find(BOUNCE_TMPL_DICT_VERIFY, \
&def_bounce_verify_template)))
#define IS_FAIL_TEMPLATE(t) ((t) == bounce_fail_template)
#define IS_DELAY_TEMPLATE(t) ((t) == bounce_delay_template)
#define IS_SUCCESS_TEMPLATE(t) ((t) == bounce_success_template)
#define IS_VERIFY_TEMPLATE(t) ((t) == bounce_verify_template)
/*
* The following are not part of the bounce_template() interface. Use the
* above macros instead.
*/
extern const BOUNCE_TEMPLATE *bounce_fail_template;
extern const BOUNCE_TEMPLATE *bounce_delay_template;
extern const BOUNCE_TEMPLATE *bounce_success_template;

View File

@ -21,10 +21,10 @@
/* VSTREAM *stream;
/* BOUNCE_TEMPLATE *template;
/* AUXILIARY FUNCTIONS
/* void bounce_template_dump_default(stream)
/* void bounce_template_dump_all(stream)
/* VSTREAM *stream;
/*
/* void bounce_template_dump_actual(stream)
/* void bounce_template_expand_all(stream)
/* VSTREAM *stream;
/* DESCRIPTION
/* This module implements the built-in and external bounce
@ -49,6 +49,10 @@
/* to the specified stream. This can be used to verify that
/* the bounce server correctly reads its own bounce_template_dump_default()
/* output.
/*
/* bounce_template_expand_actual() expands the template message
/* text and dumps the result to the specified stream. This can
/* be used to verify that templates produce the desired text.
/* DIAGNOSTICS
/* Fatal error: error opening template file, out of memory,
/* undefined macro name in template.
@ -102,7 +106,7 @@
static const char *def_bounce_fail_body[];
const BOUNCE_TEMPLATE def_bounce_fail_template = {
"fail",
BOUNCE_TMPL_CLASS_FAIL,
"us-ascii",
MAIL_ATTR_ENC_7BIT,
MAIL_ADDR_MAIL_DAEMON " (Mail Delivery System)",
@ -132,7 +136,7 @@ static const char *def_bounce_fail_body[] = {
static const char *def_bounce_delay_body[];
const BOUNCE_TEMPLATE def_bounce_delay_template = {
"delay",
BOUNCE_TMPL_CLASS_DELAY,
"us-ascii",
MAIL_ATTR_ENC_7BIT,
MAIL_ADDR_MAIL_DAEMON " (Mail Delivery System)",
@ -167,7 +171,7 @@ static const char *def_bounce_delay_body[] = {
static const char *def_bounce_success_body[];
const BOUNCE_TEMPLATE def_bounce_success_template = {
"success",
BOUNCE_TMPL_CLASS_SUCCESS,
"us-ascii",
MAIL_ATTR_ENC_7BIT,
MAIL_ADDR_MAIL_DAEMON " (Mail Delivery System)",
@ -195,7 +199,7 @@ static const char *def_bounce_success_body[] = {
static const char *def_bounce_verify_body[];
const BOUNCE_TEMPLATE def_bounce_verify_template = {
"verify",
BOUNCE_TMPL_CLASS_VERIFY,
"us-ascii",
MAIL_ATTR_ENC_7BIT,
MAIL_ADDR_MAIL_DAEMON " (Mail Delivery System)",
@ -318,17 +322,21 @@ static const char *bounce_template_lookup(const char *key, int unused_mode,
if (strcmp(key + bp->param_name_len + 1, bd->suffix) == 0) {
result = bp->value[0] / bd->divisor;
if (result > 999 && bd->divisor < 86400) {
msg_warn("excessive result \"%d\" in %s bounce "
msg_warn("%s: excessive result \"%d\" in %s "
"template conversion of parameter \"%s\"",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
result, template->class, key);
msg_warn("please increase time unit \"%s\" of \"%s\" "
"in bounce template file", bd->suffix, key);
} else if (result == 0 && bd->divisor > 1) {
msg_warn("zero result in %s bounce template "
"in %s template", bd->suffix, key,
template->class);
} else if (result == 0 && bp->value[0] && bd->divisor > 1) {
msg_warn("%s: zero result in %s template "
"conversion of parameter \"%s\"",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
template->class, key);
msg_warn("please reduce time unit \"%s\" of \"%s\" "
"in bounce template file", bd->suffix, key);
"in %s template", bd->suffix, key,
template->class);
}
if (buf == 0)
buf = vstring_alloc(10);
@ -336,7 +344,8 @@ static const char *bounce_template_lookup(const char *key, int unused_mode,
return (STR(buf));
}
}
msg_fatal("unrecognized suffix \"%s\" in template parameter \"%s\"",
msg_fatal("%s: unrecognized suffix \"%s\" in parameter \"%s\"",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
key + bp->param_name_len + 1, key);
}
}
@ -345,7 +354,8 @@ static const char *bounce_template_lookup(const char *key, int unused_mode,
/* bounce_template_expand - expand template body */
void bounce_template_expand(VSTREAM *stream, const BOUNCE_TEMPLATE *template)
void bounce_template_expand(BOUNCE_OUT_FN out_fn, VSTREAM *stream,
const BOUNCE_TEMPLATE *template)
{
VSTRING *buf = vstring_alloc(100);
const char **cpp;
@ -358,12 +368,14 @@ void bounce_template_expand(VSTREAM *stream, const BOUNCE_TEMPLATE *template)
stat = mac_expand(buf, *cpp, MAC_EXP_FLAG_NONE, filter,
bounce_template_lookup, (char *) template);
if (stat & MAC_PARSE_ERROR)
msg_fatal("bad $name syntax in %s template: %s",
msg_fatal("%s: bad $name syntax in %s template: %s",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
template->class, *cpp);
if (stat & MAC_PARSE_UNDEF)
msg_fatal("undefined $name in %s template: %s",
msg_fatal("%s: undefined $name in %s template: %s",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
template->class, *cpp);
post_mail_fputs(stream, STR(buf));
out_fn(stream, STR(buf));
}
vstring_free(buf);
}
@ -423,19 +435,22 @@ const BOUNCE_TEMPLATE *bounce_template_find(const char *template_name,
*/
#define GETLINE(line, buf) \
(((line) = (buf)) ? ((buf) = split_at((buf), '\n'), (line)) : 0)
/*#define GETLINE(line, buf) (line = mystrtok(&buf, "\n"))*/
while ((GETLINE(cp, tval)) != 0 && (hlen = is_header(cp)) > 0) {
for (hval = cp + hlen; *hval && (*hval == ':' || ISSPACE(*hval)); hval++)
*hval = 0;
if (*hval == 0) {
msg_warn("empty \"%s\" header value in %s template "
"-- ignoring this template", cp, template_name);
msg_warn("%s: empty \"%s\" header value in %s template "
"-- ignoring this template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
cp, template_name);
CLEANUP_AND_RETURN(def_template);
}
if (!allascii(hval)) {
msg_warn("non-ASCII \"%s\" header value in %s template "
"-- ignoring this template", cp, template_name);
msg_warn("%s: non-ASCII \"%s\" header value in %s template "
"-- ignoring this template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
cp, template_name);
CLEANUP_AND_RETURN(def_template);
}
if (strcasecmp("charset", cp) == 0) {
@ -446,14 +461,18 @@ const BOUNCE_TEMPLATE *bounce_template_find(const char *template_name,
tp->subject = hval;
} else if (strcasecmp("postmaster-subject", cp) == 0) {
if (tp->postmaster_subject == 0) {
msg_warn("\"%s\" header label in %s template is not applicable "
"-- ignoring this template", cp, template_name);
msg_warn("%s: inapplicable \"%s\" header label in %s template "
"-- ignoring this template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
cp, template_name);
CLEANUP_AND_RETURN(def_template);
}
tp->postmaster_subject = hval;
} else {
msg_warn("unknown \"%s\" header label in %s template "
"-- ignoring this template", cp, template_name);
msg_warn("%s: unknown \"%s\" header label in %s template "
"-- ignoring this template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
cp, template_name);
CLEANUP_AND_RETURN(def_template);
}
}
@ -464,8 +483,10 @@ const BOUNCE_TEMPLATE *bounce_template_find(const char *template_name,
while (cp && (*cp == 0 || allspace(cp)))
(void) GETLINE(cp, tval);
if (cp == 0) {
msg_warn("missing message text in %s template "
"-- ignoring this template", template_name);
msg_warn("%s: missing message text in %s template "
"-- ignoring this template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
template_name);
CLEANUP_AND_RETURN(def_template);
}
@ -477,12 +498,14 @@ const BOUNCE_TEMPLATE *bounce_template_find(const char *template_name,
if (NON_ASCII(cp) || NON_ASCII(tval)) {
if (strcasecmp(tp->charset, "us-ascii") == 0) {
msg_warn("8-bit message text in %s template", template_name);
msg_warn("%s: 8-bit message text in %s template",
*var_bounce_tmpl ? var_bounce_tmpl : "[built-in]",
template_name);
msg_warn("please specify a charset value other than us-ascii");
msg_warn("-- ignoring this template for now");
CLEANUP_AND_RETURN(def_template);
}
tp->encoding = MAIL_ATTR_ENC_8BIT;
tp->mime_encoding = MAIL_ATTR_ENC_8BIT;
}
/*
@ -526,22 +549,44 @@ static void print_template(VSTREAM *stream, const BOUNCE_TEMPLATE *tp)
vstream_fflush(stream);
}
/* bounce_template_dump_actual - dump actual templates to stream */
/* bounce_template_dump_all - dump bounce templates to stream */
void bounce_template_dump_actual(VSTREAM *stream)
void bounce_template_dump_all(VSTREAM *stream)
{
print_template(VSTREAM_OUT, FAIL_TEMPLATE());
vstream_fprintf(stream, "\n");
print_template(VSTREAM_OUT, DELAY_TEMPLATE());
vstream_fprintf(stream, "\n");
print_template(VSTREAM_OUT, SUCCESS_TEMPLATE());
vstream_fprintf(stream, "\n");
print_template(VSTREAM_OUT, VERIFY_TEMPLATE());
}
/* bounce_template_dump_default - dump built-in templates to stream */
/* bounce_plain_out - output line as plain text */
void bounce_template_dump_default(VSTREAM *stream)
static int bounce_plain_out(VSTREAM *stream, const char *text)
{
print_template(VSTREAM_OUT, &def_bounce_fail_template);
print_template(VSTREAM_OUT, &def_bounce_delay_template);
print_template(VSTREAM_OUT, &def_bounce_success_template);
print_template(VSTREAM_OUT, &def_bounce_verify_template);
vstream_fprintf(stream, "%s\n", text);
return (0);
}
/* bounce_template_expand_all - dump expanded template text to stream */
void bounce_template_expand_all(VSTREAM *stream)
{
const BOUNCE_TEMPLATE *tp;
tp = FAIL_TEMPLATE();
vstream_fprintf(VSTREAM_OUT, "expanded_%s_text = <<EOF\n", tp->class);
bounce_template_expand(bounce_plain_out, VSTREAM_OUT, tp);
tp = DELAY_TEMPLATE();
vstream_fprintf(VSTREAM_OUT, "EOF\n\nexpanded_%s_text = <<EOF\n", tp->class);
bounce_template_expand(bounce_plain_out, VSTREAM_OUT, tp);
tp = SUCCESS_TEMPLATE();
vstream_fprintf(VSTREAM_OUT, "EOF\n\nexpanded_%s_text = <<EOF\n", tp->class);
bounce_template_expand(bounce_plain_out, VSTREAM_OUT, tp);
tp = VERIFY_TEMPLATE();
vstream_fprintf(VSTREAM_OUT, "EOF\n\nexpanded_%s_text = <<EOF\n", tp->class);
bounce_template_expand(bounce_plain_out, VSTREAM_OUT, tp);
vstream_fprintf(VSTREAM_OUT, "EOF\n");
}

View File

@ -20,7 +20,7 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
#define MAIL_RELEASE_DATE "20051112"
#define MAIL_RELEASE_DATE "20051114"
#define MAIL_VERSION_NUMBER "2.3"
#ifdef SNAPSHOT

View File

@ -167,6 +167,7 @@
#include <msg.h>
#include <msg_syslog.h>
#include <msg_vstream.h>
#include <chroot_uid.h>
#include <listen.h>
#include <events.h>
@ -249,7 +250,7 @@ static void multi_server_timeout(int unused_event, char *unused_context)
/* multi_server_drain - stop accepting new clients */
int multi_server_drain(void)
int multi_server_drain(void)
{
int fd;
@ -472,15 +473,18 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
MAIL_SERVER_LOOP_FN loop = 0;
int key;
char *transport = 0;
#if 0
char *lock_path;
VSTRING *why;
#endif
int alone = 0;
int zerolimit = 0;
WATCHDOG *watchdog;
char *oval;
char *generation;
int msg_vstream_needed = 0;
/*
* Process environment options as early as we can.
@ -532,7 +536,7 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
* stderr, because no-one is going to see them.
*/
opterr = 0;
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvz")) > 0) {
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvVz")) > 0) {
switch (c) {
case 'c':
root_dir = "setme";
@ -576,6 +580,10 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
case 'v':
msg_verbose++;
break;
case 'V':
if (++msg_vstream_needed == 1)
msg_vstream_init(mail_task(var_procname), VSTREAM_ERR);
break;
case 'z':
zerolimit = 1;
break;
@ -633,12 +641,12 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
multi_server_in_flow_delay = 1;
break;
case MAIL_SERVER_SOLITARY:
if (!alone)
if (stream == 0 && !alone)
msg_fatal("service %s requires a process limit of 1",
service_name);
break;
case MAIL_SERVER_UNLIMITED:
if (!zerolimit)
if (stream == 0 && !zerolimit)
msg_fatal("service %s requires a process limit of 0",
service_name);
break;

View File

@ -150,6 +150,7 @@
#include <msg.h>
#include <msg_syslog.h>
#include <msg_vstream.h>
#include <chroot_uid.h>
#include <vstring.h>
#include <vstream.h>
@ -397,6 +398,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
WATCHDOG *watchdog;
char *oval;
char *generation;
int msg_vstream_needed = 0;
/*
* Process environment options as early as we can.
@ -448,7 +450,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
* stderr, because no-one is going to see them.
*/
opterr = 0;
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvz")) > 0) {
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvVz")) > 0) {
switch (c) {
case 'c':
root_dir = "setme";
@ -492,6 +494,10 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
case 'v':
msg_verbose++;
break;
case 'V':
if (++msg_vstream_needed == 1)
msg_vstream_init(mail_task(var_procname), VSTREAM_ERR);
break;
case 'z':
zerolimit = 1;
break;
@ -546,12 +552,12 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
single_server_in_flow_delay = 1;
break;
case MAIL_SERVER_SOLITARY:
if (!alone)
if (stream == 0 && !alone)
msg_fatal("service %s requires a process limit of 1",
service_name);
break;
case MAIL_SERVER_UNLIMITED:
if (!zerolimit)
if (stream == 0 && !zerolimit)
msg_fatal("service %s requires a process limit of 0",
service_name);
break;

View File

@ -158,6 +158,7 @@
#include <msg.h>
#include <msg_syslog.h>
#include <msg_vstream.h>
#include <chroot_uid.h>
#include <vstring.h>
#include <vstream.h>
@ -403,6 +404,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
WATCHDOG *watchdog;
char *oval;
char *generation;
int msg_vstream_needed = 0;
/*
* Process environment options as early as we can.
@ -454,7 +456,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
* stderr, because no-one is going to see them.
*/
opterr = 0;
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvz")) > 0) {
while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:St:uvVz")) > 0) {
switch (c) {
case 'c':
root_dir = "setme";
@ -498,6 +500,10 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
case 'v':
msg_verbose++;
break;
case 'V':
if (++msg_vstream_needed == 1)
msg_vstream_init(mail_task(var_procname), VSTREAM_ERR);
break;
case 'z':
zerolimit = 1;
break;
@ -552,12 +558,12 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
trigger_server_in_flow_delay = 1;
break;
case MAIL_SERVER_SOLITARY:
if (!alone)
if (stream == 0 && !alone)
msg_fatal("service %s requires a process limit of 1",
service_name);
break;
case MAIL_SERVER_UNLIMITED:
if (!zerolimit)
if (stream == 0 && !zerolimit)
msg_fatal("service %s requires a process limit of 0",
service_name);
break;

View File

@ -81,6 +81,7 @@ postconf.o: ../../include/mail_conf.h
postconf.o: ../../include/mail_dict.h
postconf.o: ../../include/mail_params.h
postconf.o: ../../include/mail_proto.h
postconf.o: ../../include/mail_run.h
postconf.o: ../../include/mail_version.h
postconf.o: ../../include/mbox_conf.h
postconf.o: ../../include/msg.h

View File

@ -10,13 +10,26 @@
/*
/* \fBpostconf\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
/* [\fIparameter=value ...\fR]
/*
/* \fBpostconf\fR [\fB-btv\fR] [\fB-c \fIconfig_dir\fR] [\fItemplate_file\fR]
/* DESCRIPTION
/* The \fBpostconf\fR(1) command prints the actual value of
/* \fIparameter\fR (all known parameters by default) one
/* parameter per line, changes its value, or prints other
/* information about the Postfix mail system.
/* The \fBpostconf\fR(1) command displays the actual values
/* of configuration parameters, changes configuration parameter
/* values, or displays other configuration information about
/* the Postfix mail system.
/*
/* Options:
/* .IP "\fB-b\fR [\fItemplate_file\fR]"
/* Display the message text that appears at the beginning of
/* delivery status notification (DSN) messages, with $\fBname\fR
/* expressions replaced by actual values. To override the
/* built-in message text, specify a template file at the end
/* of the command line, or specify a template file in main.cf
/* with the \fBbounce_template_file\fR parameter.
/* To force selection of the built-in message text templates,
/* specify an empty template file name (in shell language: "").
/*
/* This feature is available with Postfix 2.3 and later.
/* .IP "\fB-c \fIconfig_dir\fR"
/* The \fBmain.cf\fR configuration file is in the named directory
/* instead of the default configuration directory.
@ -117,11 +130,21 @@
/* The result is a group file entry in \fBgroup\fR(5) format.
/* .RE
/* .RE
/* .sp
/* .IP
/* Other table types may exist depending on how Postfix was built.
/* .IP \fB-n\fR
/* Print parameter settings that are not left at their built-in
/* default value, because they are explicitly specified in main.cf.
/* .IP "\fB-t\fR [\fItemplate_file\fR]"
/* Display the templates for delivery status notification (DSN)
/* messages. To override the built-in templates, specify a
/* template file at the end of the command line, or specify a
/* template file in main.cf with the \fBbounce_template_file\fR
/* parameter. To force selection of the built-in templates,
/* specify an empty template file name (in shell language:
/* "").
/*
/* This feature is available with Postfix 2.3 and later.
/* .IP \fB-v\fR
/* Enable verbose logging for debugging purposes. Multiple \fB-v\fR
/* options make the software increasingly verbose.
@ -143,9 +166,12 @@
/* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
/* The default location of the Postfix main.cf and master.cf
/* configuration files.
/* .IP "\fBbounce_template_file (empty)\fR"
/* Pathname of a configuration file with bounce message templates.
/* FILES
/* /etc/postfix/main.cf, Postfix configuration parameters
/* SEE ALSO
/* bounce(5), bouce template file format
/* postconf(5), configuration parameters
/* README FILES
/* .ad
@ -201,6 +227,7 @@
#include <vstring_vstream.h>
#include <myflock.h>
#include <inet_proto.h>
#include <argv.h>
/* Global library. */
@ -212,6 +239,7 @@
#include <mail_params.h>
#include <mail_addr.h>
#include <mbox_conf.h>
#include <mail_run.h>
/*
* What we're supposed to be doing.
@ -900,6 +928,7 @@ int main(int argc, char **argv)
int fd;
struct stat st;
int junk;
ARGV *ext_argv = 0;
/*
* Be consistent with file permissions.
@ -924,8 +953,14 @@ int main(int argc, char **argv)
/*
* Parse JCL.
*/
while ((ch = GETOPT(argc, argv, "c:deEhmlnv")) > 0) {
while ((ch = GETOPT(argc, argv, "bc:deEhmlntv")) > 0) {
switch (ch) {
case 'b':
if (ext_argv)
msg_fatal("specify one of -b and -t");
ext_argv = argv_alloc(2);
argv_add(ext_argv, "bounce", "-SVnexpand_templates", (char *) 0);
break;
case 'c':
if (setenv(CONF_ENV_PATH, optarg, 1) < 0)
msg_fatal("out of memory");
@ -960,11 +995,17 @@ int main(int argc, char **argv)
case 'n':
mode |= SHOW_NONDEF;
break;
case 't':
if (ext_argv)
msg_fatal("specify one of -b and -t");
ext_argv = argv_alloc(2);
argv_add(ext_argv, "bounce", "-SVndump_templates", (char *) 0);
break;
case 'v':
msg_verbose++;
break;
default:
msg_fatal("usage: %s [-c config_dir] [-d (defaults)] [-e (edit)] [-h (no names)] [-l (lock types)] [-m (map types)] [-n (non-defaults)] [-v] [name...]", argv[0]);
msg_fatal("usage: %s [-b (bounce templates)] [-c config_dir] [-d (defaults)] [-e (edit)] [-h (no names)] [-l (lock types)] [-m (map types)] [-n (non-defaults)] [-v] [name...]", argv[0]);
}
}
@ -972,9 +1013,31 @@ int main(int argc, char **argv)
* Sanity check.
*/
junk = (mode & (SHOW_DEFS | SHOW_NONDEF | SHOW_MAPS | SHOW_LOCKS | EDIT_MAIN));
if (junk != 0 && junk != SHOW_DEFS && junk != SHOW_NONDEF
&& junk != SHOW_MAPS && junk != SHOW_LOCKS && junk != EDIT_MAIN)
msg_fatal("specify one of -d, -e, -m, -l and -n");
if (junk != 0 && ((junk != SHOW_DEFS && junk != SHOW_NONDEF
&& junk != SHOW_MAPS && junk != SHOW_LOCKS && junk != EDIT_MAIN)
|| ext_argv != 0))
msg_fatal("specify one of -b, -d, -e, -m, -l and -n");
/*
* Display bounce template information and exit.
*/
if (ext_argv) {
if (argv[optind]) {
if (argv[optind + 1])
msg_fatal("options -b and -t require at most one template file");
argv_add(ext_argv, "-o",
concatenate(VAR_BOUNCE_TMPL, "=",
argv[optind], (char *) 0),
(char *) 0);
}
/* Grr... */
argv_add(ext_argv, "-o",
concatenate(VAR_QUEUE_DIR, "=", ".", (char *) 0),
(char *) 0);
mail_conf_read();
mail_run_replace(var_daemon_dir, ext_argv->argv);
/* NOTREACHED */
}
/*
* If showing map types, show them and exit

View File

@ -165,6 +165,7 @@
/* sendmail(1), Sendmail compatibility interface
/*
/* Postfix configuration:
/* bounce(5), Postfix bounce message templates
/* master(5), Postfix master.cf file syntax
/* postconf(5), Postfix main.cf file syntax
/*