with guidance to enforce that the From: header address
matches the envelope sender (MAIL FROM) address. File:
proto/postconf.proto.
+
+20240909
+
+ Bitrot: some platforms prefer the pkgconf command over pkg-config,
+ which in turn has superseded icu-config. File: makedefs.
+
+20230910
+ Cleanup: the enable_threaded_bounces feature was re-implemented.
+ This simplifies the code and improves the handling of
+ multiline Message-Id: headers (no software should generate
+ those, but...). Files: bounce/bounce_notify_util.c,
+ cleanup/cleanup.h, cleanup/cleanup_extracted.c,
+ cleanup/cleanup_message.c, cleanup/cleanup_state.c,
+ global/mail_proto.h, multiple bounce testfiles.
+
+20240917
+
+ Minor feature: "postcat -f" option to prepend the filename
+ to each output line. This simplifies test data development.
+ File: postcat/postcat.c.
Disable -DSNAPSHOT and -DNONPROD in makedefs.
+ Add tests for Message-ID extraction in the cleanup daemon.
+
+ The postdrop code should be more explicit about what
+ attrributes it will pass through. rec_attr_map() is not
+ supposed to be an approver.
+
Many master.cf services don't expect wakeup calls, resulting
in weird warnings. Maybe the master daemon could signal the
wakeup intent through a child process command-line option,
using FIFOs anymore, and trigger servers could use a proper
(attribute, value) protocol.
+ The Sendmail feature _FFR_MDS_NEGOTIATE allows negotiating
+ a larger milter command data size limit. To be investigated:
+ what parts of the protocol are included in this limit when
+ sending a message header (header name, protocol formatting,
+ etc.) and how this will interact with the Postfix built-in
+ header_size_limit (default: 102400).
+
SEND_ATTR_FUNC should send the name of the object being sent,
so that SCAN_ATTR_FUNC can check it.
<b>-DNO_EAI</b>
Do not build with EAI (SMTPUTF8) support. By default, EAI
- support is compiled in when the "pkg-config" command is
- found, or the deprecated "icu-config" command.
+ support is compiled in when the "pkgconf" or "pkg-config"
+ command are found, or the deprecated "icu-config" com-
+ mand.
<b>-DNO_INLINE</b>
Do not require support for C99 "inline" functions.
- Instead, implement argument typechecks for
- non-(printf/scanf)-like functions with ternary operators
+ Instead, implement argument typechecks for
+ non-(printf/scanf)-like functions with ternary operators
and unreachable code.
<b>-DNO_IPV6</b>
Do not build with IPv6 support. By default, IPv6 support
- is compiled in on platforms that are known to have IPv6
+ is compiled in on platforms that are known to have IPv6
support.
- Note: this directive is for debugging and testing only.
- It is not guaranteed to work on all platforms. If you
- don't want IPv6 support, set "<a href="postconf.5.html#inet_protocols">inet_protocols</a> = ipv4" in
+ Note: this directive is for debugging and testing only.
+ It is not guaranteed to work on all platforms. If you
+ don't want IPv6 support, set "<a href="postconf.5.html#inet_protocols">inet_protocols</a> = ipv4" in
<a href="postconf.5.html">main.cf</a>.
<b>-DNO_IP_CYRUS_SASL_AUTH</b>
- Don't pass remote SMTP client and Postfix SMTP server IP
- address and port information to the Cyrus SASL library.
+ Don't pass remote SMTP client and Postfix SMTP server IP
+ address and port information to the Cyrus SASL library.
This is compatible with Postfix < 3.2.
<b>-DNO_KQUEUE</b>
- Do not build with FreeBSD/NetBSD/OpenBSD/MacOSX KQUEUE
- support. By default, KQUEUE support is compiled in on
+ Do not build with FreeBSD/NetBSD/OpenBSD/MacOSX KQUEUE
+ support. By default, KQUEUE support is compiled in on
platforms that are known to support it.
<b>-DNO_NIS</b>
Disable support for POSIX getpwnam_r/getpwuid_r.
<b>-DNO_RES_NCALLS</b>
- Do not build with the threadsafe resolver(5) API
+ Do not build with the threadsafe resolver(5) API
(res_ninit() etc.).
<b>-DNO_SIGSETJMP</b>
- Use setjmp()/longjmp() instead of sigsetjmp()/sig-
- longjmp(). By default, Postfix uses sigsetjmp()/sig-
+ Use setjmp()/longjmp() instead of sigsetjmp()/sig-
+ longjmp(). By default, Postfix uses sigsetjmp()/sig-
longjmp() when they appear to work.
<b>-DNO_SNPRINTF</b>
- Use sprintf() instead of snprintf(). By default, Postfix
+ Use sprintf() instead of snprintf(). By default, Postfix
uses snprintf() except on ancient systems.
<b>DEBUG=</b><i>debug</i><b>_</b><i>level</i>
- Specifies a non-default debugging level. The default is <b>-g</b>.
+ Specifies a non-default debugging level. The default is <b>-g</b>.
Specify <b>DEBUG=</b> to turn off debugging.
<b>OPT=</b><i>optimization</i><b>_</b><i>level</i>
- Specifies a non-default optimization level. The default is <b>-O</b>.
+ Specifies a non-default optimization level. The default is <b>-O</b>.
Specify <b>OPT=</b> to turn off optimization.
<b>POSTFIX_INSTALL_OPTS=</b><i>-option...</i>
- Specifies options for the postfix-install command, separated by
- whitespace. Currently, the only supported option is
+ Specifies options for the postfix-install command, separated by
+ whitespace. Currently, the only supported option is
<b>-keep-build-mtime</b>.
<b>SHLIB_CFLAGS=</b><i>flags</i>
- Override the compiler flags (typically, "-fPIC") for Postfix
+ Override the compiler flags (typically, "-fPIC") for Postfix
dynamically-linked libraries and database plugins.
This feature was introduced with Postfix 3.0.
<b>SHLIB_RPATH=</b><i>rpath</i>
- Override the runpath (typically, "'-Wl,-rpath,${SHLIB_DIR}'")
+ Override the runpath (typically, "'-Wl,-rpath,${SHLIB_DIR}'")
for Postfix dynamically-linked libraries.
This feature was introduced with Postfix 3.0.
<b>SHLIB_SUFFIX=</b><i>suffix</i>
- Override the filename suffix (typically, ".so") for Postfix
+ Override the filename suffix (typically, ".so") for Postfix
dynamically-linked libraries and database plugins.
This feature was introduced with Postfix 3.0.
<b>shared=yes</b>
<b>shared=no</b>
- Enable (disable) Postfix builds with dynamically-linked
+ Enable (disable) Postfix builds with dynamically-linked
libraries typically named $<a href="postconf.5.html#shlib_directory">shlib_directory</a>/libpostfix-*.so.*.
This feature was introduced with Postfix 3.0.
<b>dynamicmaps=yes</b>
<b>dynamicmaps=no</b>
- Enable (disable) Postfix builds with the configuration file
+ Enable (disable) Postfix builds with the configuration file
$<a href="postconf.5.html#meta_directory">meta_directory</a>/dynamicmaps.cf and dynamically-loadable database
- plugins typically named postfix-*.so.*. The setting "dynam-
- icmaps=yes" implicitly enables Postfix dynamically-linked
+ plugins typically named postfix-*.so.*. The setting "dynam-
+ icmaps=yes" implicitly enables Postfix dynamically-linked
libraries.
This feature was introduced with Postfix 3.0.
<b>pie=yes</b>
- <b>pie=no</b> Enable (disable) Postfix builds with position-independent exe-
+ <b>pie=no</b> Enable (disable) Postfix builds with position-independent exe-
cutables, on platforms where this is supported.
This feature was introduced with Postfix 3.0.
<i>installation</i><b>_</b><i>parameter</i><b>=</b><i>value</i>...
- Override the compiled-in default value of the specified instal-
- lation parameter(s). The following parameters are supported in
+ Override the compiled-in default value of the specified instal-
+ lation parameter(s). The following parameters are supported in
this context:
- <a href="postconf.5.html#command_directory">command_directory</a> <a href="postconf.5.html#config_directory">config_directory</a> <a href="postconf.5.html#daemon_directory">daemon_directory</a> <a href="postconf.5.html#data_directory">data_direc</a>-
- <a href="postconf.5.html#data_directory">tory</a> <a href="postconf.5.html#default_database_type">default_database_type</a> <a href="postconf.5.html#html_directory">html_directory</a> <a href="postconf.5.html#mail_spool_directory">mail_spool_directory</a>
- <a href="postconf.5.html#mailq_path">mailq_path</a> <a href="postconf.5.html#manpage_directory">manpage_directory</a> <a href="postconf.5.html#meta_directory">meta_directory</a> <a href="postconf.5.html#newaliases_path">newaliases_path</a>
- <a href="postconf.5.html#queue_directory">queue_directory</a> <a href="postconf.5.html#readme_directory">readme_directory</a> <a href="postconf.5.html#sendmail_path">sendmail_path</a> <a href="postconf.5.html#shlib_directory">shlib_directory</a>
+ <a href="postconf.5.html#command_directory">command_directory</a> <a href="postconf.5.html#config_directory">config_directory</a> <a href="postconf.5.html#daemon_directory">daemon_directory</a> <a href="postconf.5.html#data_directory">data_direc</a>-
+ <a href="postconf.5.html#data_directory">tory</a> <a href="postconf.5.html#default_database_type">default_database_type</a> <a href="postconf.5.html#html_directory">html_directory</a> <a href="postconf.5.html#mail_spool_directory">mail_spool_directory</a>
+ <a href="postconf.5.html#mailq_path">mailq_path</a> <a href="postconf.5.html#manpage_directory">manpage_directory</a> <a href="postconf.5.html#meta_directory">meta_directory</a> <a href="postconf.5.html#newaliases_path">newaliases_path</a>
+ <a href="postconf.5.html#queue_directory">queue_directory</a> <a href="postconf.5.html#readme_directory">readme_directory</a> <a href="postconf.5.html#sendmail_path">sendmail_path</a> <a href="postconf.5.html#shlib_directory">shlib_directory</a>
<a href="postconf.5.html#openssl_path">openssl_path</a>
- See the <a href="postconf.5.html">postconf(5)</a> manpage for a description of these parame-
+ See the <a href="postconf.5.html">postconf(5)</a> manpage for a description of these parame-
ters.
This feature was introduced with Postfix 3.0.
<b>WARN=</b><i>warning</i><b>_</b><i>flags</i>
- Specifies non-default gcc compiler warning options for use when
+ Specifies non-default gcc compiler warning options for use when
"make" is invoked in a source subdirectory only.
<b>LICENSE</b>
postcat - show Postfix queue file contents
<b>SYNOPSIS</b>
- <b>postcat</b> [<b>-bdehnoqv</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<i>files</i>...]
+ <b>postcat</b> [<b>-bdefhnoqv</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<i>files</i>...]
<b>DESCRIPTION</b>
The <a href="postcat.1.html"><b>postcat</b>(1)</a> command prints the contents of the named <i>files</i> in
This feature is available in Postfix 2.7 and later.
+ <b>-f</b> Prepend the file name to each output line.
+
<b>-h</b> Show message header content. The <b>-h</b> option produces output from
the beginning of the message up to, but not including, the first
non-header line.
# are known to support it.
# .IP \fB-DNO_EAI\fR
# Do not build with EAI (SMTPUTF8) support. By default, EAI
-# support is compiled in when the "pkg-config" command is
+# support is compiled in when the "pkgconf" or "pkg-config"
+# command are
# found, or the deprecated "icu-config" command.
# .IP \fB-DNO_INLINE\fR
# Do not require support for C99 "inline" functions. Instead,
case "$CCARGS" in
*-DNO_EAI*) CCARGS="$CCARGS "'-DDEF_SMTPUTF8_ENABLE=\"no\"';;
*) icu_cppflags=`((pkg-config --cflags icu-uc icu-i18n) ||
+ (pkgconf --cflags icu-uc icu-i18n) ||
(icu-config --cppflags)) 2>/dev/null` && {
icu_ldflags=`((pkg-config --libs icu-uc icu-i18n) ||
+ (pkgconf --libs icu-uc icu-i18n) ||
(icu-config --ldflags)) 2>/dev/null` && {
trap 'rm -f makedefs.test makedefs.test.[co]' 1 2 3 15
cat >makedefs.test.c <<'EOF'
are known to support it.
.IP \fB\-DNO_EAI\fR
Do not build with EAI (SMTPUTF8) support. By default, EAI
-support is compiled in when the "pkg\-config" command is
+support is compiled in when the "pkgconf" or "pkg\-config"
+command are
found, or the deprecated "icu\-config" command.
.IP \fB\-DNO_INLINE\fR
Do not require support for C99 "inline" functions. Instead,
.SH "SYNOPSIS"
.na
.nf
-\fBpostcat\fR [\fB\-bdehnoqv\fR] [\fB\-c \fIconfig_dir\fR] [\fIfiles\fR...]
+\fBpostcat\fR [\fB\-bdefhnoqv\fR] [\fB\-c \fIconfig_dir\fR] [\fIfiles\fR...]
.SH DESCRIPTION
.ad
.fi
Show message envelope content.
.sp
This feature is available in Postfix 2.7 and later.
+.IP \fB\-f\fR
+Prepend the file name to each output line.
.IP \fB\-h\fR
Show message header content. The \fB\-h\fR option produces
output from the beginning of the message up to, but not
an unknown or unimplemented command File smtpd smtpd c
inside more consistent Files proto master pipe pipe c
unimplemented commands in the SMTP server File smtpd smtpd c
+ cleanup cleanup h cleanup cleanup_extracted c
+ File postcat postcat c
ILP
xxfi
optionsv
+bdefhnoqv
mozilla
Dilyan
Palauzov
+pkgconf
test: $(TESTPROG)
tests: update template_test obs_template_test 2template_test \
- with-msgid-with-long-line_test \
- with-msgid-with-eoh-event_test \
- with-msgid-no-eoh-event_test \
- no-msgid-with-eoh-event_test \
- no-msgid-no-eoh-event_test \
- with-msgid-with-filter_test
+ with-message-id_test no-message-id_test
root_tests:
echo myhostname=example.com >>main.cf
echo header_from_format=standard >>main.cf
touch -t 197101010000 main.cf
- MAIL_CONFIG=. ./$(PROG) -SVzndump_templates >template_test.tmp
+ MAIL_CONFIG=. $(SHLIB_ENV) $(VALGRIND) ./$(PROG) -SVzndump_templates >template_test.tmp
diff template_test.ref template_test.tmp
- MAIL_CONFIG=. ./$(PROG) -SVzndump_templates \
+ MAIL_CONFIG=. $(SHLIB_ENV) $(VALGRIND) ./$(PROG) -SVzndump_templates \
-o bounce_template_file=template_test.ref > template_test.tmp
diff template_test.ref template_test.tmp
rm -f template_test.tmp main.cf
echo myhostname=example.com >>main.cf
echo header_from_format=obsolete >>main.cf
touch -t 197101010000 main.cf
- MAIL_CONFIG=. ./$(PROG) -SVzndump_templates >template_test.tmp
+ MAIL_CONFIG=. $(SHLIB_ENV) $(VALGRIND) ./$(PROG) -SVzndump_templates >template_test.tmp
diff obs_template_test.ref template_test.tmp
rm -f template_test.tmp main.cf
echo queue_directory=. >main.cf
echo myhostname=example.com >>main.cf
touch -t 197101010000 main.cf
- MAIL_CONFIG=. ./$(PROG) -SVzndump_templates \
+ MAIL_CONFIG=. $(SHLIB_ENV) $(VALGRIND) ./$(PROG) -SVzndump_templates \
-o bounce_template_file=2template_test.in > template_test.tmp
diff template_test.ref template_test.tmp
rm -f template_test.tmp main.cf
-with-msgid-with-long-line_test: bounce_notify_util_tester \
- msgfile-with-msgid-with-long-line logfile-with-msgid-with-long-line \
- with-msgid-with-long-line-no-thread.ref \
- with-msgid-with-long-line-with-thread.ref
+# This tests only the handling of an extracted message ID. The
+# tests for extracting a message ID belong with the cleanup code.
+with-message-id_test: bounce_notify_util_tester \
+ msgfile-with-message-id logfile-with-message-id \
+ with-message-id-no-thread.ref \
+ with-message-id-with-thread.ref
rm -rf queue main.cf
echo 'enable_threaded_bounces = no' >main.cf
echo 'queue_directory = queue' >>main.cf
echo 'myhostname = mail.example' >>main.cf
touch -t 197101010000 main.cf
mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-long-line queue/bounce/msgid
- cp msgfile-with-msgid-with-long-line queue/active/msgid
+ cp logfile-with-message-id queue/bounce/msgid
+ cp msgfile-with-message-id queue/active/msgid
$(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
-c. bounce active msgid 2>&1 | \
sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-long-line-no-thread.tmp
- diff with-msgid-with-long-line-no-thread.ref with-msgid-with-long-line-no-thread.tmp
- rm -f with-msgid-with-long-line-no-thread.tmp
+ > with-message-id-no-thread.tmp
+ diff with-message-id-no-thread.ref with-message-id-no-thread.tmp
+ rm -f with-message-id-no-thread.tmp
:
rm -rf queue main.cf
echo 'enable_threaded_bounces = yes' >main.cf
echo 'myhostname = mail.example' >>main.cf
touch -t 197101010000 main.cf
mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-long-line queue/bounce/msgid
- cp msgfile-with-msgid-with-long-line queue/active/msgid
+ cp logfile-with-message-id queue/bounce/msgid
+ cp msgfile-with-message-id queue/active/msgid
$(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
-c. bounce active msgid 2>&1 | \
sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-long-line-with-thread.tmp
- diff with-msgid-with-long-line-with-thread.ref with-msgid-with-long-line-with-thread.tmp
- rm -f with-msgid-with-long-line-with-thread.tmp
+ > with-message-id-with-thread.tmp
+ diff with-message-id-with-thread.ref with-message-id-with-thread.tmp
+ rm -f with-message-id-with-thread.tmp
rm -rf queue main.cf
-with-msgid-with-eoh-event_test: bounce_notify_util_tester \
- msgfile-with-msgid-with-eoh-event logfile-with-msgid-with-eoh-event \
- with-msgid-with-eoh-event-no-thread.ref \
- with-msgid-with-eoh-event-with-thread.ref
+no-message-id_test: bounce_notify_util_tester \
+ msgfile-no-message-id logfile-no-message-id \
+ no-message-id-no-thread.ref \
+ no-message-id-with-thread.ref
rm -rf queue main.cf
echo 'enable_threaded_bounces = no' >main.cf
echo 'queue_directory = queue' >>main.cf
echo 'myhostname = mail.example' >>main.cf
touch -t 197101010000 main.cf
mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-eoh-event queue/bounce/msgid
- cp msgfile-with-msgid-with-eoh-event queue/active/msgid
+ cp logfile-no-message-id queue/bounce/msgid
+ cp msgfile-no-message-id queue/active/msgid
$(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
-c. bounce active msgid 2>&1 | \
sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-eoh-event-no-thread.tmp
- diff with-msgid-with-eoh-event-no-thread.ref with-msgid-with-eoh-event-no-thread.tmp
- rm -f with-msgid-with-eoh-event-no-thread.tmp
+ > no-message-id-no-thread.tmp
+ diff no-message-id-no-thread.ref no-message-id-no-thread.tmp
+ rm -f no-message-id-no-thread.tmp
:
rm -rf queue main.cf
echo 'enable_threaded_bounces = yes' >main.cf
echo 'myhostname = mail.example' >>main.cf
touch -t 197101010000 main.cf
mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-eoh-event queue/bounce/msgid
- cp msgfile-with-msgid-with-eoh-event queue/active/msgid
+ cp logfile-no-message-id queue/bounce/msgid
+ cp msgfile-no-message-id queue/active/msgid
$(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
-c. bounce active msgid 2>&1 | \
sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-eoh-event-with-thread.tmp
- diff with-msgid-with-eoh-event-with-thread.ref with-msgid-with-eoh-event-with-thread.tmp
- rm -f with-msgid-with-eoh-event-with-thread.tmp
- rm -rf queue main.cf
-
-with-msgid-no-eoh-event_test: bounce_notify_util_tester \
- msgfile-with-msgid-no-eoh-event logfile-with-msgid-no-eoh-event \
- with-msgid-no-eoh-event-no-thread.ref \
- with-msgid-no-eoh-event-with-thread.ref
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = no' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-no-eoh-event queue/bounce/msgid
- cp msgfile-with-msgid-no-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-no-eoh-event-no-thread.tmp
- diff with-msgid-no-eoh-event-no-thread.ref with-msgid-no-eoh-event-no-thread.tmp
- rm -f with-msgid-no-eoh-event-no-thread.tmp
- :
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = yes' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-no-eoh-event queue/bounce/msgid
- cp msgfile-with-msgid-no-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-no-eoh-event-with-thread.tmp
- diff with-msgid-no-eoh-event-with-thread.ref with-msgid-no-eoh-event-with-thread.tmp
- rm -f with-msgid-no-eoh-event-with-thread.tmp
- rm -rf queue main.cf
-
-no-msgid-with-eoh-event_test: bounce_notify_util_tester \
- msgfile-no-msgid-with-eoh-event logfile-no-msgid-with-eoh-event \
- no-msgid-with-eoh-event-no-thread.ref \
- no-msgid-with-eoh-event-with-thread.ref
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = no' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-no-msgid-with-eoh-event queue/bounce/msgid
- cp msgfile-no-msgid-with-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > no-msgid-with-eoh-event-no-thread.tmp
- diff no-msgid-with-eoh-event-no-thread.ref no-msgid-with-eoh-event-no-thread.tmp
- rm -f no-msgid-with-eoh-event-no-thread.tmp
- :
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = yes' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-no-msgid-with-eoh-event queue/bounce/msgid
- cp msgfile-no-msgid-with-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > no-msgid-with-eoh-event-with-thread.tmp
- diff no-msgid-with-eoh-event-with-thread.ref no-msgid-with-eoh-event-with-thread.tmp
- rm -f no-msgid-with-eoh-event-with-thread.tmp
- rm -rf queue main.cf
-
-no-msgid-no-eoh-event_test: bounce_notify_util_tester \
- msgfile-no-msgid-no-eoh-event logfile-no-msgid-no-eoh-event \
- no-msgid-no-eoh-event-no-thread.ref \
- no-msgid-no-eoh-event-with-thread.ref
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = no' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-no-msgid-no-eoh-event queue/bounce/msgid
- cp msgfile-no-msgid-no-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > no-msgid-no-eoh-event-no-thread.tmp
- diff no-msgid-no-eoh-event-no-thread.ref no-msgid-no-eoh-event-no-thread.tmp
- rm -f no-msgid-no-eoh-event-no-thread.tmp
- :
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = yes' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-no-msgid-no-eoh-event queue/bounce/msgid
- cp msgfile-no-msgid-no-eoh-event queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > no-msgid-no-eoh-event-with-thread.tmp
- diff no-msgid-no-eoh-event-with-thread.ref no-msgid-no-eoh-event-with-thread.tmp
- rm -f no-msgid-no-eoh-event-with-thread.tmp
- rm -rf queue main.cf
-
-with-msgid-with-filter_test: bounce_notify_util_tester \
- msgfile-with-msgid-with-filter logfile-with-msgid-with-filter \
- with-msgid-with-filter-no-thread.ref \
- with-msgid-with-filter-with-thread.ref
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = no' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-filter queue/bounce/msgid
- cp msgfile-with-msgid-with-filter queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-filter-no-thread.tmp
- diff with-msgid-with-filter-no-thread.ref with-msgid-with-filter-no-thread.tmp
- rm -f with-msgid-with-filter-no-thread.tmp
- :
- rm -rf queue main.cf
- echo 'enable_threaded_bounces = yes' >main.cf
- echo 'queue_directory = queue' >>main.cf
- echo 'myhostname = mail.example' >>main.cf
- touch -t 197101010000 main.cf
- mkdir -p queue/active queue/bounce
- cp logfile-with-msgid-with-filter queue/bounce/msgid
- cp msgfile-with-msgid-with-filter queue/active/msgid
- $(SHLIB_ENV) $(VALGRIND) ./bounce_notify_util_tester \
- -c. bounce active msgid 2>&1 | \
- sed 's;msgid.[0-9]*/mail.example;msgid.unix-time/mail.example;' \
- > with-msgid-with-filter-with-thread.tmp
- diff with-msgid-with-filter-with-thread.ref with-msgid-with-filter-with-thread.tmp
- rm -f with-msgid-with-filter-with-thread.tmp
+ > no-message-id-with-thread.tmp
+ diff no-message-id-with-thread.ref no-message-id-with-thread.tmp
+ rm -f no-message-id-with-thread.tmp
rm -rf queue main.cf
depend: $(MAKES)
{
BOUNCE_INFO *bounce_info;
int rec_type;
- int prev_type;
- int all_headers_seen = 0;
int skip_message_segment = 0;
- int in_envelope = 1;
/*
* Bundle up a bunch of parameters and initialize information that will
DELIVER_LOCK_MODE) < 0)
msg_fatal("cannot get shared lock on %s: %m",
VSTREAM_PATH(bounce_info->orig_fp));
- for (prev_type = 0;
- (rec_type = rec_get(bounce_info->orig_fp, bounce_info->buf, 0)) > 0;
- prev_type = rec_type) {
+ while ((rec_type =
+ rec_get(bounce_info->orig_fp, bounce_info->buf, 0)) > 0) {
/*
* Postfix version dependent: data offset in SIZE record.
msg_warn("%s: no sender before message content record",
bounce_info->queue_id);
bounce_info->orig_offs = vstream_ftell(bounce_info->orig_fp);
- if (var_threaded_bounce == 0)
- skip_message_segment = 1;
- else
- in_envelope = 0;
+ skip_message_segment = 1;
}
/*
- * Extract Message-ID for threaded bounces.
+ * Extract Message-ID from extracted segment, for use in threaded
+ * bounces.
*/
- else if (in_envelope == 0
- && (rec_type == REC_TYPE_NORM || rec_type == REC_TYPE_CONT)) {
- const HEADER_OPTS *hdr;
- char *cp;
-
- /*
- * Skip records that we cannot use. Degrade if we could not
- * skip over the message content.
- */
- if (var_threaded_bounce == 0 || all_headers_seen
- || prev_type == REC_TYPE_CONT) {
- /* void */ ;
- }
-
- /*
- * Extract message-id header value.
- */
- else if (is_header(STR(bounce_info->buf))) {
- if ((hdr = header_opts_find(
- vstring_str(bounce_info->buf))) != 0
- && hdr->type == HDR_MESSAGE_ID) {
- vstring_truncate(bounce_info->buf,
- trimblanks(STR(bounce_info->buf),
- LEN(bounce_info->buf))
- - STR(bounce_info->buf));
- cp = STR(bounce_info->buf) + strlen(hdr->name) + 1;
- while (ISSPACE(*cp))
- cp++;
- if (*cp == '<' && vstring_end(bounce_info->buf)[-1] == '>')
- vstring_strcpy(bounce_info->orig_msgid, cp);
- else
- msg_warn("%s: ignoring malformed Message-ID",
- bounce_info->queue_id);
+ else if (rec_type == REC_TYPE_ATTR && var_threaded_bounce) {
+ char *cp = STR(bounce_info->buf);
+ ssize_t len = sizeof(MAIL_ATTR_MESSAGE_ID);
+ char *err;
+
+ if (strncmp(cp, MAIL_ATTR_MESSAGE_ID "=", len) == 0) {
+ cp += len;
+ if ((err = extpar(&cp, "<>", EXTPAR_FLAG_NONE)) != 0) {
+ msg_warn("%s: malformed Message-ID attribute: %s",
+ bounce_info->queue_id, err);
+ myfree(err);
+ } else {
+ vstring_sprintf(bounce_info->orig_msgid, "<%s>", cp);
}
}
-
- /*
- * Skip remainder of multiline header.
- */
- else if (ISSPACE(*STR(bounce_info->buf))) {
- /* void */ ;
- }
-
- /*
- * Start of body.
- */
- else {
- all_headers_seen = 1;
- skip_message_segment = 1;
- }
- }
-
- /*
- * In case we ever want to process records from the extracted
- * segment, and in case there was no "start of body" event.
- */
- else if (rec_type == REC_TYPE_XTRA) {
- if (VSTRING_LEN(bounce_info->orig_msgid) == 0)
- if (var_threaded_bounce)
- all_headers_seen = 1;
- in_envelope = 1;
}
/*
if (bounce_info->orig_offs > 0
&& bounce_info->arrival_time > 0
&& VSTRING_LEN(bounce_info->sender) > 0
- && (var_threaded_bounce == 0 || all_headers_seen
+ && (var_threaded_bounce == 0
|| VSTRING_LEN(bounce_info->orig_msgid) > 0)) {
break;
}
recipient = rcpt-address
original_recipient = rcpt-orig_addr
-offset = 272
+offset = 281
notify_flags = rcpt-dsn_notify
status = dsn-status
action = dsn-action
--- /dev/null
+
+recipient = rcpt-address
+original_recipient = rcpt-orig_addr
+offset = 280
+notify_flags = rcpt-dsn_notify
+status = dsn-status
+action = dsn-action
+diag_type = dsn-dtype
+diag_text = dsn-dtext
+mta_type = dsn-mtype
+mta_mname = dsn-mname
+reason = dsn-reason
+
Original-Envelope-Id: TEST-ENVID
X-Postfix-Queue-ID: msgid
X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sat, 05 Dec 2020 13:31:48 -0500 (EST)
+Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
Content-Type: message/rfc822
Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CpJ7m6tprz4w4Y; Sat, 5 Dec 2020 18:31:48 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-no-eoh-event
+Received: by wzv.porcupine.org (Postfix, from userid 1000)
+ id 4X3vqF3bwhz5Yqq; Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+From: sender@sender.example
+To: recipient@recipient.example
+Subject: no-message-id
+
+asdasdd
--msgid.unix-time/mail.example--
Original-Envelope-Id: TEST-ENVID
X-Postfix-Queue-ID: msgid
X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
+Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
Content-Type: message/rfc822
Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY0myNz4w4g; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-no-eoh-event
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
+Received: by wzv.porcupine.org (Postfix, from userid 1000)
+ id 4X3vqF3bwhz5Yqq; Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+From: sender@sender.example
+To: recipient@recipient.example
+Subject: no-message-id
+
+asdasdd
--msgid.unix-time/mail.example--
Original-Envelope-Id: TEST-ENVID
X-Postfix-Queue-ID: msgid
X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
+Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
Content-Type: message/rfc822
Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY10M8z4w4l; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-with-eoh-event
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-
-body text
+Received: by wzv.porcupine.org (Postfix, from userid 1000)
+ id 4X3vqF3RdBz5Yqn; Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+From: sender@sender.example
+To: recipient@recipient.example
+Subject: existing-message-id
+Message-Id: <existing>
+Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+
+asdasdd
--msgid.unix-time/mail.example--
From: Mail Delivery System <MAILER-DAEMON>
Subject: Undelivered Mail Returned to Sender
To: test-recipient
-References: <12345@mta-name.example>
-In-Reply-To: <12345@mta-name.example>
+References: <existing>
+In-Reply-To: <existing>
Auto-Submitted: auto-replied
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
Original-Envelope-Id: TEST-ENVID
X-Postfix-Queue-ID: msgid
X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sat, 05 Dec 2020 13:31:48 -0500 (EST)
+Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
Content-Type: message/rfc822
Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CpJ7m6tprz4w4Y; Sat, 5 Dec 2020 18:31:48 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-no-eoh-event
+Received: by wzv.porcupine.org (Postfix, from userid 1000)
+ id 4X3vqF3RdBz5Yqn; Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+From: sender@sender.example
+To: recipient@recipient.example
+Subject: existing-message-id
+Message-Id: <existing>
+Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
+
+asdasdd
--msgid.unix-time/mail.example--
+++ /dev/null
-From: Mail Delivery System <MAILER-DAEMON>
-Subject: Undelivered Mail Returned to Sender
-To: test-recipient
-References: <12345@mta-name.example>
-In-Reply-To: <12345@mta-name.example>
-Auto-Submitted: auto-replied
-MIME-Version: 1.0
-Content-Type: multipart/report; report-type=delivery-status;
- boundary="msgid.unix-time/mail.example"
-Content-Transfer-Encoding: 7bit
-
-This is a MIME-encapsulated message.
-
---msgid.unix-time/mail.example
-Content-Description: Notification
-Content-Type: text/plain; charset=us-ascii
-
-
-<rcpt-address> (expanded from <rcpt-orig_addr>): dsn-reason
-
---msgid.unix-time/mail.example
-Content-Description: Delivery report
-Content-Type: message/delivery-status
-
-Reporting-MTA: dns; mail.example
-Original-Envelope-Id: TEST-ENVID
-X-Postfix-Queue-ID: msgid
-X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
-
-Final-Recipient: rfc822; rcpt-address
-Original-Recipient: rfc822; rcpt-orig_addr
-Action: failed
-Status: dsn-status
-Remote-MTA: dsn-mtype; dsn-mname
-Diagnostic-Code: dsn-dtype; dsn-dtext
-
---msgid.unix-time/mail.example
-Content-Description: Undelivered Message
-Content-Type: message/rfc822
-
-Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY0myNz4w4g; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-no-eoh-event
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-
---msgid.unix-time/mail.example--
+++ /dev/null
-From: Mail Delivery System <MAILER-DAEMON>
-Subject: Undelivered Mail Returned to Sender
-To: test-recipient
-References: <12345@mta-name.example>
-In-Reply-To: <12345@mta-name.example>
-Auto-Submitted: auto-replied
-MIME-Version: 1.0
-Content-Type: multipart/report; report-type=delivery-status;
- boundary="msgid.unix-time/mail.example"
-Content-Transfer-Encoding: 7bit
-
-This is a MIME-encapsulated message.
-
---msgid.unix-time/mail.example
-Content-Description: Notification
-Content-Type: text/plain; charset=us-ascii
-
-
-<rcpt-address> (expanded from <rcpt-orig_addr>): dsn-reason
-
---msgid.unix-time/mail.example
-Content-Description: Delivery report
-Content-Type: message/delivery-status
-
-Reporting-MTA: dns; mail.example
-Original-Envelope-Id: TEST-ENVID
-X-Postfix-Queue-ID: msgid
-X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
-
-Final-Recipient: rfc822; rcpt-address
-Original-Recipient: rfc822; rcpt-orig_addr
-Action: failed
-Status: dsn-status
-Remote-MTA: dsn-mtype; dsn-mname
-Diagnostic-Code: dsn-dtype; dsn-dtext
-
---msgid.unix-time/mail.example
-Content-Description: Undelivered Message
-Content-Type: message/rfc822
-
-Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY10M8z4w4l; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-with-eoh-event
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-
-body text
-
---msgid.unix-time/mail.example--
+++ /dev/null
-From: Mail Delivery System <MAILER-DAEMON>
-Subject: Undelivered Mail Returned to Sender
-To: test-recipient
-Auto-Submitted: auto-replied
-MIME-Version: 1.0
-Content-Type: multipart/report; report-type=delivery-status;
- boundary="msgid.unix-time/mail.example"
-Content-Transfer-Encoding: 7bit
-
-This is a MIME-encapsulated message.
-
---msgid.unix-time/mail.example
-Content-Description: Notification
-Content-Type: text/plain; charset=us-ascii
-
-
-<rcpt-address> (expanded from <rcpt-orig_addr>): dsn-reason
-
---msgid.unix-time/mail.example
-Content-Description: Delivery report
-Content-Type: message/delivery-status
-
-Reporting-MTA: dns; mail.example
-Original-Envelope-Id: TEST-ENVID
-X-Postfix-Queue-ID: msgid
-X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
-
-Final-Recipient: rfc822; rcpt-address
-Original-Recipient: rfc822; rcpt-orig_addr
-Action: failed
-Status: dsn-status
-Remote-MTA: dsn-mtype; dsn-mname
-Diagnostic-Code: dsn-dtype; dsn-dtext
-
---msgid.unix-time/mail.example
-Content-Description: Undelivered Message
-Content-Type: message/rfc822
-
-Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY194lz4w4n; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Whatever: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-with-long-line
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-
---msgid.unix-time/mail.example--
+++ /dev/null
-From: Mail Delivery System <MAILER-DAEMON>
-Subject: Undelivered Mail Returned to Sender
-To: test-recipient
-References: <12345@mta-name.example>
-In-Reply-To: <12345@mta-name.example>
-Auto-Submitted: auto-replied
-MIME-Version: 1.0
-Content-Type: multipart/report; report-type=delivery-status;
- boundary="msgid.unix-time/mail.example"
-Content-Transfer-Encoding: 7bit
-
-This is a MIME-encapsulated message.
-
---msgid.unix-time/mail.example
-Content-Description: Notification
-Content-Type: text/plain; charset=us-ascii
-
-
-<rcpt-address> (expanded from <rcpt-orig_addr>): dsn-reason
-
---msgid.unix-time/mail.example
-Content-Description: Delivery report
-Content-Type: message/delivery-status
-
-Reporting-MTA: dns; mail.example
-Original-Envelope-Id: TEST-ENVID
-X-Postfix-Queue-ID: msgid
-X-Postfix-Sender: rfc822; sender@sender.example
-Arrival-Date: Sun, 29 Nov 2020 10:30:41 -0500 (EST)
-
-Final-Recipient: rfc822; rcpt-address
-Original-Recipient: rfc822; rcpt-orig_addr
-Action: failed
-Status: dsn-status
-Remote-MTA: dsn-mtype; dsn-mname
-Diagnostic-Code: dsn-dtype; dsn-dtext
-
---msgid.unix-time/mail.example
-Content-Description: Undelivered Message
-Content-Type: message/rfc822
-
-Return-Path: <sender@sender.example>
-Received: by wzv.porcupine.org (Postfix, from userid 0)
- id 4CkXPY194lz4w4n; Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-From: <sender@sender.example>
-To: <recipient@recipient.example>
-Whatever: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-Message-Id: <12345@mta-name.example>
-Subject: with-msgid-with-long-line
-Date: Sun, 29 Nov 2020 15:30:41 +0000 (UTC)
-
---msgid.unix-time/mail.example--
char *hdr_rewrite_context; /* header rewrite context */
char *filter; /* from header/body patterns */
char *redirect; /* from header/body patterns */
+ char *message_id; /* from Message-ID header */
char *dsn_envid; /* DSN envelope ID */
int dsn_ret; /* DSN full/hdrs */
int dsn_notify; /* DSN never/delay/fail/success */
cleanup_out_string(state, REC_TYPE_FILT, state->filter);
if (state->redirect != 0)
cleanup_out_string(state, REC_TYPE_RDR, state->redirect);
+ if (state->message_id != 0) {
+ cleanup_out_format(state, REC_TYPE_ATTR, "%s=%s",
+ MAIL_ATTR_MESSAGE_ID, state->message_id);
+ }
if ((encoding = nvtable_find(state->attr, MAIL_ATTR_ENCODING)) != 0)
cleanup_out_format(state, REC_TYPE_ATTR, "%s=%s",
MAIL_ATTR_ENCODING, encoding);
cleanup_addr_bcc(state, var_always_bcc);
/*
- * Flush non-Milter header/body_checks BCC recipients. Clear hbc_rcpt
- * so that it can be used for other purposes.
+ * Flush non-Milter header/body_checks BCC recipients. Clear hbc_rcpt so
+ * that it can be used for other purposes.
*/
if (state->hbc_rcpt) {
if (CLEANUP_OUT_OK(state) && state->recip != 0) {
*/
else {
state->headers_seen |= (1 << hdr_opts->type);
- if (hdr_opts->type == HDR_MESSAGE_ID)
+ if (hdr_opts->type == HDR_MESSAGE_ID) {
+ ssize_t len;
+
msg_info("%s: message-id=%s", state->queue_id, hdrval);
+ if (state->message_id == 0 && (len = balpar(hdrval, "<>")) > 0)
+ /* This Message ID may end up in threaded bounces. */
+ state->message_id = printable(mystrndup(hdrval, len), ' ');
+ }
if (hdr_opts->type == HDR_RESENT_MESSAGE_ID)
msg_info("%s: resent-message-id=%s", state->queue_id, hdrval);
if (hdr_opts->type == HDR_RECEIVED) {
vstring_str(state->temp1));
state->headers_seen |= (1 << (state->resent[0] ?
HDR_RESENT_MESSAGE_ID : HDR_MESSAGE_ID));
+ if (state->resent[0] == 0 && state->message_id == 0)
+ state->message_id = concatenate("<", vstring_str(state->temp1),
+ ">", (char *) 0);
+
}
if ((state->headers_seen & (1 << HDR_MESSAGE_ID)) == 0)
msg_info("%s: message-id=<>", state->queue_id);
state->hdr_rewrite_context = MAIL_ATTR_RWR_LOCAL;
state->filter = 0;
state->redirect = 0;
+ state->message_id = 0;
state->dsn_envid = 0;
state->dsn_ret = 0;
state->dsn_notify = 0;
myfree(state->filter);
if (state->redirect)
myfree(state->redirect);
+ if (state->message_id)
+ myfree(state->message_id);
if (state->dsn_envid)
myfree(state->dsn_envid);
if (state->dsn_orcpt)
#define MAIL_ATTR_ORG_NONE "unknown" /* origin unknown */
#define MAIL_ATTR_ORG_LOCAL "local" /* local submission */
+#define MAIL_ATTR_MESSAGE_ID "message_id" /* Used for threaded bounce */
+
/*
* XCLIENT/XFORWARD in SMTP.
*/
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20240902"
+#define MAIL_RELEASE_DATE "20240917"
#define MAIL_VERSION_NUMBER "3.10"
#ifdef SNAPSHOT
/* SUMMARY
/* show Postfix queue file contents
/* SYNOPSIS
-/* \fBpostcat\fR [\fB-bdehnoqv\fR] [\fB-c \fIconfig_dir\fR] [\fIfiles\fR...]
+/* \fBpostcat\fR [\fB-bdefhnoqv\fR] [\fB-c \fIconfig_dir\fR] [\fIfiles\fR...]
/* DESCRIPTION
/* The \fBpostcat\fR(1) command prints the contents of the
/* named \fIfiles\fR in human-readable form. The files are
/* Show message envelope content.
/* .sp
/* This feature is available in Postfix 2.7 and later.
+/* .IP \fB-f\fR
+/* Prepend the file name to each output line.
/* .IP \fB-h\fR
/* Show message header content. The \fB-h\fR option produces
/* output from the beginning of the message up to, but not
#define PC_FLAG_PRINT_RTYPE_DEC (1<<5) /* print decimal record type */
#define PC_FLAG_PRINT_RTYPE_SYM (1<<6) /* print symbolic record type */
#define PC_FLAG_RAW (1<<7) /* don't follow pointers */
+#define PC_FLAG_PRINT_PATHNAME (1<<8) /* print pathname */
#define PC_MASK_PRINT_TEXT (PC_FLAG_PRINT_HEADER | PC_FLAG_PRINT_BODY)
#define PC_MASK_PRINT_ALL (PC_FLAG_PRINT_ENV | PC_MASK_PRINT_TEXT)
* changed.
*/
#define PRINT_MARKER(flags, fp, offset, type, text) do { \
+ if ((flags) & PC_FLAG_PRINT_PATHNAME) \
+ vstream_printf("%s: ", VSTREAM_PATH(fp)); \
if ((flags) & PC_FLAG_PRINT_OFFSET) \
vstream_printf("%9lu ", (unsigned long) (offset)); \
if (flags & PC_FLAG_PRINT_RTYPE_DEC) \
} while (0)
#define PRINT_RECORD(flags, offset, type, value) do { \
+ if ((flags) & PC_FLAG_PRINT_PATHNAME) \
+ vstream_printf("%s: ", VSTREAM_PATH(fp)); \
if ((flags) & PC_FLAG_PRINT_OFFSET) \
vstream_printf("%9lu ", (unsigned long) (offset)); \
if (flags & PC_FLAG_PRINT_RTYPE_DEC) \
*/
if (do_print == 0)
continue;
+ if (flags & PC_FLAG_PRINT_PATHNAME)
+ vstream_printf("%s: ", VSTREAM_PATH(fp));
if (flags & PC_FLAG_PRINT_OFFSET)
vstream_printf("%9lu ", (unsigned long) offset);
if (flags & PC_FLAG_PRINT_RTYPE_DEC)
/*
* Parse JCL.
*/
- while ((ch = GETOPT(argc, argv, "bc:dehoqrs:v")) > 0) {
+ while ((ch = GETOPT(argc, argv, "bc:defhoqrs:v")) > 0) {
switch (ch) {
case 'b':
flags |= PC_FLAG_PRINT_BODY;
case 'd':
flags |= PC_FLAG_PRINT_RTYPE_DEC;
break;
+ case 'f':
+ flags |= PC_FLAG_PRINT_PATHNAME;
+ break;
case 'e':
flags |= PC_FLAG_PRINT_ENV;
break;