2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-09-01 22:55:29 +00:00

postfix-2.0.16-20030915

This commit is contained in:
Wietse Venema
2003-09-15 00:00:00 -05:00
committed by Viktor Dukhovni
parent 61fb4506a8
commit b7fe5bb669
17 changed files with 265 additions and 210 deletions

View File

@@ -8467,6 +8467,13 @@ Apologies for any names omitted.
networks. Based on code by Ben Rosengart, Panix. Files: networks. Based on code by Ben Rosengart, Panix. Files:
conf/sample-auth.cf, smtpd/smtpd.c. conf/sample-auth.cf, smtpd/smtpd.c.
20030902
Portability: the Postfix master resets the file size to
the largest possible off_t value when the actual limit
appears to overflow the off_t range. Files: util/sys_defs.h,
util/file_limit.c. A fine sample of bit banging.
20030905 20030905
Workaround: Solaris 8 select() claims that a non-blocking Workaround: Solaris 8 select() claims that a non-blocking
@@ -8494,9 +8501,9 @@ Apologies for any names omitted.
20030908 20030908
The 20030905 workaround triggers too many warnings. TCP The 20030905 Solaris workaround triggers too many warnings.
sockets are back to blocking, and keepalives are turned on TCP sockets are back to blocking, and keepalives are turned
to kill off dead sockets, as suggested by Leandro Santi. on to kill off dead sockets, as suggested by Leandro Santi.
Files: master/{single,multi}_server.c, smtpd/smtpd.c, Files: master/{single,multi}_server.c, smtpd/smtpd.c,
util/sys_defs.h. util/sys_defs.h.
@@ -8507,6 +8514,14 @@ Apologies for any names omitted.
was working poorly. Fix by Victor Duchovni, Morgan Stanley. was working poorly. Fix by Victor Duchovni, Morgan Stanley.
Files: lmtp/lmtp.c, lmtp/lmtp_proto.c. Files: lmtp/lmtp.c, lmtp/lmtp_proto.c.
20030912
Workaround: besides SMTP server sockets, SMTP client sockets
can also hang on Solaris, as reported by Leandro Santi. In
order to deal with this at the root, all connection management
is now done by sane_accept() and sane_connect(). Both turn
on keepalives on Solaris.
20030913 20030913
Safety: set-gid commands don't trust TZ. File: msg_syslog.c. Safety: set-gid commands don't trust TZ. File: msg_syslog.c.
@@ -8520,7 +8535,8 @@ Apologies for any names omitted.
Dean Gibson. Dean Gibson.
In header/body_checks, DUNNO is now the preferred action In header/body_checks, DUNNO is now the preferred action
instead of the now deprecated OK. instead of the now deprecated OK. This may confuse fewer
people.
In header/body_checks, allow text after IGNORE and DUNNO, In header/body_checks, allow text after IGNORE and DUNNO,
suggested by Victor Duchovni, Morgan Stanley. File: suggested by Victor Duchovni, Morgan Stanley. File:
@@ -8528,14 +8544,21 @@ Apologies for any names omitted.
Feature: reject_rhsbl_helo. File: smtpd/smtpd_check.c. Feature: reject_rhsbl_helo. File: smtpd/smtpd_check.c.
Cleanup: the LMTP and SMTP clients now send "MAIL FROM:<sender> Bugfix? The LMTP and SMTP clients now send "MAIL FROM:<sender>
AUTH=<>" when SASL authenticated. Suggested by by Victor AUTH=<>" when SASL authenticated. Suggested by by Victor
Duchovni, Morgan Stanley. Files: smtp/smtp_proto.c, Duchovni, Morgan Stanley. Files: smtp/smtp_proto.c,
lmtp/lmtp_proto.c. lmtp/lmtp_proto.c.
Open problems: 20030915
Med: do not list myorigin in virtual_alias_maps. Bugfix: mail rejected by the before-queue content filter
was mis-labeled as a software error; it should be labeled
as a policy error instead. File: smtpd/smtpd.c.
Cleanup: postcat is now null-byte transparent. File:
postcat/postcat.c.
Open problems:
High: when virtual aliasing is turned off after content High: when virtual aliasing is turned off after content
filtering, local submissions may escape virtual aliasing. filtering, local submissions may escape virtual aliasing.
@@ -8544,8 +8567,6 @@ Open problems:
request is in progress; this can result in multiple request is in progress; this can result in multiple
non-delivery notifications. non-delivery notifications.
Low: postcat should be null byte transparent.
Low: qmgr_move should not reset time stamps on queue files Low: qmgr_move should not reset time stamps on queue files
without shared lock (i.e. not open by a delivery agent). without shared lock (i.e. not open by a delivery agent).

View File

@@ -1,9 +1,9 @@
Purpose of the SMTP-based before-queue proxy filter feature Purpose of the before-queue content filter feature
=========================================================== ==================================================
Normally, Postfix receives mail, stores it in the mail queue and Normally, Postfix receives mail, stores it in the mail queue and
then delivers it. The Postfix SMTP server can be configured to then delivers it. The Postfix SMTP server can be configured to
forward all incoming mail through a proxy filter (for example, a forward all incoming mail to a content filter (for example, a
real-time SPAM filter) that inspects all mail BEFORE it is stored real-time SPAM filter) that inspects all mail BEFORE it is stored
in the Postfix mail queue. in the Postfix mail queue.
@@ -11,7 +11,7 @@ in the Postfix mail queue.
FILTER_README document, where all mail is inspected AFTER it is FILTER_README document, where all mail is inspected AFTER it is
stored in the Postfix mail queue] stored in the Postfix mail queue]
The SMTP-based before-queue proxy filter is meant to be used as follows: The before-queue content filter is meant to be used as follows:
before / smtp before / smtp
Internet -> smtpd -> queue -> smtpd -> cleanup -> queue -> local Internet -> smtpd -> queue -> smtpd -> cleanup -> queue -> local
@@ -34,14 +34,14 @@ after-queue content filter:
queue <- queue <-
filter filter
The SMTP-based before-queue proxy filter receives unfiltered mail The before-queue content filter receives unfiltered SMTP mail from
from Postfix and does one of the following: Postfix and does one of the following:
1 - Re-inject the mail back into Postfix via SMTP, perhaps after 1 - Re-inject the mail back into Postfix via SMTP, perhaps after
changing content. changing content.
2 - Reject the mail (by sending a suitable status code back to 2 - Reject the mail by sending a suitable SMTP status code back
Postfix). Postfix passes the status back to the remote SMTP to Postfix. Postfix passes the status back to the remote SMTP
client. This way, Postfix does not have to send a bounce message. client. This way, Postfix does not have to send a bounce message.
3 - Send the mail somewhere else. 3 - Send the mail somewhere else.
@@ -49,45 +49,36 @@ from Postfix and does one of the following:
Limitations Limitations
=========== ===========
The SMTP-based before-queue proxy filter allows Postfix to reject The before-queue content filter allows Postfix to reject mail before
mail before the incoming SMTP mail transfer completes, so that the incoming SMTP mail transfer completes, so that Postfix does
Postfix does not have to send rejected mail back to the sender. not have to send rejected mail back to the sender. Mail that is
Mail that is not accepted remains the responsibility of the client. not accepted remains the responsibility of the remote SMTP client.
In all other respects this content filtering approach is inferior
to the existing content filter (see FILTER_README) which processes
mail AFTER it is queued, because that gives you full control over
how many filtering processes can be run in parallel.
The problem with before-queue content filtering is that the remote The problem with before-queue content filtering is that the remote
SMTP client expects an SMTP reply within a deadline. As the system SMTP client expects an SMTP reply within a deadline. As the system
load increases, fewer and fewer CPU cycles remain available to load increases, fewer and fewer CPU cycles remain available to
answer within the deadline, and eventually you either have to stop answer within the deadline, and eventually you either have to stop
accepting mail or you have to accept unfiltered mail. accepting mail or you have to stop filtering the mail.
A possible workaround is to have the proxy take special action when How Postfix talks to the before-queue content filter
the deadline is reached: add a distinctive message header that
triggers a Postfix header_checks FILTER action, or send the mail
into Postfix via an alternative Postfix SMTP server that always
turns on content filtering.
How Postfix talks to the before-queue proxy filter
================================================== ==================================================
When passing mail to the SMTP-based before-queue filter, Postfix Postfix makes one connection per email message. Postfix speaks
generates its own EHLO, DATA and QUIT commands, and forwards ESMTP, but uses no command pipelining. Postfix generates its own
unmodified copies of the MAIL FROM and RCPT TO commands that the EHLO, DATA and QUIT commands, and forwards unmodified copies of
Postfix SMTP server has approved. All commands are sent without all the MAIL FROM and RCPT TO commands that the Postfix SMTP server
using ESMTP command pipelining. The SMTP proxy server should accept didn't reject itself. The SMTP proxy server should accept the same
the same MAIL FROM and RCPT TO command syntax as the Postfix SMTP MAIL FROM and RCPT TO command syntax as the Postfix SMTP server.
server. Postfix sends no other SMTP commands.
The before-queue proxy filter is expected literally pass on the The content filter is expected to pass on unmodified SMTP commands
SMTP commands that it receives from Postfix to an after-filter from a before-filter Postfix SMTP server to an after-filter Postfix
Postfix SMTP server that listens on a non-standard port. When the SMTP server that listens on a non-standard port. When the filter
filter rejects content, it should send a negative response back to rejects content, it should send a negative SMTP response back to
Postfix, and it should abort any connection with the after-filter the before-filter Postfix SMTP server, and it should abort any
Postfix SMTP server without completing the SMTP dialog. connection with the after-filter Postfix SMTP server without
completing the SMTP conversation with the after-filter Postfix SMTP
server.
Configuration parameters Configuration parameters
======================== ========================
@@ -96,12 +87,12 @@ Parameters that control proxying:
smtpd_proxy_filter (syntax: host:port) smtpd_proxy_filter (syntax: host:port)
The host and TCP port of the before-queue proxy filter. When The host and TCP port of the before-queue content filter. When
no host or host: is specified, localhost is assumed. no host or host: is specified, localhost is assumed.
smtpd_proxy_timeout (default: 100s) smtpd_proxy_timeout (default: 100s)
Timeout for connecting to the before-queue proxy filter and Timeout for connecting to the before-queue content filter and
for sending and receiving commands and data. All proxy errors for sending and receiving commands and data. All proxy errors
are logged to the maillog file. For privacy reasons, all the are logged to the maillog file. For privacy reasons, all the
remote SMTP client sees is "451 Error: queue file write error". remote SMTP client sees is "451 Error: queue file write error".
@@ -109,15 +100,15 @@ smtpd_proxy_timeout (default: 100s)
smtpd_proxy_ehlo (default: $myhostname) smtpd_proxy_ehlo (default: $myhostname)
The hostname to use when sending an EHLO command to the The hostname to use when sending an EHLO command to the
before-queue proxy filter. before-queue content filter.
Testing the SMTP pass-through proxy feature Testing the SMTP pass-through proxy feature
=========================================== ===========================================
The following example sets up a null proxy, that is, the Postfix The following example sets up a null content filter, that is, the
SMTP server gives the mail directly to another Postfix SMTP server Postfix SMTP server gives the mail directly to another Postfix SMTP
process without intervening content filter. This useful only for server process without intervening content filter. This useful only
testing, of course. for testing, of course.
/etc/postfix/master.cf /etc/postfix/master.cf
smtp inet n - n - - smtpd smtp inet n - n - - smtpd

View File

@@ -66,28 +66,29 @@
# The pattern domain.tld also matches subdomains, but # The pattern domain.tld also matches subdomains, but
# only when the string smtpd_access_maps is listed in # only when the string smtpd_access_maps is listed in
# the Postfix parent_domain_matches_subdomains con- # the Postfix parent_domain_matches_subdomains con-
# figuration setting. Otherwise, specify .domain.tld # figuration setting (note that this is the default
# (note the initial dot) in order to match subdo- # for some versions of Postfix). Otherwise, specify
# mains. # .domain.tld (note the initial dot) in order to
# match subdomains.
# #
# user@ Matches all mail addresses with the specified user # user@ Matches all mail addresses with the specified user
# part. # part.
# #
# Note: lookup of the null sender address is not possible # Note: lookup of the null sender address is not possible
# with some types of lookup table. By default, Postfix uses # with some types of lookup table. By default, Postfix uses
# <> as the lookup key for such addresses. The value is # <> as the lookup key for such addresses. The value is
# specified with the smtpd_null_access_lookup_key parameter # specified with the smtpd_null_access_lookup_key parameter
# in the Postfix main.cf file. # in the Postfix main.cf file.
# #
# EMAIL ADDRESS EXTENSION # EMAIL ADDRESS EXTENSION
# When a mail address localpart contains the optional recip- # When a mail address localpart contains the optional recip-
# ient delimiter (e.g., user+foo@domain), the lookup order # ient delimiter (e.g., user+foo@domain), the lookup order
# becomes: user+foo@domain, user@domain, domain, user+foo@, # becomes: user+foo@domain, user@domain, domain, user+foo@,
# and user@. # and user@.
# #
# HOST NAME/ADDRESS PATTERNS # HOST NAME/ADDRESS PATTERNS
# With lookups from indexed files such as DB or DBM, or from # With lookups from indexed files such as DB or DBM, or from
# networked tables such as NIS, LDAP or SQL, the following # networked tables such as NIS, LDAP or SQL, the following
# lookup patterns are examined in the order as listed: # lookup patterns are examined in the order as listed:
# #
# domain.tld # domain.tld
@@ -95,9 +96,9 @@
# #
# The pattern domain.tld also matches subdomains, but # The pattern domain.tld also matches subdomains, but
# only when the string smtpd_access_maps is listed in # only when the string smtpd_access_maps is listed in
# the Postfix parent_domain_matches_subdomains con- # the Postfix parent_domain_matches_subdomains con-
# figuration setting. Otherwise, specify .domain.tld # figuration setting. Otherwise, specify .domain.tld
# (note the initial dot) in order to match subdo- # (note the initial dot) in order to match subdo-
# mains. # mains.
# #
# net.work.addr.ess # net.work.addr.ess
@@ -106,88 +107,88 @@
# #
# net.work # net.work
# #
# net Matches any host address in the specified network. # net Matches any host address in the specified network.
# A network address is a sequence of one or more # A network address is a sequence of one or more
# octets separated by ".". # octets separated by ".".
# #
# NOTE: use the cidr lookup table type to specify # NOTE: use the cidr lookup table type to specify
# network/netmask patterns. See cidr_table(5) for # network/netmask patterns. See cidr_table(5) for
# details. # details.
# #
# ACTIONS # ACTIONS
# [45]NN text # [45]NN text
# Reject the address etc. that matches the pattern, # Reject the address etc. that matches the pattern,
# and respond with the numerical code and text. # and respond with the numerical code and text.
# #
# REJECT optional text... # REJECT optional text...
# Reject the address etc. that matches the pattern. # Reject the address etc. that matches the pattern.
# Reply with $reject_code optional text... when the # Reply with $reject_code optional text... when the
# optional text is specified, otherwise reply with a # optional text is specified, otherwise reply with a
# generic error response message. # generic error response message.
# #
# DEFER_IF_REJECT optional text... # DEFER_IF_REJECT optional text...
# Defer the request if some later restriction would # Defer the request if some later restriction would
# result in a REJECT action. Reply with "450 optional # result in a REJECT action. Reply with "450 optional
# text... when the optional text is specified, other- # text... when the optional text is specified, other-
# wise reply with a generic error response message. # wise reply with a generic error response message.
# #
# DEFER_IF_PERMIT optional text... # DEFER_IF_PERMIT optional text...
# Defer the request if some later restriction would # Defer the request if some later restriction would
# result in a PERMIT action (there is an implied PER- # result in a PERMIT action (there is an implied PER-
# MIT at the end of each restriction list). Reply # MIT at the end of each restriction list). Reply
# with "450 optional text... when the optional text # with "450 optional text... when the optional text
# is specified, otherwise reply with a generic error # is specified, otherwise reply with a generic error
# response message. # response message.
# #
# OK Accept the address etc. that matches the pattern. # OK Accept the address etc. that matches the pattern.
# #
# all-numerical # all-numerical
# An all-numerical result is treated as OK. This for- # An all-numerical result is treated as OK. This for-
# mat is generated by address-based relay authoriza- # mat is generated by address-based relay authoriza-
# tion schemes. # tion schemes.
# #
# DUNNO Pretend that the lookup key was not found in this # DUNNO Pretend that the lookup key was not found in this
# table. This prevents Postfix from trying substrings # table. This prevents Postfix from trying substrings
# of the lookup key (such as a subdomain name, or a # of the lookup key (such as a subdomain name, or a
# network address subnetwork). # network address subnetwork).
# #
# HOLD optional text... # HOLD optional text...
# Place the message on the hold queue, where it will # Place the message on the hold queue, where it will
# sit until someone either deletes it or releases it # sit until someone either deletes it or releases it
# for delivery. Log the optional text if specified, # for delivery. Log the optional text if specified,
# otherwise log a generic message. # otherwise log a generic message.
# #
# Mail that is placed on hold can be examined with # Mail that is placed on hold can be examined with
# the postcat(1) command, and can be destroyed or # the postcat(1) command, and can be destroyed or
# released with the postsuper(1) command. # released with the postsuper(1) command.
# #
# Note: this action currently affects all recipients
# of the message.
#
# DISCARD optional text...
# Claim successful delivery and silently discard the
# message. Log the optional text if specified, oth-
# erwise log a generic message.
#
# Note: this action currently affects all recipients # Note: this action currently affects all recipients
# of the message. # of the message.
# #
# DISCARD optional text...
# Claim successful delivery and silently discard the
# message. Log the optional text if specified, oth-
# erwise log a generic message.
#
# Note: this action currently affects all recipients
# of the message.
#
# FILTER transport:destination # FILTER transport:destination
# After the message is queued, send the entire mes- # After the message is queued, send the entire mes-
# sage through a content filter. More information # sage through a content filter. More information
# about content filters is in the Postfix FIL- # about content filters is in the Postfix FIL-
# TER_README file. # TER_README file.
# #
# Note: this action overrides the main.cf con- # Note: this action overrides the main.cf con-
# tent_filter setting, and currently affects all # tent_filter setting, and currently affects all
# recipients of the message. # recipients of the message.
# #
# REDIRECT user@domain # REDIRECT user@domain
# After the message is queued, send the message to # After the message is queued, send the message to
# the specified address instead of the intended # the specified address instead of the intended
# recipient(s). # recipient(s).
# #
# Note: this action overrides the FILTER action, and # Note: this action overrides the FILTER action, and
# currently affects all recipients of the message. # currently affects all recipients of the message.
# #
# restriction... # restriction...
@@ -195,46 +196,46 @@
# reject_unauth_destination, and so on). # reject_unauth_destination, and so on).
# #
# REGULAR EXPRESSION TABLES # REGULAR EXPRESSION TABLES
# This section describes how the table lookups change when # This section describes how the table lookups change when
# the table is given in the form of regular expressions. For # the table is given in the form of regular expressions. For
# a description of regular expression lookup table syntax, # a description of regular expression lookup table syntax,
# see regexp_table(5) or pcre_table(5). # see regexp_table(5) or pcre_table(5).
# #
# Each pattern is a regular expression that is applied to # Each pattern is a regular expression that is applied to
# the entire string being looked up. Depending on the appli- # the entire string being looked up. Depending on the appli-
# cation, that string is an entire client hostname, an # cation, that string is an entire client hostname, an
# entire client IP address, or an entire mail address. Thus, # entire client IP address, or an entire mail address. Thus,
# no parent domain or parent network search is done, # no parent domain or parent network search is done,
# user@domain mail addresses are not broken up into their # user@domain mail addresses are not broken up into their
# user@ and domain constituent parts, nor is user+foo broken # user@ and domain constituent parts, nor is user+foo broken
# up into user and foo. # up into user and foo.
# #
# Patterns are applied in the order as specified in the # Patterns are applied in the order as specified in the
# table, until a pattern is found that matches the search # table, until a pattern is found that matches the search
# string. # string.
# #
# Actions are the same as with indexed file lookups, with # Actions are the same as with indexed file lookups, with
# the additional feature that parenthesized substrings from # the additional feature that parenthesized substrings from
# the pattern can be interpolated as $1, $2 and so on. # the pattern can be interpolated as $1, $2 and so on.
# #
# TCP-BASED TABLES # TCP-BASED TABLES
# This section describes how the table lookups change when # This section describes how the table lookups change when
# lookups are directed to a TCP-based server. For a descrip- # lookups are directed to a TCP-based server. For a descrip-
# tion of the TCP client/server lookup protocol, see # tion of the TCP client/server lookup protocol, see
# tcp_table(5). # tcp_table(5).
# #
# Each lookup operation uses the entire query string once. # Each lookup operation uses the entire query string once.
# Depending on the application, that string is an entire # Depending on the application, that string is an entire
# client hostname, an entire client IP address, or an entire # client hostname, an entire client IP address, or an entire
# mail address. Thus, no parent domain or parent network # mail address. Thus, no parent domain or parent network
# search is done, user@domain mail addresses are not broken # search is done, user@domain mail addresses are not broken
# up into their user@ and domain constituent parts, nor is # up into their user@ and domain constituent parts, nor is
# user+foo broken up into user and foo. # user+foo broken up into user and foo.
# #
# Actions are the same as with indexed file lookups. # Actions are the same as with indexed file lookups.
# #
# BUGS # BUGS
# The table format does not understand quoting conventions. # The table format does not understand quoting conventions.
# #
# SEE ALSO # SEE ALSO
# postmap(1) create lookup table # postmap(1) create lookup table
@@ -245,7 +246,7 @@
# tcp_table(5) TCP client/server table lookup protocol # tcp_table(5) TCP client/server table lookup protocol
# #
# LICENSE # LICENSE
# The Secure Mailer license must be distributed with this # The Secure Mailer license must be distributed with this
# software. # software.
# #
# AUTHOR(S) # AUTHOR(S)

View File

@@ -1,4 +1,4 @@
<html> <head> </head> <body> <pre> <html> <body> <pre>
ACCESS(5) ACCESS(5) ACCESS(5) ACCESS(5)
<b>NAME</b> <b>NAME</b>
@@ -67,28 +67,29 @@ ACCESS(5) ACCESS(5)
The pattern <i>domain.tld</i> also matches subdomains, but The pattern <i>domain.tld</i> also matches subdomains, but
only when the string <b>smtpd_access_maps</b> is listed in only when the string <b>smtpd_access_maps</b> is listed in
the Postfix <b>parent_domain_matches_subdomains</b> con- the Postfix <b>parent_domain_matches_subdomains</b> con-
figuration setting. Otherwise, specify <i>.domain.tld</i> figuration setting (note that this is the default
(note the initial dot) in order to match subdo- for some versions of Postfix). Otherwise, specify
mains. <i>.domain.tld</i> (note the initial dot) in order to
match subdomains.
<i>user</i>@ Matches all mail addresses with the specified user <i>user</i>@ Matches all mail addresses with the specified user
part. part.
Note: lookup of the null sender address is not possible Note: lookup of the null sender address is not possible
with some types of lookup table. By default, Postfix uses with some types of lookup table. By default, Postfix uses
&lt;&gt; as the lookup key for such addresses. The value is &lt;&gt; as the lookup key for such addresses. The value is
specified with the <b>smtpd_null_access_lookup_key</b> parameter specified with the <b>smtpd_null_access_lookup_key</b> parameter
in the Postfix <b>main.cf</b> file. in the Postfix <b>main.cf</b> file.
<b>EMAIL ADDRESS EXTENSION</b> <b>EMAIL ADDRESS EXTENSION</b>
When a mail address localpart contains the optional recip- When a mail address localpart contains the optional recip-
ient delimiter (e.g., <i>user+foo</i>@<i>domain</i>), the lookup order ient delimiter (e.g., <i>user+foo</i>@<i>domain</i>), the lookup order
becomes: <i>user+foo</i>@<i>domain</i>, <i>user</i>@<i>domain</i>, <i>domain</i>, <i>user+foo</i>@, becomes: <i>user+foo</i>@<i>domain</i>, <i>user</i>@<i>domain</i>, <i>domain</i>, <i>user+foo</i>@,
and <i>user</i>@. and <i>user</i>@.
<b>HOST NAME/ADDRESS PATTERNS</b> <b>HOST NAME/ADDRESS PATTERNS</b>
With lookups from indexed files such as DB or DBM, or from With lookups from indexed files such as DB or DBM, or from
networked tables such as NIS, LDAP or SQL, the following networked tables such as NIS, LDAP or SQL, the following
lookup patterns are examined in the order as listed: lookup patterns are examined in the order as listed:
<i>domain.tld</i> <i>domain.tld</i>
@@ -96,9 +97,9 @@ ACCESS(5) ACCESS(5)
The pattern <i>domain.tld</i> also matches subdomains, but The pattern <i>domain.tld</i> also matches subdomains, but
only when the string <b>smtpd_access_maps</b> is listed in only when the string <b>smtpd_access_maps</b> is listed in
the Postfix <b>parent_domain_matches_subdomains</b> con- the Postfix <b>parent_domain_matches_subdomains</b> con-
figuration setting. Otherwise, specify <i>.domain.tld</i> figuration setting. Otherwise, specify <i>.domain.tld</i>
(note the initial dot) in order to match subdo- (note the initial dot) in order to match subdo-
mains. mains.
<i>net.work.addr.ess</i> <i>net.work.addr.ess</i>
@@ -107,88 +108,88 @@ ACCESS(5) ACCESS(5)
<i>net.work</i> <i>net.work</i>
<i>net</i> Matches any host address in the specified network. <i>net</i> Matches any host address in the specified network.
A network address is a sequence of one or more A network address is a sequence of one or more
octets separated by ".". octets separated by ".".
NOTE: use the <b>cidr</b> lookup table type to specify NOTE: use the <b>cidr</b> lookup table type to specify
network/netmask patterns. See <a href="cidr_table.5.html">cidr_table(5)</a> for network/netmask patterns. See <a href="cidr_table.5.html">cidr_table(5)</a> for
details. details.
<b>ACTIONS</b> <b>ACTIONS</b>
[<b>45</b>]<i>NN text</i> [<b>45</b>]<i>NN text</i>
Reject the address etc. that matches the pattern, Reject the address etc. that matches the pattern,
and respond with the numerical code and text. and respond with the numerical code and text.
<b>REJECT</b> <i>optional text...</i> <b>REJECT</b> <i>optional text...</i>
Reject the address etc. that matches the pattern. Reject the address etc. that matches the pattern.
Reply with <i>$reject</i><b>_</b><i>code optional text...</i> when the Reply with <i>$reject</i><b>_</b><i>code optional text...</i> when the
optional text is specified, otherwise reply with a optional text is specified, otherwise reply with a
generic error response message. generic error response message.
<b>DEFER_IF_REJECT</b> <i>optional text...</i> <b>DEFER_IF_REJECT</b> <i>optional text...</i>
Defer the request if some later restriction would Defer the request if some later restriction would
result in a REJECT action. Reply with "<b>450</b> <i>optional</i> result in a REJECT action. Reply with "<b>450</b> <i>optional</i>
<i>text...</i> when the optional text is specified, other- <i>text...</i> when the optional text is specified, other-
wise reply with a generic error response message. wise reply with a generic error response message.
<b>DEFER_IF_PERMIT</b> <i>optional text...</i> <b>DEFER_IF_PERMIT</b> <i>optional text...</i>
Defer the request if some later restriction would Defer the request if some later restriction would
result in a PERMIT action (there is an implied PER- result in a PERMIT action (there is an implied PER-
MIT at the end of each restriction list). Reply MIT at the end of each restriction list). Reply
with "<b>450</b> <i>optional text...</i> when the optional text with "<b>450</b> <i>optional text...</i> when the optional text
is specified, otherwise reply with a generic error is specified, otherwise reply with a generic error
response message. response message.
<b>OK</b> Accept the address etc. that matches the pattern. <b>OK</b> Accept the address etc. that matches the pattern.
<i>all-numerical</i> <i>all-numerical</i>
An all-numerical result is treated as OK. This for- An all-numerical result is treated as OK. This for-
mat is generated by address-based relay authoriza- mat is generated by address-based relay authoriza-
tion schemes. tion schemes.
<b>DUNNO</b> Pretend that the lookup key was not found in this <b>DUNNO</b> Pretend that the lookup key was not found in this
table. This prevents Postfix from trying substrings table. This prevents Postfix from trying substrings
of the lookup key (such as a subdomain name, or a of the lookup key (such as a subdomain name, or a
network address subnetwork). network address subnetwork).
<b>HOLD</b> <i>optional text...</i> <b>HOLD</b> <i>optional text...</i>
Place the message on the <b>hold</b> queue, where it will Place the message on the <b>hold</b> queue, where it will
sit until someone either deletes it or releases it sit until someone either deletes it or releases it
for delivery. Log the optional text if specified, for delivery. Log the optional text if specified,
otherwise log a generic message. otherwise log a generic message.
Mail that is placed on hold can be examined with Mail that is placed on hold can be examined with
the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command. released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command.
Note: this action currently affects all recipients
of the message.
<b>DISCARD</b> <i>optional text...</i>
Claim successful delivery and silently discard the
message. Log the optional text if specified, oth-
erwise log a generic message.
Note: this action currently affects all recipients Note: this action currently affects all recipients
of the message. of the message.
<b>DISCARD</b> <i>optional text...</i>
Claim successful delivery and silently discard the
message. Log the optional text if specified, oth-
erwise log a generic message.
Note: this action currently affects all recipients
of the message.
<b>FILTER</b> <i>transport:destination</i> <b>FILTER</b> <i>transport:destination</i>
After the message is queued, send the entire mes- After the message is queued, send the entire mes-
sage through a content filter. More information sage through a content filter. More information
about content filters is in the Postfix FIL- about content filters is in the Postfix FIL-
TER_README file. TER_README file.
Note: this action overrides the <b>main.cf con-</b> Note: this action overrides the <b>main.cf con-</b>
<b>tent_filter</b> setting, and currently affects all <b>tent_filter</b> setting, and currently affects all
recipients of the message. recipients of the message.
<b>REDIRECT</b> <i>user@domain</i> <b>REDIRECT</b> <i>user@domain</i>
After the message is queued, send the message to After the message is queued, send the message to
the specified address instead of the intended the specified address instead of the intended
recipient(s). recipient(s).
Note: this action overrides the FILTER action, and Note: this action overrides the FILTER action, and
currently affects all recipients of the message. currently affects all recipients of the message.
<i>restriction...</i> <i>restriction...</i>
@@ -196,46 +197,46 @@ ACCESS(5) ACCESS(5)
<b>reject_unauth_destination</b>, and so on). <b>reject_unauth_destination</b>, and so on).
<b>REGULAR EXPRESSION TABLES</b> <b>REGULAR EXPRESSION TABLES</b>
This section describes how the table lookups change when This section describes how the table lookups change when
the table is given in the form of regular expressions. For the table is given in the form of regular expressions. For
a description of regular expression lookup table syntax, a description of regular expression lookup table syntax,
see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>. see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>.
Each pattern is a regular expression that is applied to Each pattern is a regular expression that is applied to
the entire string being looked up. Depending on the appli- the entire string being looked up. Depending on the appli-
cation, that string is an entire client hostname, an cation, that string is an entire client hostname, an
entire client IP address, or an entire mail address. Thus, entire client IP address, or an entire mail address. Thus,
no parent domain or parent network search is done, no parent domain or parent network search is done,
<i>user@domain</i> mail addresses are not broken up into their <i>user@domain</i> mail addresses are not broken up into their
<i>user@</i> and <i>domain</i> constituent parts, nor is <i>user+foo</i> broken <i>user@</i> and <i>domain</i> constituent parts, nor is <i>user+foo</i> broken
up into <i>user</i> and <i>foo</i>. up into <i>user</i> and <i>foo</i>.
Patterns are applied in the order as specified in the Patterns are applied in the order as specified in the
table, until a pattern is found that matches the search table, until a pattern is found that matches the search
string. string.
Actions are the same as with indexed file lookups, with Actions are the same as with indexed file lookups, with
the additional feature that parenthesized substrings from the additional feature that parenthesized substrings from
the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on. the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
<b>TCP-BASED TABLES</b> <b>TCP-BASED TABLES</b>
This section describes how the table lookups change when This section describes how the table lookups change when
lookups are directed to a TCP-based server. For a descrip- lookups are directed to a TCP-based server. For a descrip-
tion of the TCP client/server lookup protocol, see tion of the TCP client/server lookup protocol, see
<a href="tcp_table.5.html"><b>tcp_table</b>(5)</a>. <a href="tcp_table.5.html"><b>tcp_table</b>(5)</a>.
Each lookup operation uses the entire query string once. Each lookup operation uses the entire query string once.
Depending on the application, that string is an entire Depending on the application, that string is an entire
client hostname, an entire client IP address, or an entire client hostname, an entire client IP address, or an entire
mail address. Thus, no parent domain or parent network mail address. Thus, no parent domain or parent network
search is done, <i>user@domain</i> mail addresses are not broken search is done, <i>user@domain</i> mail addresses are not broken
up into their <i>user@</i> and <i>domain</i> constituent parts, nor is up into their <i>user@</i> and <i>domain</i> constituent parts, nor is
<i>user+foo</i> broken up into <i>user</i> and <i>foo</i>. <i>user+foo</i> broken up into <i>user</i> and <i>foo</i>.
Actions are the same as with indexed file lookups. Actions are the same as with indexed file lookups.
<b>BUGS</b> <b>BUGS</b>
The table format does not understand quoting conventions. The table format does not understand quoting conventions.
<b>SEE ALSO</b> <b>SEE ALSO</b>
<a href="postmap.1.html">postmap(1)</a> create lookup table <a href="postmap.1.html">postmap(1)</a> create lookup table
@@ -246,7 +247,7 @@ ACCESS(5) ACCESS(5)
<a href="tcp_table.5.html">tcp_table(5)</a> TCP client/server table lookup protocol <a href="tcp_table.5.html">tcp_table(5)</a> TCP client/server table lookup protocol
<b>LICENSE</b> <b>LICENSE</b>
The Secure Mailer license must be distributed with this The Secure Mailer license must be distributed with this
software. software.
<b>AUTHOR(S)</b> <b>AUTHOR(S)</b>

View File

@@ -1,11 +1,11 @@
<html> <head> </head> <body> <pre> <html> <body> <pre>
POSTCAT(1) POSTCAT(1) POSTCAT(1) POSTCAT(1)
<b>NAME</b> <b>NAME</b>
postcat - show Postfix queue file contents postcat - show Postfix queue file contents
<b>SYNOPSIS</b> <b>SYNOPSIS</b>
<b>postcat</b> [<b>-vq</b>] [<b>-c</b> <i>config_dir</i>] [<i>files</i>...] <b>postcat</b> [<b>-vq</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<i>files</i>...]
<b>DESCRIPTION</b> <b>DESCRIPTION</b>
The <b>postcat</b> command prints the contents of the named <i>files</i> The <b>postcat</b> command prints the contents of the named <i>files</i>
@@ -15,7 +15,7 @@ POSTCAT(1) POSTCAT(1)
Options: Options:
<b>-c</b> <i>config_dir</i> <b>-c</b> <i>config</i><b>_</b><i>dir</i>
The <b>main.cf</b> configuration file is in the named The <b>main.cf</b> configuration file is in the named
directory instead of the default configuration directory instead of the default configuration
directory. directory.
@@ -31,7 +31,7 @@ POSTCAT(1) POSTCAT(1)
Problems are reported to the standard error stream. Problems are reported to the standard error stream.
<b>ENVIRONMENT</b> <b>ENVIRONMENT</b>
<b>MAIL</b><i>_</i><b>CONFIG</b> <b>MAIL_CONFIG</b>
Directory with Postfix configuration files. Directory with Postfix configuration files.
<b>CONFIGURATION PARAMETERS</b> <b>CONFIGURATION PARAMETERS</b>
@@ -39,7 +39,7 @@ POSTCAT(1) POSTCAT(1)
default values. Use the <b>postfix reload</b> command after a default values. Use the <b>postfix reload</b> command after a
configuration change. configuration change.
<b>queue</b><i>_</i><b>directory</b> <b>queue_directory</b>
Top-level directory of the Postfix queue. This is Top-level directory of the Postfix queue. This is
also the root directory of Postfix daemons that run also the root directory of Postfix daemons that run
chrooted. chrooted.

View File

@@ -66,7 +66,8 @@ Matches \fIdomain.tld\fR as the domain part of an email address.
.sp .sp
The pattern \fIdomain.tld\fR also matches subdomains, but only The pattern \fIdomain.tld\fR also matches subdomains, but only
when the string \fBsmtpd_access_maps\fR is listed in the Postfix when the string \fBsmtpd_access_maps\fR is listed in the Postfix
\fBparent_domain_matches_subdomains\fR configuration setting. \fBparent_domain_matches_subdomains\fR configuration setting
(note that this is the default for some versions of Postfix).
Otherwise, specify \fI.domain.tld\fR (note the initial dot) in Otherwise, specify \fI.domain.tld\fR (note the initial dot) in
order to match subdomains. order to match subdomains.
.IP \fIuser\fR@ .IP \fIuser\fR@

View File

@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the * Patches change the patchlevel and the release date. Snapshots change the
* release date only, unless they include the same bugfix as a patch release. * release date only, unless they include the same bugfix as a patch release.
*/ */
#define MAIL_RELEASE_DATE "20030812" #define MAIL_RELEASE_DATE "20030915"
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "2.0.14-" MAIL_RELEASE_DATE #define DEF_MAIL_VERSION "2.0.14-" MAIL_RELEASE_DATE

View File

@@ -294,7 +294,6 @@ static void post_mail_open_event(int event, char *context)
event_disable_readwrite(vstream_fileno(state->stream)); event_disable_readwrite(vstream_fileno(state->stream));
vstream_fclose(state->stream); vstream_fclose(state->stream);
} else { } else {
case EVENT_XCPT:
msg_warn("connect to service: %s: %m", var_cleanup_service); msg_warn("connect to service: %s: %m", var_cleanup_service);
} }
myfree(state->sender); myfree(state->sender);
@@ -303,6 +302,20 @@ static void post_mail_open_event(int event, char *context)
myfree((char *) state); myfree((char *) state);
return; return;
/*
* Some exception.
*/
case EVENT_XCPT:
msg_warn("error connecting to service: %s", var_cleanup_service);
event_cancel_timer(post_mail_open_event, context);
event_disable_readwrite(vstream_fileno(state->stream));
vstream_fclose(state->stream);
myfree(state->sender);
myfree(state->recipient);
state->notify((VSTREAM *) 0, state->context);
myfree((char *) state);
return;
/* /*
* Broken software or hardware. * Broken software or hardware.
*/ */

View File

@@ -385,7 +385,7 @@ static int lmtp_loop(LMTP_STATE *state, int send_state, int recv_state)
} }
/* /*
* We authenticate the client, not the sender. * We authenticate the local MTA only, but not the sender.
*/ */
#ifdef USE_SASL_AUTH #ifdef USE_SASL_AUTH
if (var_lmtp_sasl_enable if (var_lmtp_sasl_enable

View File

@@ -80,6 +80,7 @@
#define PC_FLAG_QUEUE (1<<0) /* search queue */ #define PC_FLAG_QUEUE (1<<0) /* search queue */
#define STR vstring_str #define STR vstring_str
#define LEN VSTRING_LEN
/* postcat - visualize Postfix queue file contents */ /* postcat - visualize Postfix queue file contents */
@@ -129,17 +130,16 @@ static void postcat(VSTREAM *fp, VSTRING *buffer)
break; break;
case REC_TYPE_CONT: case REC_TYPE_CONT:
if (msg_verbose) if (msg_verbose)
vstream_printf("%s: %s\n", rec_type_name(rec_type), vstream_printf("%s: ", rec_type_name(rec_type));
STR(buffer)); vstream_fwrite(VSTREAM_OUT, STR(buffer), LEN(buffer));
else if (msg_verbose)
vstream_printf("%s", STR(buffer)); VSTREAM_PUTCHAR('\n');
break; break;
case REC_TYPE_NORM: case REC_TYPE_NORM:
if (msg_verbose) if (msg_verbose)
vstream_printf("%s: %s\n", rec_type_name(rec_type), vstream_printf("%s: ", rec_type_name(rec_type));
STR(buffer)); vstream_fwrite(VSTREAM_OUT, STR(buffer), LEN(buffer));
else VSTREAM_PUTCHAR('\n');
vstream_printf("%s\n", STR(buffer));
break; break;
case REC_TYPE_MESG: case REC_TYPE_MESG:
vstream_printf("*** MESSAGE CONTENTS %s ***\n", VSTREAM_PATH(fp)); vstream_printf("*** MESSAGE CONTENTS %s ***\n", VSTREAM_PATH(fp));

View File

@@ -506,7 +506,7 @@ int smtp_xfer(SMTP_STATE *state)
} }
/* /*
* We authenticate the client, not the sender. * We authenticate the local MTA only, but not the sender.
*/ */
#ifdef USE_SASL_AUTH #ifdef USE_SASL_AUTH
if (var_smtp_sasl_enable if (var_smtp_sasl_enable

View File

@@ -555,6 +555,8 @@ static void mail_reset(SMTPD_STATE *);
static void rcpt_reset(SMTPD_STATE *); static void rcpt_reset(SMTPD_STATE *);
static void chat_reset(SMTPD_STATE *, int); static void chat_reset(SMTPD_STATE *, int);
#ifdef USE_SASL_AUTH
/* /*
* SASL exceptions. * SASL exceptions.
*/ */
@@ -584,6 +586,8 @@ static int sasl_client_exception(SMTPD_STATE *state)
return (match); return (match);
} }
#endif
/* collapse_args - put arguments together again */ /* collapse_args - put arguments together again */
static void collapse_args(int argc, SMTPD_TOKEN *argv) static void collapse_args(int argc, SMTPD_TOKEN *argv)
@@ -1299,8 +1303,9 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
if (state->proxy) { if (state->proxy) {
if (state->err == CLEANUP_STAT_OK) { if (state->err == CLEANUP_STAT_OK) {
(void) smtpd_proxy_cmd(state, SMTPD_PROX_WANT_ANY, "."); (void) smtpd_proxy_cmd(state, SMTPD_PROX_WANT_ANY, ".");
if (*STR(state->proxy_buffer) != '2') if (state->err == CLEANUP_STAT_OK &&
state->err = CLEANUP_STAT_PROXY; *STR(state->proxy_buffer) != '2')
state->err = CLEANUP_STAT_CONT;
} }
smtpd_proxy_close(state); smtpd_proxy_close(state);
} }
@@ -1350,8 +1355,11 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
smtpd_chat_reply(state, "554 Error: too many hops"); smtpd_chat_reply(state, "554 Error: too many hops");
} else if ((state->err & CLEANUP_STAT_CONT) != 0) { } else if ((state->err & CLEANUP_STAT_CONT) != 0) {
state->error_mask |= MAIL_ERROR_POLICY; state->error_mask |= MAIL_ERROR_POLICY;
smtpd_chat_reply(state, "550 Error: %s", LEN(why) ? if (state->proxy_buffer)
STR(why) : "content rejected"); smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
else
smtpd_chat_reply(state, "550 Error: %s", LEN(why) ?
STR(why) : "content rejected");
} else if ((state->err & CLEANUP_STAT_WRITE) != 0) { } else if ((state->err & CLEANUP_STAT_WRITE) != 0) {
state->error_mask |= MAIL_ERROR_RESOURCE; state->error_mask |= MAIL_ERROR_RESOURCE;
smtpd_chat_reply(state, "451 Error: queue file write error"); smtpd_chat_reply(state, "451 Error: queue file write error");

View File

@@ -5,7 +5,7 @@
#msg_verbose 1 #msg_verbose 1
smtpd_delay_reject 0 smtpd_delay_reject 0
# #
# Test the nex access map features # Test the new access map features
# #
sender_restrictions hash:./smtpd_check_access sender_restrictions hash:./smtpd_check_access
mail rejecttext@bad.domain mail rejecttext@bad.domain

View File

@@ -53,3 +53,10 @@ client spike.porcupine.org 168.100.189.2
mail sname@sdomain mail sname@sdomain
rcpt rname@rdomain rcpt rname@rdomain
rcpt rname@example.tld rcpt rname@example.tld
#
# RHSBL helo domain name
#
recipient_restrictions reject_rhsbl_helo,abuse.rfc-ignorant.org
helo example.tld
mail sname@sdomain
rcpt rname@rdomain

View File

@@ -97,3 +97,15 @@ OK
>>> rcpt rname@example.tld >>> rcpt rname@example.tld
./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address; from=<sname@sdomain> to=<rname@example.tld> proto=SMTP helo=<foobar> ./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address; from=<sname@sdomain> to=<rname@example.tld> proto=SMTP helo=<foobar>
554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address 554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address
>>> #
>>> # RHSBL helo domain name
>>> #
>>> recipient_restrictions reject_rhsbl_helo,abuse.rfc-ignorant.org
OK
>>> helo example.tld
OK
>>> mail sname@sdomain
OK
>>> rcpt rname@rdomain
./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<example.tld>
554 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain

View File

@@ -434,13 +434,13 @@ static int command_read(SINK_STATE *state)
* Got a complete command line. Parse it. * Got a complete command line. Parse it.
*/ */
ptr = vstring_str(state->buffer); ptr = vstring_str(state->buffer);
if (msg_verbose)
msg_info("%s", ptr);
if ((command = mystrtok(&ptr, " \t")) == 0) { if ((command = mystrtok(&ptr, " \t")) == 0) {
smtp_printf(state->stream, "500 Error: unknown command"); smtp_printf(state->stream, "500 Error: unknown command");
smtp_flush(state->stream); smtp_flush(state->stream);
return (0); return (0);
} }
if (msg_verbose)
msg_info("%s", command);
for (cmdp = command_table; cmdp->name != 0; cmdp++) for (cmdp = command_table; cmdp->name != 0; cmdp++)
if (strcasecmp(command, cmdp->name) == 0) if (strcasecmp(command, cmdp->name) == 0)
break; break;

View File

@@ -410,8 +410,8 @@ static void resolve_addr(RES_CONTEXT *rp, char *addr,
rcpt_domain, VAR_VIRT_ALIAS_DOMS, rcpt_domain, VAR_VIRT_ALIAS_DOMS,
VAR_RELAY_DOMAINS); VAR_RELAY_DOMAINS);
if (strcasecmp(rcpt_domain, var_myorigin) == 0) if (strcasecmp(rcpt_domain, var_myorigin) == 0)
msg_warn("do not list $%s in %s", msg_warn("do not list $%s (%s) in %s",
VAR_MYORIGIN, VAR_VIRT_ALIAS_DOMS); VAR_MYORIGIN, var_myorigin, VAR_VIRT_ALIAS_DOMS);
} }
vstring_strcpy(channel, MAIL_SERVICE_ERROR); vstring_strcpy(channel, MAIL_SERVICE_ERROR);
vstring_sprintf(nexthop, "User unknown%s", vstring_sprintf(nexthop, "User unknown%s",