mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-30 05:38:06 +00:00
postfix-1.1.11-20020819
This commit is contained in:
parent
47348a55a4
commit
041b933666
@ -6776,14 +6776,64 @@ Apologies for any names omitted.
|
||||
global/bounce_log.c, global/bounce.c, bounce/bounce.c,
|
||||
bounce/bounce_notify_util.c, bounce/bounce_one_service.c.
|
||||
|
||||
20020809
|
||||
|
||||
Bugfix: the 20020531 bugfix could prepend '.' to lines when
|
||||
it shouldn't (but only when converting 8-bit mail to 7-bit).
|
||||
Problem experienced by Ralf Hildebrandt. File:
|
||||
smtp/smtp_proto.c.
|
||||
|
||||
Bugfix: smtpd_sender_login_maps did not do the @domain etc.
|
||||
wild-card lookups that were promised. Problem experienced
|
||||
by Sven Michels. File: smtpd/smtpd_check.c.
|
||||
|
||||
20020810
|
||||
|
||||
Feature: new smtp-sink command-line options to specify the
|
||||
SMTP hostname, to disable ESMTP protocol support, to
|
||||
disable 8BITMIME support, and to syslog selected commands.
|
||||
File: smtpstone/smtp-sink.c.
|
||||
|
||||
20020814
|
||||
|
||||
Feature: the queue manager now warns when mail for some
|
||||
destination is piling up in the active queue, and suggests
|
||||
a variety of remedies. The qmgr_clog_warn_time parameter
|
||||
controls the time between warnings, mainly so that I could
|
||||
test the code. To disable these warnings, specify
|
||||
"qmgr_clog_warn_time = 0". Files: *qmgr/qmgr_entry.c.
|
||||
|
||||
20020815
|
||||
|
||||
Paranoia: truncate the DNS response length result value in
|
||||
case it is larger than the result buffer length (the resolver
|
||||
documentation is vague about this). File: dns/dns_lookup.c.
|
||||
|
||||
20020816
|
||||
|
||||
Cleanup: "postqueue -f" now also trigger delivery of mail
|
||||
in the maildrop directory. This is needed when the master
|
||||
does not frequently wake up the pickup service. Files:
|
||||
global/mail_flush.c, postqueue/postqueue.c.
|
||||
|
||||
20020818
|
||||
|
||||
Cleanup: the qmgr_site_hog_factor feature is gone (defer
|
||||
mail if a site uses up too much space in the active queue).
|
||||
Instead, the qmgr_clog_warn_time feature provides better
|
||||
solutions. File: qmgr/qmgr_message.c.
|
||||
|
||||
20020819
|
||||
|
||||
Feature: new header/body_checks HOLD pattern that causes
|
||||
mail to be placed on the "hold" queue for manual inspection.
|
||||
Files: global/hold_message.[hc], cleanup/cleanup_message.c.
|
||||
|
||||
Open problems:
|
||||
|
||||
Medium: should permit_mx_backup defer delivery if DNS
|
||||
has some error of some kind?
|
||||
|
||||
Medium: old maildrop files are no longer readable by the
|
||||
pickup service. Log a message that suggests a fix.
|
||||
|
||||
Low: all table lookups should consistently use internalized
|
||||
(unquoted) or externalized (quoted) forms as lookup keys.
|
||||
smtpd, qmgr, local, etc. use unquoted address forms as
|
||||
|
@ -49,6 +49,7 @@ If your system is supported, it is one of
|
||||
AIX 3.2.5
|
||||
AIX 4.1.x
|
||||
AIX 4.2.0
|
||||
AIX 4.3.x
|
||||
BSD/OS 2.x
|
||||
BSD/OS 3.x
|
||||
BSD/OS 4.x
|
||||
@ -64,27 +65,29 @@ If your system is supported, it is one of
|
||||
IRIX 6.x
|
||||
Linux Debian 1.3.1
|
||||
Linux Debian 2.x
|
||||
Linux RedHat 3.x (August 2002)
|
||||
Linux RedHat 4.x
|
||||
Linux RedHat 5.x
|
||||
Linux RedHat 6.x
|
||||
Linux RedHat 7.x
|
||||
Linux Slackware 3.x
|
||||
Linux Slackware 3.x (long ago)
|
||||
Linux Slackware 4.x
|
||||
Linux Slackware 7.x
|
||||
Linux SuSE 5.x
|
||||
Linux SuSE 6.x
|
||||
Linux SuSE 7.x
|
||||
Mac OS X
|
||||
NEXTSTEP 3.x
|
||||
NEXTSTEP 3.x (long ago)
|
||||
NetBSD 1.x
|
||||
OPENSTEP 4.x
|
||||
OSF1.V3 (Digital UNIX)
|
||||
OSF1.V4 aka Digital UNIX V4
|
||||
OSF1.V5 aka Digital UNIX V5
|
||||
OpenBSD 2.x
|
||||
OpenBSD 3.x
|
||||
Reliant UNIX 5.x
|
||||
Rhapsody 5.x
|
||||
SunOS 4.1.x (with Postfix 1.1.0)
|
||||
SunOS 4.1.x (July 2002)
|
||||
SunOS 5.4..5.8 (Solaris 2.4..8)
|
||||
Ultrix 4.x (well, that was long ago)
|
||||
|
||||
|
@ -83,7 +83,7 @@ Edit the debugger_command definition in /etc/postfix/main.cf so
|
||||
that it invokes the call tracer of your choice, for example:
|
||||
|
||||
debugger_command =
|
||||
PATH=/bin:/usr/bin:/usr/local/bin
|
||||
PATH=/bin:/usr/bin:/usr/local/bin;
|
||||
(truss -p $process_id 2>&1 | logger -p mail.info) & sleep 5
|
||||
|
||||
Type "postfix reload" and watch the logfile.
|
||||
|
@ -13,6 +13,8 @@ having to copy it to each.
|
||||
BUILDING WITH LDAP SUPPORT
|
||||
==========================
|
||||
|
||||
Note: Postfix no longer supports the LDAP version 1 interface.
|
||||
|
||||
You need to have LDAP libraries and include files installed somewhere on
|
||||
your system, and you need to configure the Postfix Makefiles
|
||||
accordingly.
|
||||
|
@ -140,7 +140,7 @@ IMPORTANT: postfix processes need to have group read+execute
|
||||
permission for the /var/pwcheck directory, otherwise authentication
|
||||
attempts will fail.
|
||||
|
||||
Alternately, in SASL 1.5.27 and later (including 2.1.1), try:
|
||||
Alternately, in SASL 1.5.5 and later (including 2.1.1), try:
|
||||
|
||||
(SASL version 1.5.5)
|
||||
/usr/local/lib/sasl/smtpd.conf:
|
||||
|
@ -12,40 +12,57 @@ snapshot release). Patches change the patchlevel and the release
|
||||
date. Snapshots change only the release date, unless they include
|
||||
the same bugfixes as a patch release.
|
||||
|
||||
Incompatible changes with Postfix snapshot 1.1.11-20020804
|
||||
==========================================================
|
||||
Incompatible changes with Postfix snapshot 1.1.11-2002018
|
||||
=========================================================
|
||||
|
||||
The qmgr_site_hog_factor feature is gone (this would defer mail
|
||||
delivery for sites that occupy too much space in the active queue,
|
||||
and be a real performance drain due to excessive disk I/O). The
|
||||
new qmgr_clog_warn_time feature (see below) provides more useful
|
||||
suggestions for dealing with Postfix congestion.
|
||||
|
||||
LDAP API version 1 is no longer supported. The memory allocation
|
||||
and deallocation strategy has changed too much to maintain both
|
||||
version 1 and 2 at the same time.
|
||||
|
||||
In mailq output, the queue ID is followed by the ! character when
|
||||
the message is in the "hold" queue. This may break programs that
|
||||
process mailq output.
|
||||
the message is in the "hold" queue (see below). This may break
|
||||
programs that process mailq output.
|
||||
|
||||
The "permit_naked_ip_address" restriction on HELO command syntax
|
||||
is unsafe when used with smtpd_recipient_restrictions, and will go
|
||||
away. The user is requested to use "permit_mynetworks" instead.
|
||||
is unsafe when used with most smtpd_XXX_restrictions, and will go
|
||||
away. The user is now requested to use "permit_mynetworks" instead.
|
||||
|
||||
The smtpd_sasl_local_domain setting now defaults to the null string,
|
||||
rather than $myhostname. This seems to work better with Cyrus SASL
|
||||
version 2. This change may cause incompatibility with the saslpasswd2
|
||||
command.
|
||||
|
||||
Major changes with Postfix snapshot 1.1.11-20020804
|
||||
Major changes with Postfix snapshot 1.1.11-20020818
|
||||
===================================================
|
||||
|
||||
New "hold" queue for mail that should not be delivered. "postqueue
|
||||
-h" puts mail on hold, and "postqueue -H" releases mail, moving
|
||||
When the Postfix local delivery agent detects a mail delivery loop
|
||||
(usually the result of mis-configured mail pickup software), the
|
||||
undeliverable mail is now sent to the mailing list owner instead
|
||||
of the envelope sender address (usually the original poster who
|
||||
has no guilt, and who cannot fix the problem).
|
||||
|
||||
New "hold" queue for mail that should not be delivered. "postsuper
|
||||
-h" puts mail on hold, and "postsuper -H" releases mail, moving
|
||||
mail that was "on hold" to the deferred queue.
|
||||
|
||||
Mail is now sent to the mailing list owner when Postfix detects a
|
||||
Delivered-To: mail delivery loop. Delivery loops happen when idiots
|
||||
forward mail that was already stored in a mailbox, setting the
|
||||
envelope recipient address to the To: address (so that mail would
|
||||
loop back to the mailing list), and setting the envelope sender
|
||||
address to the From: address (so that the error report would be
|
||||
sent to the poster).
|
||||
New header/body HOLD action that causes mail to be placed on the
|
||||
"hold" queue. Presently, all you can do with mail "on hold" is to
|
||||
examine it with postcat, to take it "off hold" with "postsuper -H",
|
||||
or to destroy it with "postsuper -d". See conf/sample-filter.cf.
|
||||
|
||||
The Postfix queue manager now warns when mail for some destination
|
||||
is piling up in the active queue, and suggests a variety of remedies
|
||||
to speed up delivery (increase per-destination concurrency limit,
|
||||
increase active queue size, use a separate delivery transport,
|
||||
increase per-transport process limit). The qmgr_clog_warn_time
|
||||
parameter controls the time between warnings. To disable these
|
||||
warnings, specify "qmgr_clog_warn_time = 0".
|
||||
|
||||
Incompatible changes with Postfix snapshot 1.1.11-20020717
|
||||
==========================================================
|
||||
|
@ -44,36 +44,39 @@ NQMGR(8) NQMGR(8)
|
||||
Unreadable or damaged queue files are moved here
|
||||
for inspection.
|
||||
|
||||
<b>hold</b> Messages that are kept "on hold" are kept here
|
||||
until someone sets them free.
|
||||
|
||||
<b>DELIVERY</b> <b>STATUS</b> <b>REPORTS</b>
|
||||
The <b>nqmgr</b> daemon keeps an eye on per-message delivery sta-
|
||||
tus reports in the following directories. Each status
|
||||
tus reports in the following directories. Each status
|
||||
report file has the same name as the corresponding message
|
||||
file:
|
||||
|
||||
<b>bounce</b> Per-recipient status information about why mail is
|
||||
bounced. These files are maintained by the
|
||||
<b>bounce</b> Per-recipient status information about why mail is
|
||||
bounced. These files are maintained by the
|
||||
<a href="bounce.8.html"><b>bounce</b>(8)</a> daemon.
|
||||
|
||||
<b>defer</b> Per-recipient status information about why mail is
|
||||
delayed. These files are maintained by the
|
||||
<b>defer</b> Per-recipient status information about why mail is
|
||||
delayed. These files are maintained by the
|
||||
<a href="defer.8.html"><b>defer</b>(8)</a> daemon.
|
||||
|
||||
The <b>nqmgr</b> daemon is responsible for asking the <a href="bounce.8.html"><b>bounce</b>(8)</a>
|
||||
The <b>nqmgr</b> daemon is responsible for asking the <a href="bounce.8.html"><b>bounce</b>(8)</a>
|
||||
or <a href="defer.8.html"><b>defer</b>(8)</a> daemons to send non-delivery reports.
|
||||
|
||||
<b>STRATEGIES</b>
|
||||
The queue manager implements a variety of strategies for
|
||||
The queue manager implements a variety of strategies for
|
||||
either opening queue files (input) or for message delivery
|
||||
(output).
|
||||
|
||||
<b>leaky</b> <b>bucket</b>
|
||||
This strategy limits the number of messages in the
|
||||
<b>active</b> queue and prevents the queue manager from
|
||||
This strategy limits the number of messages in the
|
||||
<b>active</b> queue and prevents the queue manager from
|
||||
running out of memory under heavy load.
|
||||
|
||||
<b>fairness</b>
|
||||
When the <b>active</b> queue has room, the queue manager
|
||||
takes one message from the <b>incoming</b> queue and one
|
||||
When the <b>active</b> queue has room, the queue manager
|
||||
takes one message from the <b>incoming</b> queue and one
|
||||
from the <b>deferred</b> queue. This prevents a large mail
|
||||
backlog from blocking the delivery of new mail.
|
||||
|
||||
@ -84,42 +87,42 @@ NQMGR(8) NQMGR(8)
|
||||
|
||||
<b>round</b> <b>robin</b>
|
||||
The queue manager sorts delivery requests by desti-
|
||||
nation. Round-robin selection prevents one desti-
|
||||
nation. Round-robin selection prevents one desti-
|
||||
nation from dominating deliveries to other destina-
|
||||
tions.
|
||||
|
||||
<b>exponential</b> <b>backoff</b>
|
||||
Mail that cannot be delivered upon the first
|
||||
attempt is deferred. The time interval between
|
||||
attempt is deferred. The time interval between
|
||||
delivery attempts is doubled after each attempt.
|
||||
|
||||
<b>destination</b> <b>status</b> <b>cache</b>
|
||||
The queue manager avoids unnecessary delivery
|
||||
attempts by maintaining a short-term, in-memory
|
||||
The queue manager avoids unnecessary delivery
|
||||
attempts by maintaining a short-term, in-memory
|
||||
list of unreachable destinations.
|
||||
|
||||
<b>preemptive</b> <b>message</b> <b>scheduling</b>
|
||||
The queue manager attempts to minimize the average
|
||||
The queue manager attempts to minimize the average
|
||||
per-recipient delay while still preserving the cor-
|
||||
rect per-message delays, using a sophisticated pre-
|
||||
emptive message scheduling.
|
||||
|
||||
<b>TRIGGERS</b>
|
||||
On an idle system, the queue manager waits for the arrival
|
||||
of trigger events, or it waits for a timer to go off. A
|
||||
trigger is a one-byte message. Depending on the message
|
||||
received, the queue manager performs one of the following
|
||||
actions (the message is followed by the symbolic constant
|
||||
of trigger events, or it waits for a timer to go off. A
|
||||
trigger is a one-byte message. Depending on the message
|
||||
received, the queue manager performs one of the following
|
||||
actions (the message is followed by the symbolic constant
|
||||
used internally by the software):
|
||||
|
||||
<b>D</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>DEFERRED)</b>
|
||||
Start a deferred queue scan. If a deferred queue
|
||||
scan is already in progress, that scan will be
|
||||
Start a deferred queue scan. If a deferred queue
|
||||
scan is already in progress, that scan will be
|
||||
restarted as soon as it finishes.
|
||||
|
||||
<b>I</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>INCOMING)</b>
|
||||
Start an incoming queue scan. If an incoming queue
|
||||
scan is already in progress, that scan will be
|
||||
Start an incoming queue scan. If an incoming queue
|
||||
scan is already in progress, that scan will be
|
||||
restarted as soon as it finishes.
|
||||
|
||||
<b>A</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>ALL)</b>
|
||||
@ -127,32 +130,32 @@ NQMGR(8) NQMGR(8)
|
||||
affects the next deferred queue scan.
|
||||
|
||||
<b>F</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>FLUSH</b><i>_</i><b>DEAD)</b>
|
||||
Purge all information about dead transports and
|
||||
Purge all information about dead transports and
|
||||
destinations.
|
||||
|
||||
<b>W</b> <b>(TRIGGER</b><i>_</i><b>REQ</b><i>_</i><b>WAKEUP)</b>
|
||||
Wakeup call, This is used by the master server to
|
||||
instantiate servers that should not go away for-
|
||||
ever. The action is to start an incoming queue
|
||||
Wakeup call, This is used by the master server to
|
||||
instantiate servers that should not go away for-
|
||||
ever. The action is to start an incoming queue
|
||||
scan.
|
||||
|
||||
The <b>nqmgr</b> daemon reads an entire buffer worth of triggers.
|
||||
Multiple identical trigger requests are collapsed into
|
||||
one, and trigger requests are sorted so that <b>A</b> and <b>F</b> pre-
|
||||
cede <b>D</b> and <b>I</b>. Thus, in order to force a deferred queue
|
||||
Multiple identical trigger requests are collapsed into
|
||||
one, and trigger requests are sorted so that <b>A</b> and <b>F</b> pre-
|
||||
cede <b>D</b> and <b>I</b>. Thus, in order to force a deferred queue
|
||||
run, one would request <b>A</b> <b>F</b> <b>D</b>; in order to notify the queue
|
||||
manager of the arrival of new mail one would request <b>I</b>.
|
||||
|
||||
<b>STANDARDS</b>
|
||||
None. The <b>nqmgr</b> daemon does not interact with the outside
|
||||
None. The <b>nqmgr</b> daemon does not interact with the outside
|
||||
world.
|
||||
|
||||
<b>SECURITY</b>
|
||||
The <b>nqmgr</b> daemon is not security sensitive. It reads sin-
|
||||
gle-character messages from untrusted local users, and
|
||||
thus may be susceptible to denial of service attacks. The
|
||||
<b>nqmgr</b> daemon does not talk to the outside world, and it
|
||||
can be run at fixed low privilege in a chrooted environ-
|
||||
The <b>nqmgr</b> daemon is not security sensitive. It reads sin-
|
||||
gle-character messages from untrusted local users, and
|
||||
thus may be susceptible to denial of service attacks. The
|
||||
<b>nqmgr</b> daemon does not talk to the outside world, and it
|
||||
can be run at fixed low privilege in a chrooted environ-
|
||||
ment.
|
||||
|
||||
<b>DIAGNOSTICS</b>
|
||||
@ -160,25 +163,25 @@ NQMGR(8) NQMGR(8)
|
||||
Corrupted message files are saved to the <b>corrupt</b> queue for
|
||||
further inspection.
|
||||
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces and of other trou-
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces and of other trou-
|
||||
ble.
|
||||
|
||||
<b>BUGS</b>
|
||||
A single queue manager process has to compete for disk
|
||||
access with multiple front-end processes such as <b>smtpd</b>. A
|
||||
sudden burst of inbound mail can negatively impact out-
|
||||
A single queue manager process has to compete for disk
|
||||
access with multiple front-end processes such as <b>smtpd</b>. A
|
||||
sudden burst of inbound mail can negatively impact out-
|
||||
bound delivery rates.
|
||||
|
||||
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
command after a configuration change.
|
||||
|
||||
<b>Miscellaneous</b>
|
||||
<b>allow</b><i>_</i><b>min</b><i>_</i><b>user</b>
|
||||
Do not bounce recipient addresses that begin with
|
||||
Do not bounce recipient addresses that begin with
|
||||
'-'.
|
||||
|
||||
<b>relocated</b><i>_</i><b>maps</b>
|
||||
@ -189,16 +192,21 @@ NQMGR(8) NQMGR(8)
|
||||
Top-level directory of the Postfix queue.
|
||||
|
||||
<b>Active</b> <b>queue</b> <b>controls</b>
|
||||
In the text below, <i>transport</i> is the first field in a <b>mas-</b>
|
||||
In the text below, <i>transport</i> is the first field in a <b>mas-</b>
|
||||
<b>ter.cf</b> entry.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>clog</b><i>_</i><b>warn</b><i>_</i><b>time</b>
|
||||
Minimal delay between warnings that a specific des-
|
||||
tination is clogging up the active queue. Specify 0
|
||||
to disable.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>message</b><i>_</i><b>active</b><i>_</i><b>limit</b>
|
||||
Limit the number of messages in the active queue.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>message</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit the number of in-memory recipients.
|
||||
|
||||
This parameter also limits the size of the short-
|
||||
This parameter also limits the size of the short-
|
||||
term, in-memory destination cache.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>message</b><i>_</i><b>recipient</b><i>_</i><b>minimum</b>
|
||||
@ -209,34 +217,34 @@ NQMGR(8) NQMGR(8)
|
||||
per transport.
|
||||
|
||||
<i>transport_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit on the number of in-memory recipients, for
|
||||
Limit on the number of in-memory recipients, for
|
||||
the named message <i>transport</i>.
|
||||
|
||||
<b>default</b><i>_</i><b>extra</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Default limit on the total number of per transport
|
||||
in-memory recipients that the preempting messages
|
||||
Default limit on the total number of per transport
|
||||
in-memory recipients that the preempting messages
|
||||
can have.
|
||||
|
||||
<i>transport_</i><b>extra</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit on the number of in-memory recipients which
|
||||
all preempting messages delivered by the transport
|
||||
Limit on the number of in-memory recipients which
|
||||
all preempting messages delivered by the transport
|
||||
<i>transport</i> can have.
|
||||
|
||||
<b>Timing</b> <b>controls</b>
|
||||
<b>minimal</b><i>_</i><b>backoff</b><i>_</i><b>time</b>
|
||||
Minimal time in seconds between delivery attempts
|
||||
Minimal time in seconds between delivery attempts
|
||||
of a deferred message.
|
||||
|
||||
This parameter also limits the time an unreachable
|
||||
destination is kept in the short-term, in-memory
|
||||
This parameter also limits the time an unreachable
|
||||
destination is kept in the short-term, in-memory
|
||||
destination status cache.
|
||||
|
||||
<b>maximal</b><i>_</i><b>backoff</b><i>_</i><b>time</b>
|
||||
Maximal time in seconds between delivery attempts
|
||||
Maximal time in seconds between delivery attempts
|
||||
of a deferred message.
|
||||
|
||||
<b>maximal</b><i>_</i><b>queue</b><i>_</i><b>lifetime</b>
|
||||
Maximal time in days a message is queued before it
|
||||
Maximal time in days a message is queued before it
|
||||
is sent back as undeliverable.
|
||||
|
||||
<b>queue</b><i>_</i><b>run</b><i>_</i><b>delay</b>
|
||||
@ -244,52 +252,52 @@ NQMGR(8) NQMGR(8)
|
||||
scans do not overlap.
|
||||
|
||||
<b>transport</b><i>_</i><b>retry</b><i>_</i><b>time</b>
|
||||
Time in seconds between attempts to contact a bro-
|
||||
Time in seconds between attempts to contact a bro-
|
||||
ken delivery transport.
|
||||
|
||||
<b>Concurrency</b> <b>controls</b>
|
||||
<b>initial</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b>
|
||||
Initial per-destination concurrency level for par-
|
||||
Initial per-destination concurrency level for par-
|
||||
allel delivery to the same destination.
|
||||
|
||||
<b>default</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
|
||||
Default limit on the number of parallel deliveries
|
||||
Default limit on the number of parallel deliveries
|
||||
to the same destination.
|
||||
|
||||
<i>transport_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
|
||||
Limit on the number of parallel deliveries to the
|
||||
same destination, for delivery via the named mes-
|
||||
Limit on the number of parallel deliveries to the
|
||||
same destination, for delivery via the named mes-
|
||||
sage <i>transport</i>.
|
||||
|
||||
<b>Recipient</b> <b>controls</b>
|
||||
<b>default</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Default limit on the number of recipients per mes-
|
||||
Default limit on the number of recipients per mes-
|
||||
sage transfer.
|
||||
|
||||
<i>transport_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit on the number of recipients per message
|
||||
Limit on the number of recipients per message
|
||||
transfer, for the named message <i>transport</i>.
|
||||
|
||||
<b>Message</b> <b>scheduling</b>
|
||||
<i>transport_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>cost</b> (valid range: 0,2,3...)
|
||||
This parameter basically controls how often a mes-
|
||||
sage delivered by <i>transport</i> can be preempted by
|
||||
This parameter basically controls how often a mes-
|
||||
sage delivered by <i>transport</i> can be preempted by
|
||||
another message. An internal per-message/transport
|
||||
counter is incremented by one for each <i>trans-</i>
|
||||
counter is incremented by one for each <i>trans-</i>
|
||||
<i>port_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>cost</b> deliveries handled by
|
||||
<i>transport</i>. This counter represents the number of
|
||||
"available delivery slots" for use by other mes-
|
||||
<i>transport</i>. This counter represents the number of
|
||||
"available delivery slots" for use by other mes-
|
||||
sages. Current message can be preempted by another
|
||||
message when that other message can be delivered
|
||||
using less <i>transport</i> agents than the value of the
|
||||
message when that other message can be delivered
|
||||
using less <i>transport</i> agents than the value of the
|
||||
"available delivery slots" counter.
|
||||
|
||||
Value equal to 0 disables the message preemption
|
||||
Value equal to 0 disables the message preemption
|
||||
for <i>transport</i>.
|
||||
|
||||
<i>transport_</i><b>minimum</b><i>_</i><b>delivery</b><i>_</i><b>slots</b>
|
||||
Message preemption is not attempted at all whenever
|
||||
a message that can't ever accumulate at least
|
||||
a message that can't ever accumulate at least
|
||||
<i>transport_</i><b>minimum</b><i>_</i><b>delivery</b><i>_</i><b>slots</b> available delivery
|
||||
slots is being delivered by <i>transport</i>.
|
||||
|
||||
@ -297,13 +305,13 @@ NQMGR(8) NQMGR(8)
|
||||
|
||||
<i>transport_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>loan</b>
|
||||
These parameters speed up the moment when a message
|
||||
preemption can happen. Instead of waiting until
|
||||
the full amount of delivery slots required is
|
||||
available, the preemption can happen when <i>trans-</i>
|
||||
preemption can happen. Instead of waiting until
|
||||
the full amount of delivery slots required is
|
||||
available, the preemption can happen when <i>trans-</i>
|
||||
<i>port_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>discount</b> percent of the required
|
||||
amount plus <i>transport_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>loan</b> still
|
||||
remains to be accumulated. Note that the full
|
||||
amount will still have to be accumulated before
|
||||
amount plus <i>transport_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>loan</b> still
|
||||
remains to be accumulated. Note that the full
|
||||
amount will still have to be accumulated before
|
||||
another preemption can take place later.
|
||||
|
||||
<b>default</b><i>_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>cost</b>
|
||||
@ -313,7 +321,7 @@ NQMGR(8) NQMGR(8)
|
||||
<b>default</b><i>_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>discount</b>
|
||||
|
||||
<b>default</b><i>_</i><b>delivery</b><i>_</i><b>slot</b><i>_</i><b>loan</b>
|
||||
Default values for the transport specific parame-
|
||||
Default values for the transport specific parame-
|
||||
ters described above.
|
||||
|
||||
<b>SEE</b> <b>ALSO</b>
|
||||
@ -323,7 +331,7 @@ NQMGR(8) NQMGR(8)
|
||||
<a href="trivial-rewrite.8.html">trivial-rewrite(8)</a>, address routing
|
||||
|
||||
<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>
|
||||
|
@ -1,5 +1,4 @@
|
||||
<html> <head> </head> <body> <pre>
|
||||
|
||||
POSTCAT(1) POSTCAT(1)
|
||||
|
||||
<b>NAME</b>
|
||||
@ -33,6 +32,5 @@ POSTCAT(1) POSTCAT(1)
|
||||
P.O. Box 704
|
||||
Yorktown Heights, NY 10598, USA
|
||||
|
||||
1
|
||||
|
||||
POSTCAT(1)
|
||||
</pre> </body> </html>
|
||||
|
@ -44,36 +44,39 @@ QMGR(8) QMGR(8)
|
||||
Unreadable or damaged queue files are moved here
|
||||
for inspection.
|
||||
|
||||
<b>hold</b> Messages that are kept "on hold" are kept here
|
||||
until someone sets them free.
|
||||
|
||||
<b>DELIVERY</b> <b>STATUS</b> <b>REPORTS</b>
|
||||
The <b>qmgr</b> daemon keeps an eye on per-message delivery sta-
|
||||
tus reports in the following directories. Each status
|
||||
The <b>qmgr</b> daemon keeps an eye on per-message delivery sta-
|
||||
tus reports in the following directories. Each status
|
||||
report file has the same name as the corresponding message
|
||||
file:
|
||||
|
||||
<b>bounce</b> Per-recipient status information about why mail is
|
||||
bounced. These files are maintained by the
|
||||
<b>bounce</b> Per-recipient status information about why mail is
|
||||
bounced. These files are maintained by the
|
||||
<a href="bounce.8.html"><b>bounce</b>(8)</a> daemon.
|
||||
|
||||
<b>defer</b> Per-recipient status information about why mail is
|
||||
delayed. These files are maintained by the
|
||||
<b>defer</b> Per-recipient status information about why mail is
|
||||
delayed. These files are maintained by the
|
||||
<a href="defer.8.html"><b>defer</b>(8)</a> daemon.
|
||||
|
||||
The <b>qmgr</b> daemon is responsible for asking the <a href="bounce.8.html"><b>bounce</b>(8)</a> or
|
||||
<a href="defer.8.html"><b>defer</b>(8)</a> daemons to send non-delivery reports.
|
||||
|
||||
<b>STRATEGIES</b>
|
||||
The queue manager implements a variety of strategies for
|
||||
The queue manager implements a variety of strategies for
|
||||
either opening queue files (input) or for message delivery
|
||||
(output).
|
||||
|
||||
<b>leaky</b> <b>bucket</b>
|
||||
This strategy limits the number of messages in the
|
||||
<b>active</b> queue and prevents the queue manager from
|
||||
This strategy limits the number of messages in the
|
||||
<b>active</b> queue and prevents the queue manager from
|
||||
running out of memory under heavy load.
|
||||
|
||||
<b>fairness</b>
|
||||
When the <b>active</b> queue has room, the queue manager
|
||||
takes one message from the <b>incoming</b> queue and one
|
||||
When the <b>active</b> queue has room, the queue manager
|
||||
takes one message from the <b>incoming</b> queue and one
|
||||
from the <b>deferred</b> queue. This prevents a large mail
|
||||
backlog from blocking the delivery of new mail.
|
||||
|
||||
@ -84,36 +87,36 @@ QMGR(8) QMGR(8)
|
||||
|
||||
<b>round</b> <b>robin</b>
|
||||
The queue manager sorts delivery requests by desti-
|
||||
nation. Round-robin selection prevents one desti-
|
||||
nation. Round-robin selection prevents one desti-
|
||||
nation from dominating deliveries to other destina-
|
||||
tions.
|
||||
|
||||
<b>exponential</b> <b>backoff</b>
|
||||
Mail that cannot be delivered upon the first
|
||||
attempt is deferred. The time interval between
|
||||
attempt is deferred. The time interval between
|
||||
delivery attempts is doubled after each attempt.
|
||||
|
||||
<b>destination</b> <b>status</b> <b>cache</b>
|
||||
The queue manager avoids unnecessary delivery
|
||||
attempts by maintaining a short-term, in-memory
|
||||
The queue manager avoids unnecessary delivery
|
||||
attempts by maintaining a short-term, in-memory
|
||||
list of unreachable destinations.
|
||||
|
||||
<b>TRIGGERS</b>
|
||||
On an idle system, the queue manager waits for the arrival
|
||||
of trigger events, or it waits for a timer to go off. A
|
||||
trigger is a one-byte message. Depending on the message
|
||||
received, the queue manager performs one of the following
|
||||
actions (the message is followed by the symbolic constant
|
||||
of trigger events, or it waits for a timer to go off. A
|
||||
trigger is a one-byte message. Depending on the message
|
||||
received, the queue manager performs one of the following
|
||||
actions (the message is followed by the symbolic constant
|
||||
used internally by the software):
|
||||
|
||||
<b>D</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>DEFERRED)</b>
|
||||
Start a deferred queue scan. If a deferred queue
|
||||
scan is already in progress, that scan will be
|
||||
Start a deferred queue scan. If a deferred queue
|
||||
scan is already in progress, that scan will be
|
||||
restarted as soon as it finishes.
|
||||
|
||||
<b>I</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>INCOMING)</b>
|
||||
Start an incoming queue scan. If an incoming queue
|
||||
scan is already in progress, that scan will be
|
||||
Start an incoming queue scan. If an incoming queue
|
||||
scan is already in progress, that scan will be
|
||||
restarted as soon as it finishes.
|
||||
|
||||
<b>A</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>SCAN</b><i>_</i><b>ALL)</b>
|
||||
@ -121,30 +124,30 @@ QMGR(8) QMGR(8)
|
||||
affects the next deferred queue scan.
|
||||
|
||||
<b>F</b> <b>(QMGR</b><i>_</i><b>REQ</b><i>_</i><b>FLUSH</b><i>_</i><b>DEAD)</b>
|
||||
Purge all information about dead transports and
|
||||
Purge all information about dead transports and
|
||||
destinations.
|
||||
|
||||
<b>W</b> <b>(TRIGGER</b><i>_</i><b>REQ</b><i>_</i><b>WAKEUP)</b>
|
||||
Wakeup call, This is used by the master server to
|
||||
instantiate servers that should not go away for-
|
||||
ever. The action is to start an incoming queue
|
||||
Wakeup call, This is used by the master server to
|
||||
instantiate servers that should not go away for-
|
||||
ever. The action is to start an incoming queue
|
||||
scan.
|
||||
|
||||
The <b>qmgr</b> daemon reads an entire buffer worth of triggers.
|
||||
Multiple identical trigger requests are collapsed into
|
||||
one, and trigger requests are sorted so that <b>A</b> and <b>F</b> pre-
|
||||
cede <b>D</b> and <b>I</b>. Thus, in order to force a deferred queue
|
||||
The <b>qmgr</b> daemon reads an entire buffer worth of triggers.
|
||||
Multiple identical trigger requests are collapsed into
|
||||
one, and trigger requests are sorted so that <b>A</b> and <b>F</b> pre-
|
||||
cede <b>D</b> and <b>I</b>. Thus, in order to force a deferred queue
|
||||
run, one would request <b>A</b> <b>F</b> <b>D</b>; in order to notify the queue
|
||||
manager of the arrival of new mail one would request <b>I</b>.
|
||||
|
||||
<b>STANDARDS</b>
|
||||
None. The <b>qmgr</b> daemon does not interact with the outside
|
||||
None. The <b>qmgr</b> daemon does not interact with the outside
|
||||
world.
|
||||
|
||||
<b>SECURITY</b>
|
||||
The <b>qmgr</b> daemon is not security sensitive. It reads sin-
|
||||
gle-character messages from untrusted local users, and
|
||||
thus may be susceptible to denial of service attacks. The
|
||||
The <b>qmgr</b> daemon is not security sensitive. It reads sin-
|
||||
gle-character messages from untrusted local users, and
|
||||
thus may be susceptible to denial of service attacks. The
|
||||
<b>qmgr</b> daemon does not talk to the outside world, and it can
|
||||
be run at fixed low privilege in a chrooted environment.
|
||||
|
||||
@ -153,25 +156,25 @@ QMGR(8) QMGR(8)
|
||||
Corrupted message files are saved to the <b>corrupt</b> queue for
|
||||
further inspection.
|
||||
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces and of other trou-
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces and of other trou-
|
||||
ble.
|
||||
|
||||
<b>BUGS</b>
|
||||
A single queue manager process has to compete for disk
|
||||
access with multiple front-end processes such as <b>smtpd</b>. A
|
||||
sudden burst of inbound mail can negatively impact out-
|
||||
A single queue manager process has to compete for disk
|
||||
access with multiple front-end processes such as <b>smtpd</b>. A
|
||||
sudden burst of inbound mail can negatively impact out-
|
||||
bound delivery rates.
|
||||
|
||||
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
command after a configuration change.
|
||||
|
||||
<b>Miscellaneous</b>
|
||||
<b>allow</b><i>_</i><b>min</b><i>_</i><b>user</b>
|
||||
Do not bounce recipient addresses that begin with
|
||||
Do not bounce recipient addresses that begin with
|
||||
'-'.
|
||||
|
||||
<b>relocated</b><i>_</i><b>maps</b>
|
||||
@ -182,30 +185,35 @@ QMGR(8) QMGR(8)
|
||||
Top-level directory of the Postfix queue.
|
||||
|
||||
<b>Active</b> <b>queue</b> <b>controls</b>
|
||||
<b>qmgr</b><i>_</i><b>clog</b><i>_</i><b>warn</b><i>_</i><b>time</b>
|
||||
Minimal delay between warnings that a specific des-
|
||||
tination is clogging up the active queue. Specify 0
|
||||
to disable.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>message</b><i>_</i><b>active</b><i>_</i><b>limit</b>
|
||||
Limit the number of messages in the active queue.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>message</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit the number of in-memory recipients.
|
||||
|
||||
This parameter also limits the size of the short-
|
||||
This parameter also limits the size of the short-
|
||||
term, in-memory destination cache.
|
||||
|
||||
<b>Timing</b> <b>controls</b>
|
||||
<b>minimal</b><i>_</i><b>backoff</b><i>_</i><b>time</b>
|
||||
Minimal time in seconds between delivery attempts
|
||||
Minimal time in seconds between delivery attempts
|
||||
of a deferred message.
|
||||
|
||||
This parameter also limits the time an unreachable
|
||||
destination is kept in the short-term, in-memory
|
||||
This parameter also limits the time an unreachable
|
||||
destination is kept in the short-term, in-memory
|
||||
destination status cache.
|
||||
|
||||
<b>maximal</b><i>_</i><b>backoff</b><i>_</i><b>time</b>
|
||||
Maximal time in seconds between delivery attempts
|
||||
Maximal time in seconds between delivery attempts
|
||||
of a deferred message.
|
||||
|
||||
<b>maximal</b><i>_</i><b>queue</b><i>_</i><b>lifetime</b>
|
||||
Maximal time in days a message is queued before it
|
||||
Maximal time in days a message is queued before it
|
||||
is sent back as undeliverable.
|
||||
|
||||
<b>queue</b><i>_</i><b>run</b><i>_</i><b>delay</b>
|
||||
@ -213,40 +221,28 @@ QMGR(8) QMGR(8)
|
||||
scans do not overlap.
|
||||
|
||||
<b>transport</b><i>_</i><b>retry</b><i>_</i><b>time</b>
|
||||
Time in seconds between attempts to contact a bro-
|
||||
Time in seconds between attempts to contact a bro-
|
||||
ken delivery transport.
|
||||
|
||||
<b>Concurrency</b> <b>controls</b>
|
||||
In the text below, <i>transport</i> is the first field in a <b>mas-</b>
|
||||
In the text below, <i>transport</i> is the first field in a <b>mas-</b>
|
||||
<b>ter.cf</b> entry.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>fudge</b><i>_</i><b>factor</b> (valid range: 10..100)
|
||||
The percentage of delivery resources that a busy
|
||||
mail system will use up for delivery of a large
|
||||
mailing list message. With 100%, delivery of one
|
||||
message does not begin before the previous message
|
||||
has been delivered. This results in good perfor-
|
||||
mance for large mailing lists, but results in poor
|
||||
response time for one-to-one mail. With less than
|
||||
100%, response time for one-to-one mail improves,
|
||||
but large mailing list delivery performance suf-
|
||||
fers. In the worst case, recipients near the begin-
|
||||
ning of a large list receive a burst of messages
|
||||
immediately, while recipients near the end of that
|
||||
list receive that same burst of messages a whole
|
||||
day later.
|
||||
|
||||
<b>qmgr</b><i>_</i><b>site</b><i>_</i><b>hog</b><i>_</i><b>factor</b> (valid range: 10..100)
|
||||
The percentage of delivery resources that a busy
|
||||
mail system will use up for delivery to a single
|
||||
site. With 100%, mail is delivered in first-in,
|
||||
first-out order, so that a burst of mail for one
|
||||
site can block mail for other destinations. With
|
||||
less than 100%, the excess mail is deferred. The
|
||||
deferred mail is delivered in little bursts, the
|
||||
remainder of the backlog being deferred again, with
|
||||
a lot of I/O activity happening as Postfix searches
|
||||
the deferred queue for deliverable mail.
|
||||
mail system will use up for delivery of a large
|
||||
mailing list message. With 100%, delivery of one
|
||||
message does not begin before the previous message
|
||||
has been delivered. This results in good perfor-
|
||||
mance for large mailing lists, but results in poor
|
||||
response time for one-to-one mail. With less than
|
||||
100%, response time for one-to-one mail improves,
|
||||
but large mailing list delivery performance suf-
|
||||
fers. In the worst case, recipients near the begin-
|
||||
ning of a large list receive a burst of messages
|
||||
immediately, while recipients near the end of that
|
||||
list receive that same burst of messages a whole
|
||||
day later.
|
||||
|
||||
<b>initial</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b>
|
||||
Initial per-destination concurrency level for par-
|
||||
|
@ -20,7 +20,7 @@ and features</a> | <a href="architecture.html">Global architecture</a>
|
||||
|
||||
<h2>Postfix mail queues</h2>
|
||||
|
||||
Postfix has four different queues: <b>maildrop</b>, <b>incoming</b>,
|
||||
Postfix has four main queues: <b>maildrop</b>, <b>incoming</b>,
|
||||
<b>active</b> and <b>deferred</b> (click the upper left-hand icon
|
||||
for the big picture). Locally-posted mail is deposited into the
|
||||
<b>maildrop</b>, and is copied to the <b>incoming</b> queue after
|
||||
@ -42,6 +42,16 @@ peak message workload</i>. Whenever there is space in the
|
||||
guarantees that new mail will get through even when there is a
|
||||
large backlog.
|
||||
|
||||
<p>
|
||||
|
||||
In addition to the queues mentioned above Postfix also maintains
|
||||
two parking spaces. The <b>hold</b> queue is for mail that is frozen
|
||||
in the queue; no delivery attempts are made until someone releases
|
||||
these messages with the <a href="postsuper.1.html">postsuper</a>
|
||||
command. The <b>corrupt</b> directory is for damaged queue files.
|
||||
Rather than discarding these, Postfix leaves them here for human
|
||||
inspection.
|
||||
|
||||
<h2>No thundering herd</h2>
|
||||
|
||||
Implementing a high-performance mail system is one thing. However,
|
||||
|
@ -134,6 +134,11 @@ the originator.
|
||||
|
||||
<dt>IGNORE <dd> Delete the header from the message.
|
||||
|
||||
<dt>HOLD <dd> Place the message on the <b>hold</b> queue. Mail on
|
||||
hold can be inspected with the <a href="postcat.1.html">postcat</a>
|
||||
command, and can be destroyed or taken off hold with the <a
|
||||
href="postsuper.1.html">postsuper</a> command.
|
||||
|
||||
<dt>WARN <dd> Log (but do not reject) the header with a warning.
|
||||
|
||||
<dt>WARN text... <dd> As above, and also log the text.
|
||||
@ -211,6 +216,11 @@ the originator.
|
||||
|
||||
<dt>IGNORE <dd> Delete the matched line from the message.
|
||||
|
||||
<dt>HOLD <dd> Place the message on the <b>hold</b> queue. Mail on
|
||||
hold can be inspected with the <a href="postcat.1.html">postcat</a>
|
||||
command, and can be destroyed or taken off hold with the <a
|
||||
href="postsuper.1.html">postsuper</a> command.
|
||||
|
||||
<dt>WARN <dd> Log (but do not reject) the matched line with a warning.
|
||||
|
||||
<dt>WARN text... <dd> As above, and also log the text.
|
||||
@ -1219,7 +1229,7 @@ appear as part of a client hostname/address restriction list.
|
||||
|
||||
<dt>Default:
|
||||
|
||||
<dd><b>maps_rbl_domains = blackholes.mail-abuse.org</b>
|
||||
<dd><b>maps_rbl_domains = </b>
|
||||
|
||||
<p>
|
||||
|
||||
|
@ -45,6 +45,9 @@ manager implements exponential backoff by doubling the time between
|
||||
delivery attempts.
|
||||
.IP \fBcorrupt\fR
|
||||
Unreadable or damaged queue files are moved here for inspection.
|
||||
.IP \fBhold\fR
|
||||
Messages that are kept "on hold" are kept here until someone
|
||||
sets them free.
|
||||
.SH DELIVERY STATUS REPORTS
|
||||
.na
|
||||
.nf
|
||||
@ -185,6 +188,9 @@ Top-level directory of the Postfix queue.
|
||||
.fi
|
||||
In the text below, \fItransport\fR is the first field in a
|
||||
\fBmaster.cf\fR entry.
|
||||
.IP \fBqmgr_clog_warn_time\fR
|
||||
Minimal delay between warnings that a specific destination
|
||||
is clogging up the active queue. Specify 0 to disable.
|
||||
.IP \fBqmgr_message_active_limit\fR
|
||||
Limit the number of messages in the active queue.
|
||||
.IP \fBqmgr_message_recipient_limit\fR
|
||||
|
@ -45,6 +45,9 @@ manager implements exponential backoff by doubling the time between
|
||||
delivery attempts.
|
||||
.IP \fBcorrupt\fR
|
||||
Unreadable or damaged queue files are moved here for inspection.
|
||||
.IP \fBhold\fR
|
||||
Messages that are kept "on hold" are kept here until someone
|
||||
sets them free.
|
||||
.SH DELIVERY STATUS REPORTS
|
||||
.na
|
||||
.nf
|
||||
@ -179,6 +182,9 @@ Top-level directory of the Postfix queue.
|
||||
.SH "Active queue controls"
|
||||
.ad
|
||||
.fi
|
||||
.IP \fBqmgr_clog_warn_time\fR
|
||||
Minimal delay between warnings that a specific destination
|
||||
is clogging up the active queue. Specify 0 to disable.
|
||||
.IP \fBqmgr_message_active_limit\fR
|
||||
Limit the number of messages in the active queue.
|
||||
.IP \fBqmgr_message_recipient_limit\fR
|
||||
@ -223,15 +229,6 @@ but large mailing list delivery performance suffers. In the worst
|
||||
case, recipients near the beginning of a large list receive a burst
|
||||
of messages immediately, while recipients near the end of that list
|
||||
receive that same burst of messages a whole day later.
|
||||
.IP "\fBqmgr_site_hog_factor\fR (valid range: 10..100)"
|
||||
The percentage of delivery resources that a busy mail system will
|
||||
use up for delivery to a single site.
|
||||
With 100%, mail is delivered in first-in, first-out order, so that
|
||||
a burst of mail for one site can block mail for other destinations.
|
||||
With less than 100%, the excess mail is deferred. The deferred mail
|
||||
is delivered in little bursts, the remainder of the backlog being
|
||||
deferred again, with a lot of I/O activity happening as Postfix
|
||||
searches the deferred queue for deliverable mail.
|
||||
.IP \fBinitial_destination_concurrency\fR
|
||||
Initial per-destination concurrency level for parallel delivery
|
||||
to the same destination.
|
||||
|
@ -168,11 +168,10 @@ bounce_one_service.o: ../../include/vstream.h
|
||||
bounce_one_service.o: ../../include/vbuf.h
|
||||
bounce_one_service.o: ../../include/name_mask.h
|
||||
bounce_one_service.o: ../../include/mail_params.h
|
||||
bounce_one_service.o: ../../include/mail_queue.h
|
||||
bounce_one_service.o: ../../include/vstring.h
|
||||
bounce_one_service.o: ../../include/post_mail.h
|
||||
bounce_one_service.o: ../../include/cleanup_user.h
|
||||
bounce_one_service.o: ../../include/mail_addr.h
|
||||
bounce_one_service.o: ../../include/mail_error.h
|
||||
bounce_one_service.o: bounce_service.h
|
||||
bounce_one_service.o: ../../include/vstring.h
|
||||
bounce_one_service.o: ../../include/bounce_log.h
|
||||
|
@ -321,6 +321,7 @@ cleanup_message.o: ../../include/iostuff.h
|
||||
cleanup_message.o: ../../include/attr.h
|
||||
cleanup_message.o: ../../include/mime_state.h
|
||||
cleanup_message.o: ../../include/lex_822.h
|
||||
cleanup_message.o: ../../include/hold_message.h
|
||||
cleanup_message.o: cleanup.h
|
||||
cleanup_message.o: ../../include/maps.h
|
||||
cleanup_message.o: ../../include/dict.h
|
||||
|
@ -35,6 +35,7 @@ typedef struct CLEANUP_STATE {
|
||||
VSTRING *temp2; /* scratch buffer, local use only */
|
||||
VSTREAM *dst; /* current output stream */
|
||||
MAIL_STREAM *handle; /* mail stream handle */
|
||||
char *queue_name; /* queue name */
|
||||
char *queue_id; /* queue file basename */
|
||||
time_t time; /* posting time */
|
||||
char *fullname; /* envelope sender full name */
|
||||
|
@ -123,8 +123,12 @@ CLEANUP_STATE *cleanup_open(void)
|
||||
/*
|
||||
* Open the queue file. Save the queue file name in a global variable, so
|
||||
* that the runtime error handler can clean up in case of problems.
|
||||
*
|
||||
* XXX For now, a lot of detail is frozen that could be more useful if it
|
||||
* were made configurable.
|
||||
*/
|
||||
state->handle = mail_stream_file(MAIL_QUEUE_INCOMING,
|
||||
state->queue_name = mystrdup(MAIL_QUEUE_INCOMING);
|
||||
state->handle = mail_stream_file(state->queue_name,
|
||||
MAIL_CLASS_PUBLIC, var_queue_service, 0);
|
||||
state->dst = state->handle->stream;
|
||||
cleanup_path = mystrdup(VSTREAM_PATH(state->dst));
|
||||
@ -235,7 +239,7 @@ int cleanup_flush(CLEANUP_STATE *state)
|
||||
"cleanup", state->time,
|
||||
"%s", state->reason ? state->reason :
|
||||
cleanup_strerror(state->errs)) == 0
|
||||
&& bounce_flush(BOUNCE_FLAG_CLEAN, MAIL_QUEUE_INCOMING,
|
||||
&& bounce_flush(BOUNCE_FLAG_CLEAN, state->queue_name,
|
||||
state->queue_id,
|
||||
(encoding = nvtable_find(state->attr, MAIL_ATTR_ENCODING)) ?
|
||||
encoding : MAIL_ATTR_ENC_NONE,
|
||||
|
@ -80,6 +80,7 @@
|
||||
#include <mail_proto.h>
|
||||
#include <mime_state.h>
|
||||
#include <lex_822.h>
|
||||
#include <hold_message.h>
|
||||
|
||||
/* Application-specific. */
|
||||
|
||||
@ -313,6 +314,10 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
|
||||
if (STREQUAL(value, "IGNORE", command_len))
|
||||
return (CLEANUP_ACT_DROP);
|
||||
|
||||
if (STREQUAL(value, "HOLD", command_len)) {
|
||||
hold_message(state->queue_name, state->queue_id);
|
||||
return (CLEANUP_ACT_KEEP);
|
||||
}
|
||||
if (STREQUAL(value, "OK", command_len))
|
||||
return (CLEANUP_ACT_KEEP);
|
||||
|
||||
|
@ -60,6 +60,7 @@ CLEANUP_STATE *cleanup_state_alloc(void)
|
||||
state->temp2 = vstring_alloc(10);
|
||||
state->dst = 0;
|
||||
state->handle = 0;
|
||||
state->queue_name = 0;
|
||||
state->queue_id = 0;
|
||||
state->time = 0;
|
||||
state->fullname = 0;
|
||||
@ -115,6 +116,8 @@ void cleanup_state_free(CLEANUP_STATE *state)
|
||||
myfree(state->errors_to);
|
||||
argv_free(state->recipients);
|
||||
argv_free(state->resent_recip);
|
||||
if (state->queue_name)
|
||||
myfree(state->queue_name);
|
||||
if (state->queue_id)
|
||||
myfree(state->queue_id);
|
||||
been_here_free(state->dups);
|
||||
|
@ -187,6 +187,15 @@ static int dns_query(const char *name, int type, int flags,
|
||||
if (msg_verbose)
|
||||
msg_info("dns_query: %s (%s): OK", name, dns_strtype(type));
|
||||
|
||||
/*
|
||||
* Paranoia.
|
||||
*/
|
||||
if (len > sizeof(reply->buf)) {
|
||||
msg_warn("reply length %d > buffer length %d for name=%s type=%s",
|
||||
len, sizeof(reply->buf), name, dns_strtype(type));
|
||||
len = sizeof(reply->buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the reply structure. Some structure members are filled on
|
||||
* the fly while the reply is being parsed.
|
||||
|
@ -20,7 +20,7 @@ SRCS = been_here.c bounce.c canon_addr.c cleanup_strerror.c clnt_stream.c \
|
||||
tok822_resolve.c tok822_rewrite.c tok822_tree.c xtext.c bounce_log.c \
|
||||
flush_clnt.c mail_conf_time.c mbox_conf.c mbox_open.c abounce.c \
|
||||
verp_sender.c match_parent_style.c mime_state.c header_token.c \
|
||||
strip_addr.c virtual8_maps_find.c
|
||||
strip_addr.c virtual8_maps_find.c hold_message.c
|
||||
OBJS = been_here.o bounce.o canon_addr.o cleanup_strerror.o clnt_stream.o \
|
||||
debug_peer.o debug_process.o defer.o deliver_completed.o \
|
||||
deliver_flock.o deliver_pass.o deliver_request.o domain_list.o \
|
||||
@ -42,7 +42,7 @@ OBJS = been_here.o bounce.o canon_addr.o cleanup_strerror.o clnt_stream.o \
|
||||
tok822_resolve.o tok822_rewrite.o tok822_tree.o xtext.o bounce_log.o \
|
||||
flush_clnt.o mail_conf_time.o mbox_conf.o mbox_open.o abounce.o \
|
||||
verp_sender.o match_parent_style.o mime_state.o header_token.o \
|
||||
strip_addr.o virtual8_maps_find.o
|
||||
strip_addr.o virtual8_maps_find.o hold_message.o
|
||||
HDRS = been_here.h bounce.h canon_addr.h cleanup_user.h clnt_stream.h \
|
||||
config.h debug_peer.h debug_process.h defer.h deliver_completed.h \
|
||||
deliver_flock.h deliver_pass.h deliver_request.h domain_list.h \
|
||||
@ -60,7 +60,7 @@ HDRS = been_here.h bounce.h canon_addr.h cleanup_user.h clnt_stream.h \
|
||||
sys_exits.h timed_ipc.h tok822.h xtext.h bounce_log.h flush_clnt.h \
|
||||
mbox_conf.h mbox_open.h abounce.h qmqp_proto.h verp_sender.h \
|
||||
match_parent_style.h quote_flags.h mime_state.h header_token.h \
|
||||
lex_822.h strip_addr.h virtual8.h
|
||||
lex_822.h strip_addr.h virtual8.h hold_message.h
|
||||
TESTSRC = rec2stream.c stream2rec.c recdump.c
|
||||
WARN = -W -Wformat -Wimplicit -Wmissing-prototypes \
|
||||
-Wparentheses -Wstrict-prototypes -Wswitch -Wuninitialized \
|
||||
@ -233,7 +233,8 @@ virtual8_maps_find: $(LIB) $(LIBS)
|
||||
mv junk $@.o
|
||||
|
||||
tests: tok822_test mime_test mime_nest mime_8bit mime_dom mime_trunc \
|
||||
strip_addr_test tok822_limit_test virtual8_test
|
||||
mime_cvt mime_cvt2 mime_cvt3 strip_addr_test tok822_limit_test \
|
||||
virtual8_test
|
||||
|
||||
tok822_test: tok822_parse tok822_parse.in tok822_parse.ref
|
||||
./tok822_parse <tok822_parse.in >tok822_parse.tmp
|
||||
@ -265,6 +266,21 @@ mime_trunc: mime_state mime_trunc.in mime_trunc.ref
|
||||
diff mime_trunc.ref mime_trunc.tmp
|
||||
rm -f mime_trunc.tmp
|
||||
|
||||
mime_cvt: mime_state mime_cvt.in mime_cvt.ref
|
||||
./mime_state <mime_cvt.in >mime_cvt.tmp
|
||||
diff mime_cvt.ref mime_cvt.tmp
|
||||
rm -f mime_cvt.tmp
|
||||
|
||||
mime_cvt2: mime_state mime_cvt.in2 mime_cvt.ref2
|
||||
./mime_state <mime_cvt.in2 >mime_cvt.tmp
|
||||
diff mime_cvt.ref2 mime_cvt.tmp
|
||||
rm -f mime_cvt.tmp
|
||||
|
||||
mime_cvt3: mime_state mime_cvt.in3 mime_cvt.ref3
|
||||
./mime_state <mime_cvt.in3 >mime_cvt.tmp
|
||||
diff mime_cvt.ref3 mime_cvt.tmp
|
||||
rm -f mime_cvt.tmp
|
||||
|
||||
tok822_limit_test: tok822_parse tok822_limit.in tok822_limit.ref
|
||||
./tok822_parse <tok822_limit.in >tok822_limit.tmp
|
||||
diff tok822_limit.ref tok822_limit.tmp
|
||||
@ -512,6 +528,16 @@ header_token.o: ../../include/vstring.h
|
||||
header_token.o: ../../include/vbuf.h
|
||||
header_token.o: lex_822.h
|
||||
header_token.o: header_token.h
|
||||
hold_message.o: hold_message.c
|
||||
hold_message.o: ../../include/sys_defs.h
|
||||
hold_message.o: ../../include/msg.h
|
||||
hold_message.o: ../../include/set_eugid.h
|
||||
hold_message.o: mail_queue.h
|
||||
hold_message.o: ../../include/vstring.h
|
||||
hold_message.o: ../../include/vbuf.h
|
||||
hold_message.o: ../../include/vstream.h
|
||||
hold_message.o: mail_params.h
|
||||
hold_message.o: hold_message.h
|
||||
is_header.o: is_header.c
|
||||
is_header.o: ../../include/sys_defs.h
|
||||
is_header.o: is_header.h
|
||||
|
91
postfix/src/global/hold_message.c
Normal file
91
postfix/src/global/hold_message.c
Normal file
@ -0,0 +1,91 @@
|
||||
/*++
|
||||
/* NAME
|
||||
/* hold_message 3
|
||||
/* SUMMARY
|
||||
/* move message to hold queue
|
||||
/* SYNOPSIS
|
||||
/* #include <hold_message.h>
|
||||
/*
|
||||
/* void hold_message(queue_name, queue_id)
|
||||
/* const char *queue_name;
|
||||
/* const char *queue_id;
|
||||
/* DESCRIPTION
|
||||
/* The \fBhold_message\fR() routine moves the specified
|
||||
/* queue file to the \fBhold\fR queue, where it will sit
|
||||
/* until someone either destroys it or releases it.
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
/* System library. */
|
||||
|
||||
#include <sys_defs.h>
|
||||
#include <stdio.h> /* rename() */
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include <msg.h>
|
||||
#include <set_eugid.h>
|
||||
|
||||
/* Global library. */
|
||||
|
||||
#include <mail_queue.h>
|
||||
#include <mail_params.h>
|
||||
#include <hold_message.h>
|
||||
|
||||
#define STR(x) vstring_str(x)
|
||||
|
||||
/* hold_message - move message to hold queue */
|
||||
|
||||
void hold_message(const char *queue_name, const char *queue_id)
|
||||
{
|
||||
VSTRING *old_path = vstring_alloc(100);
|
||||
VSTRING *new_path = vstring_alloc(100);
|
||||
uid_t saved_uid;
|
||||
gid_t saved_gid;
|
||||
|
||||
/*
|
||||
* If not running as the mail system, change privileges first.
|
||||
*/
|
||||
if ((saved_uid = geteuid()) != var_owner_uid) {
|
||||
saved_gid = getegid();
|
||||
set_eugid(var_owner_uid, var_owner_gid);
|
||||
}
|
||||
|
||||
/*
|
||||
* Grr. Don't do stupid things when this function is called multiple
|
||||
* times. sane_rename() would emit a bogus warning about spurious NFS
|
||||
* problems.
|
||||
*/
|
||||
(void) mail_queue_path(old_path, queue_name, queue_id);
|
||||
(void) mail_queue_path(new_path, MAIL_QUEUE_HOLD, queue_id);
|
||||
if (access(STR(old_path), F_OK) == 0) {
|
||||
if (rename(STR(old_path), STR(new_path)) == 0
|
||||
|| access(STR(new_path), F_OK) == 0)
|
||||
msg_info("%s: placed on hold", queue_id);
|
||||
else
|
||||
msg_warn("%s: could not place message on hold: %m", queue_id);
|
||||
}
|
||||
|
||||
/*
|
||||
* Restore privileges.
|
||||
*/
|
||||
if (saved_uid != var_owner_uid)
|
||||
set_eugid(saved_uid, saved_gid);
|
||||
|
||||
/*
|
||||
* Cleanup.
|
||||
*/
|
||||
vstring_free(old_path);
|
||||
vstring_free(new_path);
|
||||
}
|
30
postfix/src/global/hold_message.h
Normal file
30
postfix/src/global/hold_message.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef _HOLD_MESSAGE_H_INCLUDED_
|
||||
#define _HOLD_MESSAGE_H_INCLUDED_
|
||||
|
||||
/*++
|
||||
/* NAME
|
||||
/* hold_message 3h
|
||||
/* SUMMARY
|
||||
/* mark queue file as corrupt
|
||||
/* SYNOPSIS
|
||||
/* #include <hold_message.h>
|
||||
/* DESCRIPTION
|
||||
/* .nf
|
||||
|
||||
/*
|
||||
* External interface.
|
||||
*/
|
||||
extern void hold_message(const char *, const char *);
|
||||
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
#endif
|
@ -7,11 +7,17 @@
|
||||
/* #include <mail_flush.h>
|
||||
/*
|
||||
/* int mail_flush_deferred()
|
||||
/*
|
||||
/* int mail_flush_maildrop()
|
||||
/* DESCRIPTION
|
||||
/* This module triggers delivery of backed up mail.
|
||||
/*
|
||||
/* mail_flush_deferred() triggers delivery of all deferred
|
||||
/* or incoming mail.
|
||||
/* or incoming mail. This function tickles the queue manager.
|
||||
/*
|
||||
/* mail_flush_maildrop() triggers delivery of all mail in
|
||||
/* the maildrop directory. This function tickles the pickup
|
||||
/* service.
|
||||
/* DIAGNOSTICS
|
||||
/* The result is 0 in case of success, -1 in case of failure.
|
||||
/* LICENSE
|
||||
@ -37,7 +43,7 @@
|
||||
#include <mail_proto.h>
|
||||
#include <mail_flush.h>
|
||||
|
||||
/* mail_flush_deferred - flush deferred queue */
|
||||
/* mail_flush_deferred - flush deferred/incoming queue */
|
||||
|
||||
int mail_flush_deferred(void)
|
||||
{
|
||||
@ -54,3 +60,16 @@ int mail_flush_deferred(void)
|
||||
return (mail_trigger(MAIL_CLASS_PUBLIC, var_queue_service,
|
||||
qmgr_trigger, sizeof(qmgr_trigger)));
|
||||
}
|
||||
|
||||
/* mail_flush_maildrop - flush maildrop queue */
|
||||
|
||||
int mail_flush_maildrop(void)
|
||||
{
|
||||
static char wakeup[] = {TRIGGER_REQ_WAKEUP};
|
||||
|
||||
/*
|
||||
* Trigger the pickup service.
|
||||
*/
|
||||
return (mail_trigger(MAIL_CLASS_PUBLIC, var_pickup_service,
|
||||
wakeup, sizeof(wakeup)));
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
/* External interface. */
|
||||
|
||||
extern int mail_flush_deferred(void);
|
||||
extern int mail_flush_maildrop(void);
|
||||
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
|
@ -542,10 +542,6 @@ extern int var_min_delivery_slots;
|
||||
#define DEF_QMGR_FUDGE 100
|
||||
extern int var_qmgr_fudge;
|
||||
|
||||
#define VAR_QMGR_HOG "qmgr_site_hog_factor"
|
||||
#define DEF_QMGR_HOG 100
|
||||
extern int var_qmgr_hog;
|
||||
|
||||
/*
|
||||
* Queue manager: default destination concurrency levels.
|
||||
*/
|
||||
@ -588,6 +584,14 @@ extern int var_transport_retry_time;
|
||||
#define DEF_DEFER_XPORTS ""
|
||||
extern char *var_defer_xports;
|
||||
|
||||
/*
|
||||
* Queue manager: how often to warn that a destination is clogging the
|
||||
* active queue.
|
||||
*/
|
||||
#define VAR_QMGR_CLOG_WARN_TIME "qmgr_clog_warn_time"
|
||||
#define DEF_QMGR_CLOG_WARN_TIME "300s"
|
||||
extern int var_qmgr_clog_warn_time;
|
||||
|
||||
/*
|
||||
* Master: default process count limit per mail subsystem.
|
||||
*/
|
||||
|
@ -133,10 +133,10 @@ static int mail_stream_finish_file(MAIL_STREAM * info, VSTRING *unused_why)
|
||||
* take effect before all the data blocks are written. Wietse claims that
|
||||
* this is not a problem. Postfix rejects incomplete queue files, even
|
||||
* when the +x attribute is set. Every Postfix queue file record has a
|
||||
* type code and a length field. Files with truncated records are
|
||||
* rejected, as are files with unknown type codes. Every Postfix queue
|
||||
* file must end with an explicit END record. Postfix queue files without
|
||||
* END record are discarded.
|
||||
* type code and a length field. Files with missing records are rejected,
|
||||
* as are files with unknown record type codes. Every Postfix queue file
|
||||
* must end with an explicit END record. Postfix queue files without END
|
||||
* record are discarded.
|
||||
*/
|
||||
if (vstream_fflush(info->stream)
|
||||
|| fchmod(vstream_fileno(info->stream), 0700 | info->mode)
|
||||
|
@ -20,7 +20,7 @@
|
||||
* Patches change the patchlevel and the release date. Snapshots change the
|
||||
* release date only, unless they include the same bugfix as a patch release.
|
||||
*/
|
||||
#define MAIL_RELEASE_DATE "20020804"
|
||||
#define MAIL_RELEASE_DATE "20020819"
|
||||
|
||||
#define VAR_MAIL_VERSION "mail_version"
|
||||
#define DEF_MAIL_VERSION "1.1.11-" MAIL_RELEASE_DATE
|
||||
|
@ -1,9 +1,9 @@
|
||||
mime_state: warning: improper use of 8-bit data in message header: Header: f??bar
|
||||
MAIN Header: f€€bar
|
||||
HEADER END
|
||||
BODY
|
||||
BODY N
|
||||
mime_state: warning: improper use of 8-bit data in message body: b?dy
|
||||
BODY bdy
|
||||
BODY N b€dy
|
||||
BODY END
|
||||
mime_state: warning: improper use of 8-bit data in message header
|
||||
mime_state: warning: improper use of 8-bit data in message body
|
||||
|
83
postfix/src/global/mime_cvt.in
Normal file
83
postfix/src/global/mime_cvt.in
Normal file
@ -0,0 +1,83 @@
|
||||
mime-version: 1.0
|
||||
content-type: text/plain
|
||||
content-transfer-encoding: 8bit
|
||||
|
||||
|
||||
x
|
||||
xx
|
||||
xxx
|
||||
xxxx
|
||||
xxxxx
|
||||
xxxxxx
|
||||
xxxxxxx
|
||||
xxxxxxxx
|
||||
xxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
83
postfix/src/global/mime_cvt.in2
Normal file
83
postfix/src/global/mime_cvt.in2
Normal file
@ -0,0 +1,83 @@
|
||||
mime-version: 1.0
|
||||
content-type: text/plain
|
||||
content-transfer-encoding: 8bit
|
||||
|
||||
|
||||
x
|
||||
xx
|
||||
xxx
|
||||
xxxx
|
||||
xxxxx
|
||||
xxxxxx
|
||||
xxxxxxx
|
||||
xxxxxxxx
|
||||
xxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
83
postfix/src/global/mime_cvt.in3
Normal file
83
postfix/src/global/mime_cvt.in3
Normal file
@ -0,0 +1,83 @@
|
||||
mime-version: 1.0
|
||||
content-type: text/plain
|
||||
content-transfer-encoding: 8bit
|
||||
|
||||
|
||||
x
|
||||
xx
|
||||
xxx
|
||||
xxxx
|
||||
xxxxx
|
||||
xxxxxx
|
||||
xxxxxxx
|
||||
xxxxxxxx
|
||||
xxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
93
postfix/src/global/mime_cvt.ref
Normal file
93
postfix/src/global/mime_cvt.ref
Normal file
@ -0,0 +1,93 @@
|
||||
MAIN mime-version: 1.0
|
||||
mime_state: header_token: text / plain
|
||||
MAIN content-type: text/plain
|
||||
mime_state: header_token: 8bit
|
||||
MAIN Content-Transfer-Encoding: quoted-printable
|
||||
HEADER END
|
||||
BODY N
|
||||
BODY N =20
|
||||
BODY N x=20
|
||||
BODY N xx=20
|
||||
BODY N xxx=20
|
||||
BODY N xxxx=20
|
||||
BODY N xxxxx=20
|
||||
BODY N xxxxxx=20
|
||||
BODY N xxxxxxx=20
|
||||
BODY N xxxxxxxx=20
|
||||
BODY N xxxxxxxxx=20
|
||||
BODY N xxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N =20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N x=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxx=20
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxxx=20
|
||||
BODY END
|
93
postfix/src/global/mime_cvt.ref2
Normal file
93
postfix/src/global/mime_cvt.ref2
Normal file
@ -0,0 +1,93 @@
|
||||
MAIN mime-version: 1.0
|
||||
mime_state: header_token: text / plain
|
||||
MAIN content-type: text/plain
|
||||
mime_state: header_token: 8bit
|
||||
MAIN Content-Transfer-Encoding: quoted-printable
|
||||
HEADER END
|
||||
BODY N
|
||||
BODY N =09
|
||||
BODY N x=09
|
||||
BODY N xx=09
|
||||
BODY N xxx=09
|
||||
BODY N xxxx=09
|
||||
BODY N xxxxx=09
|
||||
BODY N xxxxxx=09
|
||||
BODY N xxxxxxx=09
|
||||
BODY N xxxxxxxx=09
|
||||
BODY N xxxxxxxxx=09
|
||||
BODY N xxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N =09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N x=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxx=09
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxxx=09
|
||||
BODY END
|
93
postfix/src/global/mime_cvt.ref3
Normal file
93
postfix/src/global/mime_cvt.ref3
Normal file
@ -0,0 +1,93 @@
|
||||
MAIN mime-version: 1.0
|
||||
mime_state: header_token: text / plain
|
||||
MAIN content-type: text/plain
|
||||
mime_state: header_token: 8bit
|
||||
MAIN Content-Transfer-Encoding: quoted-printable
|
||||
HEADER END
|
||||
BODY N
|
||||
BODY N =01
|
||||
BODY N x=01
|
||||
BODY N xx=01
|
||||
BODY N xxx=01
|
||||
BODY N xxxx=01
|
||||
BODY N xxxxx=01
|
||||
BODY N xxxxxx=01
|
||||
BODY N xxxxxxx=01
|
||||
BODY N xxxxxxxx=01
|
||||
BODY N xxxxxxxxx=01
|
||||
BODY N xxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N =01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N x=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxx=01
|
||||
BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
|
||||
BODY N xxxxx=01
|
||||
BODY END
|
@ -3,140 +3,140 @@ mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MAIN content-type: multipart/mixed; boundary=foobar
|
||||
HEADER END
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: PUSH boundary foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
mime_state: header_token: multipart / mixed
|
||||
mime_state: header_token: boundary = foobar
|
||||
mime_state: warning: MIME nesting exceeds safety limit: content-type: multipart/mixed; boundary=foobar
|
||||
MULT content-type: multipart/mixed; boundary=foobar
|
||||
BODY
|
||||
BODY --foobar
|
||||
BODY N
|
||||
BODY N --foobar
|
||||
BODY END
|
||||
mime_state: warning: MIME nesting exceeds safety limit
|
||||
mime_state: POP boundary foobar
|
||||
|
@ -618,12 +618,12 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
|
||||
{
|
||||
static char hexchars[] = "0123456789ABCDEF";
|
||||
const unsigned char *cp;
|
||||
int ch = 0;
|
||||
int ch;
|
||||
|
||||
#define QP_ENCODE(state, ch) { \
|
||||
VSTRING_ADDCH(state->output_buffer, '='); \
|
||||
VSTRING_ADDCH(state->output_buffer, hexchars[(ch >> 4) & 0xff]); \
|
||||
VSTRING_ADDCH(state->output_buffer, hexchars[ch & 0xf]); \
|
||||
#define QP_ENCODE(buffer, ch) { \
|
||||
VSTRING_ADDCH(buffer, '='); \
|
||||
VSTRING_ADDCH(buffer, hexchars[(ch >> 4) & 0xff]); \
|
||||
VSTRING_ADDCH(buffer, hexchars[ch & 0xf]); \
|
||||
}
|
||||
|
||||
/*
|
||||
@ -634,6 +634,7 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
|
||||
/* Critical length before hard line break. */
|
||||
if (LEN(state->output_buffer) > 72) {
|
||||
VSTRING_ADDCH(state->output_buffer, '=');
|
||||
VSTRING_TERMINATE(state->output_buffer);
|
||||
state->body_out(state->app_context, REC_TYPE_NORM,
|
||||
STR(state->output_buffer),
|
||||
LEN(state->output_buffer));
|
||||
@ -642,7 +643,7 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
|
||||
/* Append the next character. */
|
||||
ch = *cp;
|
||||
if ((ch < 32 && ch != '\t') || ch == '=' || ch > 126) {
|
||||
QP_ENCODE(state, ch);
|
||||
QP_ENCODE(state->output_buffer, ch);
|
||||
} else {
|
||||
VSTRING_ADDCH(state->output_buffer, ch);
|
||||
}
|
||||
@ -654,13 +655,13 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
|
||||
* the output length will grow from 73 characters to 75 characters.
|
||||
*/
|
||||
if (rec_type == REC_TYPE_NORM) {
|
||||
if (ch == 0 && LEN(state->output_buffer) > 0)
|
||||
ch = END(state->output_buffer)[-1];
|
||||
if (ch == ' ' || ch == '\t') {
|
||||
if (LEN(state->output_buffer) > 0
|
||||
&& ((ch = END(state->output_buffer)[-1]) == ' ' || ch == '\t')) {
|
||||
vstring_truncate(state->output_buffer,
|
||||
LEN(state->output_buffer) - 1);
|
||||
QP_ENCODE(state, ch);
|
||||
QP_ENCODE(state->output_buffer, ch);
|
||||
}
|
||||
VSTRING_TERMINATE(state->output_buffer);
|
||||
state->body_out(state->app_context, REC_TYPE_NORM,
|
||||
STR(state->output_buffer),
|
||||
LEN(state->output_buffer));
|
||||
@ -1034,7 +1035,7 @@ static void body_out(void *context, int rec_type, const char *buf, int len)
|
||||
{
|
||||
VSTREAM *stream = (VSTREAM *) context;
|
||||
|
||||
vstream_fprintf(stream, "BODY\t");
|
||||
vstream_fprintf(stream, "BODY %c\t", rec_type);
|
||||
vstream_fwrite(stream, buf, len);
|
||||
if (rec_type == REC_TYPE_NORM)
|
||||
VSTREAM_PUTC('\n', stream);
|
||||
|
@ -5,13 +5,13 @@ mime_state: PUSH boundary abcd ef
|
||||
MAIN content-type: multipart/(co\m\)ment)mumble mumble; boundary = "ab\cd
|
||||
ef" mumble
|
||||
HEADER END
|
||||
BODY
|
||||
BODY abcdef prolog
|
||||
BODY
|
||||
BODY --abcd ef
|
||||
BODY N
|
||||
BODY N abcdef prolog
|
||||
BODY N
|
||||
BODY N --abcd ef
|
||||
mime_state: header_token: message / rfc822
|
||||
MULT content-type: message/rfc822; mumble
|
||||
BODY
|
||||
BODY N
|
||||
NEST subject: nested subject
|
||||
mime_state: header_token: multipart / mumble
|
||||
mime_state: header_token: boundary = pqrs
|
||||
@ -20,33 +20,33 @@ NEST content-type: multipart/mumble; boundary(comment)="pqrs"
|
||||
mime_state: header_token: base64
|
||||
NEST content-transfer-encoding: base64
|
||||
mime_state: warning: invalid message/* or multipart/* encoding domain: base64
|
||||
BODY
|
||||
BODY pqrs prolog
|
||||
BODY
|
||||
BODY --pqrs
|
||||
BODY N
|
||||
BODY N pqrs prolog
|
||||
BODY N
|
||||
BODY N --pqrs
|
||||
MULT header: pqrs part 01
|
||||
BODY
|
||||
BODY body pqrs part 01
|
||||
BODY
|
||||
BODY --pqrs
|
||||
BODY N
|
||||
BODY N body pqrs part 01
|
||||
BODY N
|
||||
BODY N --pqrs
|
||||
MULT header: pqrs part 02
|
||||
BODY
|
||||
BODY body pqrs part 02
|
||||
BODY
|
||||
BODY --bogus-boundary
|
||||
BODY header: wietse
|
||||
BODY
|
||||
BODY body asdasads
|
||||
BODY
|
||||
BODY N
|
||||
BODY N body pqrs part 02
|
||||
BODY N
|
||||
BODY N --bogus-boundary
|
||||
BODY N header: wietse
|
||||
BODY N
|
||||
BODY N body asdasads
|
||||
BODY N
|
||||
mime_state: POP boundary pqrs
|
||||
BODY --abcd ef
|
||||
BODY N --abcd ef
|
||||
MULT header: abcdef part 02
|
||||
BODY
|
||||
BODY body abcdef part 02
|
||||
BODY
|
||||
BODY N
|
||||
BODY N body abcdef part 02
|
||||
BODY N
|
||||
mime_state: POP boundary abcd ef
|
||||
BODY --abcd ef--
|
||||
BODY
|
||||
BODY epilog
|
||||
BODY N --abcd ef--
|
||||
BODY N
|
||||
BODY N epilog
|
||||
BODY END
|
||||
mime_state: warning: improper message/* or multipart/* encoding domain
|
||||
|
@ -37,6 +37,9 @@
|
||||
/* delivery attempts.
|
||||
/* .IP \fBcorrupt\fR
|
||||
/* Unreadable or damaged queue files are moved here for inspection.
|
||||
/* .IP \fBhold\fR
|
||||
/* Messages that are kept "on hold" are kept here until someone
|
||||
/* sets them free.
|
||||
/* DELIVERY STATUS REPORTS
|
||||
/* .ad
|
||||
/* .fi
|
||||
@ -161,6 +164,9 @@
|
||||
/* .fi
|
||||
/* In the text below, \fItransport\fR is the first field in a
|
||||
/* \fBmaster.cf\fR entry.
|
||||
/* .IP \fBqmgr_clog_warn_time\fR
|
||||
/* Minimal delay between warnings that a specific destination
|
||||
/* is clogging up the active queue. Specify 0 to disable.
|
||||
/* .IP \fBqmgr_message_active_limit\fR
|
||||
/* Limit the number of messages in the active queue.
|
||||
/* .IP \fBqmgr_message_recipient_limit\fR
|
||||
@ -338,6 +344,7 @@ int var_local_rcpt_lim;
|
||||
int var_proc_limit;
|
||||
bool var_verp_bounce_off;
|
||||
bool var_sender_routing;
|
||||
int var_qmgr_clog_warn_time;
|
||||
|
||||
static QMGR_SCAN *qmgr_incoming;
|
||||
static QMGR_SCAN *qmgr_deferred;
|
||||
@ -502,6 +509,15 @@ static void qmgr_pre_init(char *unused_name, char **unused_argv)
|
||||
static void qmgr_post_init(char *unused_name, char **unused_argv)
|
||||
{
|
||||
|
||||
/*
|
||||
* Sanity check.
|
||||
*/
|
||||
if (var_qmgr_rcpt_limit < var_qmgr_active_limit) {
|
||||
msg_warn("%s is smaller than %s",
|
||||
VAR_QMGR_RCPT_LIMIT, VAR_QMGR_ACT_LIMIT);
|
||||
var_qmgr_rcpt_limit = var_qmgr_active_limit;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine runs after the skeleton code has entered the chroot jail.
|
||||
* Prevent automatic process suicide after a limited number of client
|
||||
@ -539,6 +555,7 @@ int main(int argc, char **argv)
|
||||
VAR_MAX_BACKOFF_TIME, DEF_MAX_BACKOFF_TIME, &var_max_backoff_time, 1, 0,
|
||||
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 8640000,
|
||||
VAR_XPORT_RETRY_TIME, DEF_XPORT_RETRY_TIME, &var_transport_retry_time, 1, 0,
|
||||
VAR_QMGR_CLOG_WARN_TIME, DEF_QMGR_CLOG_WARN_TIME, &var_qmgr_clog_warn_time, 0, 0,
|
||||
0,
|
||||
};
|
||||
static CONFIG_INT_TABLE int_table[] = {
|
||||
|
@ -190,6 +190,7 @@ struct QMGR_QUEUE {
|
||||
QMGR_ENTRY_LIST busy; /* messages on the wire */
|
||||
QMGR_QUEUE_LIST peers; /* neighbor queues */
|
||||
char *reason; /* why unavailable */
|
||||
time_t clog_time_to_warn; /* time of last warning */
|
||||
int blocker_tag; /* tagged if blocks job list */
|
||||
};
|
||||
|
||||
|
@ -253,6 +253,9 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_PEER *peer, QMGR_MESSAGE *message)
|
||||
if (queue->window == 0)
|
||||
msg_panic("qmgr_entry_create: dead queue: %s", queue->name);
|
||||
|
||||
/*
|
||||
* Create the delivery request.
|
||||
*/
|
||||
entry = (QMGR_ENTRY *) mymalloc(sizeof(QMGR_ENTRY));
|
||||
entry->stream = 0;
|
||||
entry->message = message;
|
||||
@ -264,5 +267,61 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_PEER *peer, QMGR_MESSAGE *message)
|
||||
entry->queue = queue;
|
||||
QMGR_LIST_APPEND(queue->todo, entry, queue_peers);
|
||||
queue->todo_refcount++;
|
||||
|
||||
/*
|
||||
* Warn if a destination is falling behind while the active queue
|
||||
* contains a non-trivial amount of single-recipient email. When a
|
||||
* destination takes up more and more space in the active queue, then
|
||||
* other mail will not get through and delivery performance will suffer.
|
||||
*
|
||||
* XXX At this point in the code, the busy reference count is still less
|
||||
* than the concurrency limit (otherwise this code would not be invoked
|
||||
* in the first place) so we have to make make some awkward adjustments
|
||||
* below.
|
||||
*
|
||||
* XXX The queue length test below looks at the active queue share of an
|
||||
* individual destination. This catches the case where mail for one
|
||||
* destination is falling behind because it has to round-robin compete
|
||||
* with many other destinations. However, Postfix will also perform
|
||||
* poorly when most of the active queue is tied up by a small number of
|
||||
* concurrency limited destinations. The queue length test below detects
|
||||
* such conditions only indirectly.
|
||||
*
|
||||
* XXX This code does not detect the case that the active queue is being
|
||||
* starved because incoming mail is pounding the disk.
|
||||
*/
|
||||
if (var_qmgr_clog_warn_time > 0) {
|
||||
int queue_length = queue->todo_refcount + queue->busy_refcount;
|
||||
time_t now;
|
||||
QMGR_TRANSPORT *transport;
|
||||
double active_share;
|
||||
|
||||
if (queue_length > var_qmgr_active_limit / 5
|
||||
&& (now = event_time()) >= queue->clog_time_to_warn) {
|
||||
active_share = queue_length / (double) qmgr_message_count;
|
||||
msg_warn("mail for %s is using up %d of %d active queue entries",
|
||||
queue->name, queue_length, qmgr_message_count);
|
||||
if (active_share < 0.9)
|
||||
msg_warn("this may slow down other mail deliveries");
|
||||
transport = queue->transport;
|
||||
if (transport->dest_concurrency_limit > 0
|
||||
&& transport->dest_concurrency_limit <= queue->busy_refcount + 1)
|
||||
msg_warn("you may need to increase the main.cf %s%s from %d",
|
||||
transport->name, _DEST_CON_LIMIT,
|
||||
transport->dest_concurrency_limit);
|
||||
else if (queue->window > var_qmgr_active_limit * active_share)
|
||||
msg_warn("you may need to increase the main.cf %s from %d",
|
||||
VAR_QMGR_ACT_LIMIT, var_qmgr_active_limit);
|
||||
else if (queue->peers.next != queue->peers.prev)
|
||||
msg_warn("you may need a separate master.cf transport for %s",
|
||||
queue->name);
|
||||
else if (transport->dest_concurrency_limit / 2 > queue->busy_refcount)
|
||||
msg_warn("you may need to increase the master.cf %s process limit",
|
||||
transport->name);
|
||||
msg_warn("to turn off these warnings specify: %s = 0",
|
||||
VAR_QMGR_CLOG_WARN_TIME);
|
||||
queue->clog_time_to_warn = now + var_qmgr_clog_warn_time;
|
||||
}
|
||||
}
|
||||
return (entry);
|
||||
}
|
||||
|
@ -237,6 +237,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *site)
|
||||
QMGR_LIST_INIT(queue->todo);
|
||||
QMGR_LIST_INIT(queue->busy);
|
||||
queue->reason = 0;
|
||||
queue->clog_time_to_warn = 0;
|
||||
queue->blocker_tag = 0;
|
||||
QMGR_LIST_APPEND(transport->queue_list, queue, peers);
|
||||
htable_enter(transport->queue_byname, site, (char *) queue);
|
||||
|
@ -381,6 +381,9 @@ static int pickup_file(PICKUP_INFO *info)
|
||||
if (errno != ENOENT)
|
||||
msg_warn("open input file %s: %s", info->path, vstring_str(buf));
|
||||
vstring_free(buf);
|
||||
if (errno == EACCES)
|
||||
msg_warn("if this file was created by Postfix < 1.1, then you may have to chmod a+r %s/%s",
|
||||
var_queue_dir, info->path);
|
||||
return (errno == EACCES ? KEEP_MESSAGE_FILE : REMOVE_MESSAGE_FILE);
|
||||
}
|
||||
|
||||
|
@ -106,10 +106,16 @@ static void postcat(VSTREAM *fp, VSTRING *buffer)
|
||||
vstream_printf("defer_warn_time: %s", asctime(localtime(&time)));
|
||||
break;
|
||||
case REC_TYPE_CONT:
|
||||
vstream_printf("%s", STR(buffer));
|
||||
if (msg_verbose)
|
||||
vstream_printf("non-final line fragment: %s\n", STR(buffer));
|
||||
else
|
||||
vstream_printf("%s", STR(buffer));
|
||||
break;
|
||||
case REC_TYPE_NORM:
|
||||
vstream_printf("%s\n", STR(buffer));
|
||||
if (msg_verbose)
|
||||
vstream_printf("final line fragment: %s\n", STR(buffer));
|
||||
else
|
||||
vstream_printf("%s\n", STR(buffer));
|
||||
break;
|
||||
case REC_TYPE_MESG:
|
||||
vstream_printf("*** MESSAGE CONTENTS %s ***\n", VSTREAM_PATH(fp));
|
||||
|
@ -249,6 +249,9 @@ static void flush_queue(void)
|
||||
if (mail_flush_deferred() < 0)
|
||||
msg_fatal_status(EX_UNAVAILABLE,
|
||||
"Cannot flush mail queue - mail system is down");
|
||||
if (mail_flush_maildrop() < 0)
|
||||
msg_fatal_status(EX_UNAVAILABLE,
|
||||
"Cannot flush mail queue - mail system is down");
|
||||
}
|
||||
|
||||
/* flush_site - flush mail for site */
|
||||
|
@ -37,6 +37,9 @@
|
||||
/* delivery attempts.
|
||||
/* .IP \fBcorrupt\fR
|
||||
/* Unreadable or damaged queue files are moved here for inspection.
|
||||
/* .IP \fBhold\fR
|
||||
/* Messages that are kept "on hold" are kept here until someone
|
||||
/* sets them free.
|
||||
/* DELIVERY STATUS REPORTS
|
||||
/* .ad
|
||||
/* .fi
|
||||
@ -155,6 +158,9 @@
|
||||
/* .SH "Active queue controls"
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* .IP \fBqmgr_clog_warn_time\fR
|
||||
/* Minimal delay between warnings that a specific destination
|
||||
/* is clogging up the active queue. Specify 0 to disable.
|
||||
/* .IP \fBqmgr_message_active_limit\fR
|
||||
/* Limit the number of messages in the active queue.
|
||||
/* .IP \fBqmgr_message_recipient_limit\fR
|
||||
@ -199,15 +205,6 @@
|
||||
/* case, recipients near the beginning of a large list receive a burst
|
||||
/* of messages immediately, while recipients near the end of that list
|
||||
/* receive that same burst of messages a whole day later.
|
||||
/* .IP "\fBqmgr_site_hog_factor\fR (valid range: 10..100)"
|
||||
/* The percentage of delivery resources that a busy mail system will
|
||||
/* use up for delivery to a single site.
|
||||
/* With 100%, mail is delivered in first-in, first-out order, so that
|
||||
/* a burst of mail for one site can block mail for other destinations.
|
||||
/* With less than 100%, the excess mail is deferred. The deferred mail
|
||||
/* is delivered in little bursts, the remainder of the backlog being
|
||||
/* deferred again, with a lot of I/O activity happening as Postfix
|
||||
/* searches the deferred queue for deliverable mail.
|
||||
/* .IP \fBinitial_destination_concurrency\fR
|
||||
/* Initial per-destination concurrency level for parallel delivery
|
||||
/* to the same destination.
|
||||
@ -291,12 +288,12 @@ char *var_virtual_maps;
|
||||
char *var_defer_xports;
|
||||
bool var_allow_min_user;
|
||||
int var_qmgr_fudge;
|
||||
int var_qmgr_hog;
|
||||
int var_local_rcpt_lim; /* XXX */
|
||||
int var_local_con_lim; /* XXX */
|
||||
int var_proc_limit;
|
||||
bool var_verp_bounce_off;
|
||||
bool var_sender_routing;
|
||||
int var_qmgr_clog_warn_time;
|
||||
|
||||
static QMGR_SCAN *qmgr_incoming;
|
||||
static QMGR_SCAN *qmgr_deferred;
|
||||
@ -464,6 +461,15 @@ static void qmgr_pre_init(char *unused_name, char **unused_argv)
|
||||
static void qmgr_post_init(char *unused_name, char **unused_argv)
|
||||
{
|
||||
|
||||
/*
|
||||
* Sanity check.
|
||||
*/
|
||||
if (var_qmgr_rcpt_limit < var_qmgr_active_limit) {
|
||||
msg_warn("%s is smaller than %s",
|
||||
VAR_QMGR_RCPT_LIMIT, VAR_QMGR_ACT_LIMIT);
|
||||
var_qmgr_rcpt_limit = var_qmgr_active_limit;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine runs after the skeleton code has entered the chroot jail.
|
||||
* Prevent automatic process suicide after a limited number of client
|
||||
@ -501,6 +507,7 @@ int main(int argc, char **argv)
|
||||
VAR_MAX_BACKOFF_TIME, DEF_MAX_BACKOFF_TIME, &var_max_backoff_time, 1, 0,
|
||||
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 8640000,
|
||||
VAR_XPORT_RETRY_TIME, DEF_XPORT_RETRY_TIME, &var_transport_retry_time, 1, 0,
|
||||
VAR_QMGR_CLOG_WARN_TIME, DEF_QMGR_CLOG_WARN_TIME, &var_qmgr_clog_warn_time, 0, 0,
|
||||
0,
|
||||
};
|
||||
static CONFIG_INT_TABLE int_table[] = {
|
||||
@ -510,7 +517,6 @@ int main(int argc, char **argv)
|
||||
VAR_DEST_CON_LIMIT, DEF_DEST_CON_LIMIT, &var_dest_con_limit, 0, 0,
|
||||
VAR_DEST_RCPT_LIMIT, DEF_DEST_RCPT_LIMIT, &var_dest_rcpt_limit, 0, 0,
|
||||
VAR_QMGR_FUDGE, DEF_QMGR_FUDGE, &var_qmgr_fudge, 10, 100,
|
||||
VAR_QMGR_HOG, DEF_QMGR_HOG, &var_qmgr_hog, 10, 100,
|
||||
VAR_LOCAL_RCPT_LIMIT, DEF_LOCAL_RCPT_LIMIT, &var_local_rcpt_lim, 0, 0,
|
||||
VAR_LOCAL_CON_LIMIT, DEF_LOCAL_CON_LIMIT, &var_local_con_lim, 0, 0,
|
||||
VAR_PROC_LIMIT, DEF_PROC_LIMIT, &var_proc_limit, 1, 0,
|
||||
|
@ -154,6 +154,7 @@ struct QMGR_QUEUE {
|
||||
QMGR_ENTRY_LIST busy; /* messages on the wire */
|
||||
QMGR_QUEUE_LIST peers; /* neighbor queues */
|
||||
char *reason; /* why unavailable */
|
||||
time_t clog_time_to_warn; /* time of next warning */
|
||||
};
|
||||
|
||||
#define QMGR_QUEUE_TODO 1 /* waiting for service */
|
||||
|
@ -195,6 +195,9 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_QUEUE *queue, QMGR_MESSAGE *message)
|
||||
if (queue->window == 0)
|
||||
msg_panic("qmgr_entry_create: dead queue: %s", queue->name);
|
||||
|
||||
/*
|
||||
* Create the delivery request.
|
||||
*/
|
||||
entry = (QMGR_ENTRY *) mymalloc(sizeof(QMGR_ENTRY));
|
||||
entry->stream = 0;
|
||||
entry->message = message;
|
||||
@ -203,5 +206,61 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_QUEUE *queue, QMGR_MESSAGE *message)
|
||||
entry->queue = queue;
|
||||
QMGR_LIST_APPEND(queue->todo, entry);
|
||||
queue->todo_refcount++;
|
||||
|
||||
/*
|
||||
* Warn if a destination is falling behind while the active queue
|
||||
* contains a non-trivial amount of single-recipient email. When a
|
||||
* destination takes up more and more space in the active queue, then
|
||||
* other mail will not get through and delivery performance will suffer.
|
||||
*
|
||||
* XXX At this point in the code, the busy reference count is still less
|
||||
* than the concurrency limit (otherwise this code would not be invoked
|
||||
* in the first place) so we have to make make some awkward adjustments
|
||||
* below.
|
||||
*
|
||||
* XXX The queue length test below looks at the active queue share of an
|
||||
* individual destination. This catches the case where mail for one
|
||||
* destination is falling behind because it has to round-robin compete
|
||||
* with many other destinations. However, Postfix will also perform
|
||||
* poorly when most of the active queue is tied up by a small number of
|
||||
* concurrency limited destinations. The queue length test below detects
|
||||
* such conditions only indirectly.
|
||||
*
|
||||
* XXX This code does not detect the case that the active queue is being
|
||||
* starved because incoming mail is pounding the disk.
|
||||
*/
|
||||
if (var_qmgr_clog_warn_time > 0) {
|
||||
int queue_length = queue->todo_refcount + queue->busy_refcount;
|
||||
time_t now;
|
||||
QMGR_TRANSPORT *transport;
|
||||
double active_share;
|
||||
|
||||
if (queue_length > var_qmgr_active_limit / 5
|
||||
&& (now = event_time()) >= queue->clog_time_to_warn) {
|
||||
active_share = queue_length / (double) qmgr_message_count;
|
||||
msg_warn("mail for %s is using up %d of %d active queue entries",
|
||||
queue->name, queue_length, qmgr_message_count);
|
||||
if (active_share < 0.9)
|
||||
msg_warn("this may slow down other mail deliveries");
|
||||
transport = queue->transport;
|
||||
if (transport->dest_concurrency_limit > 0
|
||||
&& transport->dest_concurrency_limit <= queue->busy_refcount + 1)
|
||||
msg_warn("you may need to increase the main.cf %s%s from %d",
|
||||
transport->name, _DEST_CON_LIMIT,
|
||||
transport->dest_concurrency_limit);
|
||||
else if (queue->window > var_qmgr_active_limit * active_share)
|
||||
msg_warn("you may need to increase the main.cf %s from %d",
|
||||
VAR_QMGR_ACT_LIMIT, var_qmgr_active_limit);
|
||||
else if (queue->peers.next != queue->peers.prev)
|
||||
msg_warn("you may need a separate master.cf transport for %s",
|
||||
queue->name);
|
||||
else if (transport->dest_concurrency_limit / 2 > queue->busy_refcount)
|
||||
msg_warn("you may need to increase the master.cf %s process limit",
|
||||
transport->name);
|
||||
msg_warn("to turn off these warnings specify: %s = 0",
|
||||
VAR_QMGR_CLOG_WARN_TIME);
|
||||
queue->clog_time_to_warn = now + var_qmgr_clog_warn_time;
|
||||
}
|
||||
}
|
||||
return (entry);
|
||||
}
|
||||
|
@ -722,23 +722,6 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* This queue is a hog. Defer this recipient until the queue drains.
|
||||
* When a site accumulates a large backlog, Postfix will deliver a
|
||||
* little chunk and hammer the disk as it defers the remainder of the
|
||||
* backlog and searches the deferred queue for deliverable mail.
|
||||
*/
|
||||
if (var_qmgr_hog < 100) {
|
||||
if (queue->todo_refcount + queue->busy_refcount
|
||||
> (var_qmgr_hog / 100.0)
|
||||
* (qmgr_recipient_count > 0.8 * var_qmgr_rcpt_limit ?
|
||||
qmgr_message_count : var_qmgr_active_limit)) {
|
||||
qmgr_defer_recipient(message, recipient->address,
|
||||
"site destination queue overflow");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This queue is alive. Bind this recipient to this queue instance.
|
||||
*/
|
||||
|
@ -260,6 +260,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *site)
|
||||
QMGR_LIST_INIT(queue->todo);
|
||||
QMGR_LIST_INIT(queue->busy);
|
||||
queue->reason = 0;
|
||||
queue->clog_time_to_warn = 0;
|
||||
QMGR_LIST_PREPEND(transport->queue_list, queue);
|
||||
htable_enter(transport->queue_byname, site, (char *) queue);
|
||||
return (queue);
|
||||
|
@ -305,7 +305,8 @@ static void smtp_text_out(void *context, int rec_type,
|
||||
data_left = len;
|
||||
data_start = text;
|
||||
do {
|
||||
if (state->space_left == var_smtp_line_limit && *data_start == '.')
|
||||
if (state->space_left == var_smtp_line_limit
|
||||
&& data_left > 0 && *data_start == '.')
|
||||
smtp_fputc('.', session->stream);
|
||||
if (var_smtp_line_limit > 0 && data_left >= state->space_left) {
|
||||
smtp_fputs(data_start, state->space_left, session->stream);
|
||||
|
@ -197,6 +197,7 @@ smtpd_check.o: ../../include/maps.h
|
||||
smtpd_check.o: ../../include/mail_addr_find.h
|
||||
smtpd_check.o: ../../include/match_parent_style.h
|
||||
smtpd_check.o: ../../include/strip_addr.h
|
||||
smtpd_check.o: ../../include/virtual8.h
|
||||
smtpd_check.o: smtpd.h
|
||||
smtpd_check.o: ../../include/mail_stream.h
|
||||
smtpd_check.o: smtpd_sasl_glue.h
|
||||
|
@ -727,7 +727,7 @@ static const char *check_maps_find(SMTPD_STATE *state, const char *reply_name,
|
||||
/* checkv8_maps_find - reject with temporary failure if dict lookup fails */
|
||||
|
||||
static const char *checkv8_maps_find(SMTPD_STATE *state, const char *reply_name,
|
||||
MAPS *maps, const char *key)
|
||||
MAPS *maps, const char *key)
|
||||
{
|
||||
const char *result;
|
||||
|
||||
@ -767,12 +767,11 @@ static int resolve_final(SMTPD_STATE *state, const char *reply_name,
|
||||
msg_warn("list domain %s in only one of $%s and $%s",
|
||||
domain, VAR_MYDEST, VAR_VIRTUAL_MAPS);
|
||||
if (*var_virt_mailbox_maps
|
||||
&& checkv8_maps_find(state, reply_name, virt_mailbox_maps, domain))
|
||||
&& checkv8_maps_find(state, reply_name, virt_mailbox_maps, domain))
|
||||
msg_warn("list domain %s in only one of $%s and $%s",
|
||||
domain, VAR_MYDEST, VAR_VIRT_MAILBOX_MAPS);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* If Postfix-style virtual domain. */
|
||||
if (*var_virtual_maps
|
||||
&& check_maps_find(state, reply_name, virtual_maps, domain, 0))
|
||||
@ -1966,8 +1965,8 @@ static int reject_sender_login_mismatch(SMTPD_STATE *state, const char *sender)
|
||||
* the sender address.
|
||||
*/
|
||||
reply = (const RESOLVE_REPLY *) ctable_locate(smtpd_resolve_cache, sender);
|
||||
owner = check_maps_find(state, sender, smtpd_sender_login_maps,
|
||||
STR(reply->recipient), 0);
|
||||
owner = check_mail_addr_find(state, sender, smtpd_sender_login_maps,
|
||||
STR(reply->recipient), (char **) 0);
|
||||
#ifdef USE_SASL_AUTH
|
||||
if (var_smtpd_sasl_enable && state->sasl_username != 0)
|
||||
login = state->sasl_username;
|
||||
@ -2061,8 +2060,8 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
|
||||
cpp[1], PERMIT_ALL);
|
||||
} else if (strcasecmp(name, DEFER_ALL) == 0) {
|
||||
status = smtpd_check_reject(state, MAIL_ERROR_POLICY,
|
||||
"%d <%s>: %s rejected: Try again later",
|
||||
var_defer_code, reply_name, reply_class);
|
||||
"%d <%s>: %s rejected: Try again later",
|
||||
var_defer_code, reply_name, reply_class);
|
||||
if (cpp[1] != 0 && state->warn_if_reject == 0)
|
||||
msg_warn("restriction `%s' after `%s' is ignored",
|
||||
cpp[1], DEFER_ALL);
|
||||
@ -2120,7 +2119,7 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
|
||||
}
|
||||
} else if (strcasecmp(name, PERMIT_NAKED_IP_ADDR) == 0) {
|
||||
msg_warn("restriction %s is deprecated. Use %s instead",
|
||||
PERMIT_NAKED_IP_ADDR, PERMIT_MYNETWORKS);
|
||||
PERMIT_NAKED_IP_ADDR, PERMIT_MYNETWORKS);
|
||||
if (state->helo_name) {
|
||||
if (state->helo_name[strspn(state->helo_name, "0123456789.")] == 0
|
||||
&& (status = reject_invalid_hostaddr(state, state->helo_name,
|
||||
|
@ -118,6 +118,7 @@ smtp-sink.o: ../../include/iostuff.h
|
||||
smtp-sink.o: ../../include/events.h
|
||||
smtp-sink.o: ../../include/mymalloc.h
|
||||
smtp-sink.o: ../../include/msg_vstream.h
|
||||
smtp-sink.o: ../../include/stringops.h
|
||||
smtp-sink.o: ../../include/smtp_stream.h
|
||||
smtp-source.o: smtp-source.c
|
||||
smtp-source.o: ../../include/sys_defs.h
|
||||
|
@ -22,8 +22,13 @@
|
||||
/* .IP \fB-c\fR
|
||||
/* Display a running counter that is updated whenever an SMTP
|
||||
/* QUIT command is executed.
|
||||
/* .IP \fB-e\fR
|
||||
/* Disable ESMTP support.
|
||||
/* .IP \fB-h\fI hostname\fR
|
||||
/* Use \fIhostname\fR in the SMTP greeting, in the HELO response,
|
||||
/* and in the EHLO response. The default hostname is "smtp-sink".
|
||||
/* .IP \fB-L\fR
|
||||
/* Speak LMTP rather than SMTP.
|
||||
/* Enable LMTP rather than SMTP.
|
||||
/* .IP "\fB-n \fIcount\fR"
|
||||
/* Terminate after \fIcount\fR sessions. This is for testing purposes.
|
||||
/* .IP \fB-p\fR
|
||||
@ -31,10 +36,18 @@
|
||||
/* .IP \fB-P\fR
|
||||
/* Change the server greeting so that it appears to come through
|
||||
/* a CISCO PIX system.
|
||||
/* .IP "\fB-s \fIcommand,command,...\fR"
|
||||
/* Log the named commands to syslogd.
|
||||
/* Examples of commands that can be logged are HELO, EHLO, LHLO, MAIL,
|
||||
/* RCPT, VRFY, RSET, NOOP, and QUIT. Separate command names by white
|
||||
/* space or commas, and use quotes to protect white space from the
|
||||
/* shell. Command names are case-insensitive.
|
||||
/* .IP \fB-v\fR
|
||||
/* Show the SMTP conversations.
|
||||
/* .IP "\fB-w \fIdelay\fR"
|
||||
/* Wait \fIdelay\fR seconds before responding to a DATA command.
|
||||
/* .IP \fB-8\fR
|
||||
/* Disable 8BITMIME support.
|
||||
/* .IP [\fBinet:\fR][\fIhost\fR]:\fIport\fR
|
||||
/* Listen on network interface \fIhost\fR (default: any interface)
|
||||
/* TCP port \fIport\fR. Both \fIhost\fR and \fIport\fR may be
|
||||
@ -66,6 +79,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <syslog.h>
|
||||
|
||||
#ifdef STRCASECMP_IN_STRINGS_H
|
||||
#include <strings.h>
|
||||
@ -83,6 +97,7 @@
|
||||
#include <mymalloc.h>
|
||||
#include <iostuff.h>
|
||||
#include <msg_vstream.h>
|
||||
#include <stringops.h>
|
||||
|
||||
/* Global library. */
|
||||
|
||||
@ -115,7 +130,9 @@ static int count;
|
||||
static int counter;
|
||||
static int max_count;
|
||||
static int disable_pipelining;
|
||||
static int disable_8bitmime;
|
||||
static int fixed_delay;
|
||||
static int disable_esmtp;
|
||||
static int enable_lmtp;
|
||||
static int pretend_pix;
|
||||
|
||||
@ -126,7 +143,16 @@ static void ehlo_response(SINK_STATE *state)
|
||||
smtp_printf(state->stream, "250-%s", var_myhostname);
|
||||
if (!disable_pipelining)
|
||||
smtp_printf(state->stream, "250-PIPELINING");
|
||||
smtp_printf(state->stream, "250 8BITMIME");
|
||||
if (!disable_8bitmime)
|
||||
smtp_printf(state->stream, "250-8BITMIME");
|
||||
smtp_printf(state->stream, "250 ");
|
||||
}
|
||||
|
||||
/* helo_response - respond to HELO command */
|
||||
|
||||
static void helo_response(SINK_STATE *state)
|
||||
{
|
||||
smtp_printf(state->stream, "250 %s", var_myhostname);
|
||||
}
|
||||
|
||||
/* ok_response - send 250 OK */
|
||||
@ -261,22 +287,54 @@ static int data_read(SINK_STATE *state)
|
||||
typedef struct SINK_COMMAND {
|
||||
char *name;
|
||||
void (*response) (SINK_STATE *);
|
||||
int flags;
|
||||
} SINK_COMMAND;
|
||||
|
||||
#define FLAG_ENABLE (1<<0) /* command is enabled */
|
||||
#define FLAG_SYSLOG (1<<1) /* log the command */
|
||||
|
||||
static SINK_COMMAND command_table[] = {
|
||||
"helo", ok_response,
|
||||
"ehlo", ehlo_response,
|
||||
"lhlo", ehlo_response,
|
||||
"mail", mail_response,
|
||||
"rcpt", rcpt_response,
|
||||
"data", data_response,
|
||||
"rset", ok_response,
|
||||
"noop", ok_response,
|
||||
"vrfy", ok_response,
|
||||
"quit", quit_response,
|
||||
"helo", helo_response, 0,
|
||||
"ehlo", ehlo_response, 0,
|
||||
"lhlo", ehlo_response, 0,
|
||||
"mail", mail_response, FLAG_ENABLE,
|
||||
"rcpt", rcpt_response, FLAG_ENABLE,
|
||||
"data", data_response, FLAG_ENABLE,
|
||||
"rset", ok_response, FLAG_ENABLE,
|
||||
"noop", ok_response, FLAG_ENABLE,
|
||||
"vrfy", ok_response, FLAG_ENABLE,
|
||||
"quit", quit_response, FLAG_ENABLE,
|
||||
0,
|
||||
};
|
||||
|
||||
/* set_cmd_flags - set per-command command flags */
|
||||
|
||||
static void set_cmd_flags(const char *cmd, int flags)
|
||||
{
|
||||
SINK_COMMAND *cmdp;
|
||||
|
||||
for (cmdp = command_table; cmdp->name != 0; cmdp++)
|
||||
if (strcasecmp(cmd, cmdp->name) == 0)
|
||||
break;
|
||||
if (cmdp->name == 0)
|
||||
msg_fatal("unknown command: %s", cmd);
|
||||
cmdp->flags |= flags;
|
||||
}
|
||||
|
||||
/* set_cmds_flags - set per-command flags for multiple commands */
|
||||
|
||||
static void set_cmds_flags(const char *cmds, int flags)
|
||||
{
|
||||
char *saved_cmds;
|
||||
char *cp;
|
||||
char *cmd;
|
||||
|
||||
saved_cmds = cp = mystrdup(cmds);
|
||||
while ((cmd = mystrtok(&cp, " \t\r\n,")) != 0)
|
||||
set_cmd_flags(cmd, flags);
|
||||
myfree(saved_cmds);
|
||||
}
|
||||
|
||||
/* command_read - talk the SMTP protocol, server side */
|
||||
|
||||
static int command_read(SINK_STATE *state)
|
||||
@ -294,6 +352,7 @@ static int command_read(SINK_STATE *state)
|
||||
ST_CR, '\n', ST_CR_LF,
|
||||
};
|
||||
struct cmd_trans *cp;
|
||||
char *ptr;
|
||||
|
||||
/*
|
||||
* A read may result in EOF, but is never supposed to time out - a time
|
||||
@ -331,6 +390,12 @@ static int command_read(SINK_STATE *state)
|
||||
/*
|
||||
* We must avoid blocking I/O, so get out of here as soon as both the
|
||||
* VSTREAM and kernel read buffers dry up.
|
||||
*
|
||||
* XXX Solaris non-blocking read() may fail on a socket when ioctl
|
||||
* FIONREAD reports there is unread data. Diagnosis by Max Pashkov.
|
||||
* As a workaround we use readable() (which uses poll or select())
|
||||
* instead of peek_fd() (which uses ioctl FIONREAD). Workaround added
|
||||
* 20020604.
|
||||
*/
|
||||
if (vstream_peek(state->stream) <= 0
|
||||
&& readable(vstream_fileno(state->stream)) <= 0)
|
||||
@ -350,7 +415,8 @@ static int command_read(SINK_STATE *state)
|
||||
/*
|
||||
* Got a complete command line. Parse it.
|
||||
*/
|
||||
if ((command = strtok(vstring_str(state->buffer), " \t")) == 0) {
|
||||
ptr = vstring_str(state->buffer);
|
||||
if ((command = mystrtok(&ptr, " \t")) == 0) {
|
||||
smtp_printf(state->stream, "500 Error: unknown command");
|
||||
return (0);
|
||||
}
|
||||
@ -359,10 +425,13 @@ static int command_read(SINK_STATE *state)
|
||||
for (cmdp = command_table; cmdp->name != 0; cmdp++)
|
||||
if (strcasecmp(command, cmdp->name) == 0)
|
||||
break;
|
||||
if (cmdp->name == 0) {
|
||||
if (cmdp->name == 0 || (cmdp->flags & FLAG_ENABLE) == 0) {
|
||||
smtp_printf(state->stream, "500 Error: unknown command");
|
||||
return (0);
|
||||
}
|
||||
/* We use raw syslog. Sanitize data content and length. */
|
||||
if (cmdp->flags & FLAG_SYSLOG)
|
||||
syslog(LOG_INFO, "%s %.100s", command, printable(ptr, '?'));
|
||||
if (cmdp->response == data_response && fixed_delay > 0) {
|
||||
event_request_timer(data_event, (char *) state, fixed_delay);
|
||||
} else {
|
||||
@ -413,7 +482,7 @@ static void disconnect(SINK_STATE *state)
|
||||
vstream_fclose(state->stream);
|
||||
vstring_free(state->buffer);
|
||||
myfree((char *) state);
|
||||
if (max_count > 0 && counter >= max_count)
|
||||
if (max_count > 0 && ++counter >= max_count)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -447,10 +516,12 @@ static void connect_event(int unused_event, char *context)
|
||||
state->read = command_read;
|
||||
state->data_state = ST_ANY;
|
||||
smtp_timeout_setup(state->stream, var_tmout);
|
||||
if (pretend_pix)
|
||||
smtp_printf(state->stream, "220 ********");
|
||||
else
|
||||
smtp_printf(state->stream, "220 %s ESMTP", var_myhostname);
|
||||
if (pretend_pix)
|
||||
smtp_printf(state->stream, "220 ********");
|
||||
else if (disable_esmtp)
|
||||
smtp_printf(state->stream, "220 %s", var_myhostname);
|
||||
else
|
||||
smtp_printf(state->stream, "220 %s ESMTP", var_myhostname);
|
||||
event_enable_read(fd, read_event, (char *) state);
|
||||
}
|
||||
}
|
||||
@ -459,7 +530,7 @@ else
|
||||
|
||||
static void usage(char *myname)
|
||||
{
|
||||
msg_fatal("usage: %s [-cLpPv] [-n count] [-w delay] [host]:port backlog", myname);
|
||||
msg_fatal("usage: %s [-ceLpPv8] [-h hostname] [-n count] [-s commands] [-w delay] [host]:port backlog", myname);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
@ -476,11 +547,17 @@ int main(int argc, char **argv)
|
||||
/*
|
||||
* Parse JCL.
|
||||
*/
|
||||
while ((ch = GETOPT(argc, argv, "cLn:pPvw:")) > 0) {
|
||||
while ((ch = GETOPT(argc, argv, "ceh:Ln:pPs:vw:8")) > 0) {
|
||||
switch (ch) {
|
||||
case 'c':
|
||||
count++;
|
||||
break;
|
||||
case 'e':
|
||||
disable_esmtp = 1;
|
||||
break;
|
||||
case 'h':
|
||||
var_myhostname = optarg;
|
||||
break;
|
||||
case 'L':
|
||||
enable_lmtp = 1;
|
||||
break;
|
||||
@ -491,7 +568,11 @@ int main(int argc, char **argv)
|
||||
disable_pipelining = 1;
|
||||
break;
|
||||
case 'P':
|
||||
pretend_pix=1;
|
||||
pretend_pix = 1;
|
||||
break;
|
||||
case 's':
|
||||
openlog(basename(argv[0]), LOG_PID, LOG_MAIL);
|
||||
set_cmds_flags(optarg, FLAG_SYSLOG);
|
||||
break;
|
||||
case 'v':
|
||||
msg_verbose++;
|
||||
@ -500,6 +581,9 @@ int main(int argc, char **argv)
|
||||
if ((fixed_delay = atoi(optarg)) <= 0)
|
||||
usage(argv[0]);
|
||||
break;
|
||||
case '8':
|
||||
disable_8bitmime = 1;
|
||||
break;
|
||||
default:
|
||||
usage(argv[0]);
|
||||
}
|
||||
@ -512,7 +596,11 @@ int main(int argc, char **argv)
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
var_myhostname = "smtp-sink";
|
||||
if (var_myhostname == 0)
|
||||
var_myhostname = "smtp-sink";
|
||||
set_cmds_flags(enable_lmtp ? "lhlo" :
|
||||
disable_esmtp ? "helo" :
|
||||
"helo, ehlo", FLAG_ENABLE);
|
||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||
sock = unix_listen(argv[optind] + 5, backlog, BLOCKING);
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user