Feature: "FILTER transport:nexthop" is now also available
in SMTPD access tables.
+20020826
+
+ Workaround: HP-UX 11 accept() fails with ENOBUFS when the
+ client disconnects early. File: sane_accept.c.
+
20020901
Cleanup: postfix-install no longer installs all the manual
of input. Problem fix by Christian Kratzer, cksoft.de.
File: auxiliary/rmail/rmail.
+ Feature: specify "maximal_queue_lifetime = 0" for mail that
+ should be returned immediately after the first unsuccessful
+ delivery attempt. Files: qmgr/qmgr.c, nqmgr/nqmgr.c.
+
20020904
Bugfix: qmail compatibility: qmqpd should support any
date. Snapshots change only the release date, unless they include
the same bugfixes as a patch release.
-Major changes with Postfix snapshot 1.1.11-20020XXX
+Incompatible changes with Postfix snapshot 1.1.11-20020906
+==========================================================
+
+The permit_mx_backup restriction is made more strict. With older
+versions, some DNS failures would cause mail to be accepted anyway,
+and some DNS failures would cause mail to be rejected by later
+restrictions in the same restriction list. The improved version
+will defer delivery when Postfix could make the wrong decision.
+
+Major changes with Postfix snapshot 1.1.11-20020906
===================================================
More sophisticated handling of UCE-related DNS lookup errors.
will not have to be deferred after all. This affects the following
restrictions:
-- permit_mx_backup (defer the request if a subsequent restriction
-would cause the request to be rejected, accept the request if a
-subsequent restriction would cause the request to be accepted
-anyway);
-
-- reject_unknown_hostname, reject_unknown_sender_domain and
-reject_unknown_recipient_domain (defer the request if a subsequent
-restriction would cause the request to be accepted, reject the
+- After DNS lookup failure, permit_mx_backup will now accept the
request if a subsequent restriction would cause the request to be
-rejected anyway).
+accepted anyway, and will defer the request if a subsequent
+restriction would cause the request to be rejected.
+
+- After DNS lookup failure, reject_unknown_hostname (the hostname
+given in HELO/EHLO commands) reject_unknown_sender_domain and
+reject_unknown_recipient_domain will now reject the request if a
+subsequent restriction would cause the request to be rejected
+anyway, and will defer the request if a subsequent restriction
+would cause the request to be accepted.
Specify "smtpd_data_restrictions = reject_unauth_pipelining" to
block mail from SMTP clients that send message content before
-Postfix has replied to the DATA command.
+Postfix has replied to the SMTP DATA command.
Incompatible changes with Postfix snapshot 1.1.11-20020819
==========================================================
}
test -f $config_directory/postfix-files || {
- $0: Error: $config_directory/postfix-files is not a file. 1>&2
+ echo $0: Error: $config_directory/postfix-files is not a file. 1>&2
exit 1
}
# Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
# The default time unit is d (days).
#
+# Specify 0 when mail delivery should be tried only once.
+#
maximal_queue_lifetime = 5d
# The minimal_backoff_time parameter specifies the minimal time
<dt> <b>maximal_queue_lifetime</b> (default: 5 days) <dd> How
long a message stays in the queue before it is sent back as
-undeliverable.
+undeliverable. Specify 0 for mail that should be returned
+immediately after the first unsuccessful delivery attempt.
<p>
0,
};
static CONFIG_TIME_TABLE time_table[] = {
- VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 8640000,
+ VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 0, 8640000,
VAR_DELAY_WARN_TIME, DEF_DELAY_WARN_TIME, &var_delay_warn_time, 0, 0,
0,
};
* 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 "20020905"
+#define MAIL_RELEASE_DATE "20020906"
#define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "1.1.11-" MAIL_RELEASE_DATE
#include <quote_822_local.h>
#include <match_parent_style.h>
#include <lex_822.h>
+#include <verp_sender.h>
/* Single-threaded server skeleton. */
char *end_prefix;
char *end_origin;
int verp_requested;
- static char verp_chars[] = "-=";
+ static char verp_delims[] = "-=";
/*
* If the sender address looks like prefix@origin-@[], then request
&& --end_prefix < end_origin - 2 /* non-null origin */
&& end_prefix > STR(state->buf)); /* non-null prefix */
if (verp_requested) {
- verp_chars[0] = end_prefix[0];
+ verp_delims[0] = end_prefix[0];
+ if (verp_delims_verify(verp_delims) != 0) {
+ state->err |= CLEANUP_STAT_CONT; /* XXX */
+ vstring_sprintf(state->why_rejected, "Invalid VERP delimiters: \"%s\". Need two characters from \"%s\"",
+ verp_delims, var_verp_filter);
+ }
memmove(end_prefix, end_prefix + 1, end_origin - end_prefix - 1);
vstring_truncate(state->buf, end_origin - STR(state->buf) - 1);
}
state->err = CLEANUP_STAT_WRITE;
if (verp_requested)
if (state->err == CLEANUP_STAT_OK
- && rec_put(state->cleanup, REC_TYPE_VERP, verp_chars, 2) < 0)
+ && rec_put(state->cleanup, REC_TYPE_VERP, verp_delims, 2) < 0)
state->err = CLEANUP_STAT_WRITE;
state->sender = mystrndup(STR(state->buf), LEN(state->buf));
}
* Start the message content segment, prepend our own Received: header,
* and write the message content.
*/
- qmqpd_write_content(state);
+ if (state->err == 0)
+ qmqpd_write_content(state);
/*
* Close the queue file.
if (strchr(name, ':') != 0) {
if (def_acl == NO_DEF_ACL) {
- msg_warn("specify one of (%s, %s, %s, %s, %s) before restriction \"%s\"",
+ msg_warn("specify one of (%s, %s, %s, %s, %s) before %s restriction \"%s\"",
CHECK_CLIENT_ACL, CHECK_HELO_ACL, CHECK_SENDER_ACL,
- CHECK_RECIP_ACL, CHECK_ETRN_ACL, name);
+ CHECK_RECIP_ACL, CHECK_ETRN_ACL, reply_class, name);
longjmp(smtpd_check_buf, smtpd_check_reject(state,
MAIL_ERROR_SOFTWARE, "451 Server configuration error"));
}
*/
#define SMTPD_CHECK_PUSH(backup, current, new) { \
backup = current; \
- current = (new ? mystrdup(new) : new); \
+ current = (new ? mystrdup(new) : 0); \
}
#define SMTPD_CHECK_POP(current, backup) { \
/*
* Minor kluge so that we can delegate work to the generic routine. We
- * provide no recipient information, because this restriction applies to
- * all recipients alike. Picking a specific recipient would be wrong.
+ * provide no recipient information in the case of multiple recipients,
+ * This restriction applies to all recipients alike, and logging only one
+ * of them would be misleading.
*/
- SMTPD_CHECK_PUSH(saved_recipient, state->recipient, 0);
+ if (state->rcpt_count > 1) {
+ saved_recipient = state->recipient;
+ state->recipient = 0;
+ }
/*
* Apply restrictions in the order as specified.
if (status == 0 && data_restrctions->argc)
status = generic_checks(state, data_restrctions,
"DATA", SMTPD_NAME_DATA, NO_DEF_ACL);
+ if (state->rcpt_count > 1)
+ state->recipient = saved_recipient;
- SMTPD_CHECK_RCPT_RETURN(status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
+ return (status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
}
#ifdef TEST