2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-22 01:49:47 +00:00

postfix-3.10-20240917

This commit is contained in:
Wietse Z Venema 2024-09-17 00:00:00 -05:00 committed by Viktor Dukhovni
parent e6eb5ba2b6
commit 7655cf261d
37 changed files with 228 additions and 534 deletions

View File

@ -28200,3 +28200,23 @@ Apologies for any names omitted.
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.

View File

@ -6,6 +6,12 @@ Wish list:
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,
@ -16,6 +22,13 @@ Wish list:
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.

View File

@ -66,8 +66,9 @@ MAKEDEFS(1) MAKEDEFS(1)
<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.

View File

@ -11,7 +11,7 @@ POSTCAT(1) POSTCAT(1)
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
@ -41,6 +41,8 @@ POSTCAT(1) POSTCAT(1)
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.

View File

@ -61,7 +61,8 @@
# 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,
@ -878,8 +879,10 @@ esac
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'

View File

@ -64,7 +64,8 @@ By default, EPOLL support is compiled in on platforms that
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,

View File

@ -8,7 +8,7 @@ show Postfix queue file contents
.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
@ -39,6 +39,8 @@ Print the decimal type of each record.
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

View File

@ -128,3 +128,5 @@ proto proto mysql_table proto pgsql_table proto ldap_table
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

View File

@ -1841,3 +1841,4 @@ foqvx
ILP
xxfi
optionsv
bdefhnoqv

View File

@ -81,3 +81,4 @@ cgi
mozilla
Dilyan
Palauzov
pkgconf

View File

@ -39,12 +39,7 @@ Makefile: Makefile.in
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:
@ -72,9 +67,9 @@ template_test: $(PROG) template_test.ref
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
@ -84,7 +79,7 @@ obs_template_test: $(PROG) obs_template_test.ref
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
@ -92,29 +87,31 @@ obs_template_test: $(PROG) obs_template_test.ref
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
@ -122,34 +119,34 @@ with-msgid-with-long-line_test: bounce_notify_util_tester \
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
@ -157,154 +154,14 @@ with-msgid-with-eoh-event_test: bounce_notify_util_tester \
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)

View File

@ -230,10 +230,7 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
{
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
@ -322,9 +319,8 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
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.
@ -368,76 +364,28 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
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;
}
/*
* Extract Message-ID for 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);
}
}
/*
* 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.
* Extract Message-ID from extracted segment, for use in threaded
* bounces.
*/
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;
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);
}
}
}
/*
@ -446,7 +394,7 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
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;
}

View File

@ -1,7 +1,7 @@
recipient = rcpt-address
original_recipient = rcpt-orig_addr
offset = 272
offset = 281
notify_flags = rcpt-dsn_notify
status = dsn-status
action = dsn-action

View File

@ -0,0 +1,13 @@
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

Binary file not shown.

Binary file not shown.

View File

@ -24,7 +24,7 @@ Reporting-MTA: dns; mail.example
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
@ -38,11 +38,12 @@ Content-Description: Undelivered Message
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--

View File

@ -24,7 +24,7 @@ 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)
Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
@ -38,12 +38,12 @@ 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)
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--

View File

@ -24,7 +24,7 @@ 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)
Arrival-Date: Wed, 11 Sep 2024 18:05:54 -0400 (EDT)
Final-Recipient: rfc822; rcpt-address
Original-Recipient: rfc822; rcpt-orig_addr
@ -38,14 +38,14 @@ 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)
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)
body text
asdasdd
--msgid.unix-time/mail.example--

View File

@ -1,8 +1,8 @@
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;
@ -26,7 +26,7 @@ Reporting-MTA: dns; mail.example
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
@ -40,11 +40,14 @@ Content-Description: Undelivered Message
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--

View File

@ -1,51 +0,0 @@
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--

View File

@ -1,53 +0,0 @@
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--

View File

@ -1,50 +0,0 @@
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--

View File

@ -1,52 +0,0 @@
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--

View File

@ -94,6 +94,7 @@ typedef struct CLEANUP_STATE {
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 */

View File

@ -184,6 +184,10 @@ void cleanup_extracted_process(CLEANUP_STATE *state, int type,
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);
@ -307,8 +311,8 @@ void cleanup_extracted_finish(CLEANUP_STATE *state)
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) {

View File

@ -626,8 +626,14 @@ static void cleanup_header_callback(void *context, int header_class,
*/
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) {
@ -730,6 +736,10 @@ static void cleanup_header_done_callback(void *context)
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);

View File

@ -117,6 +117,7 @@ CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src)
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;
@ -179,6 +180,8 @@ void cleanup_state_free(CLEANUP_STATE *state)
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)

View File

@ -260,6 +260,8 @@ extern char *mail_pathname(const char *, const char *);
#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.
*/

View File

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

View File

@ -4,7 +4,7 @@
/* 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
@ -33,6 +33,8 @@
/* 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
@ -147,6 +149,7 @@
#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)
@ -244,6 +247,8 @@ static void postcat(VSTREAM *fp, VSTRING *buffer, int flags)
* 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) \
@ -253,6 +258,8 @@ static void postcat(VSTREAM *fp, VSTRING *buffer, int flags)
} 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) \
@ -363,6 +370,8 @@ static void postcat(VSTREAM *fp, VSTRING *buffer, int flags)
*/
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)
@ -491,7 +500,7 @@ int main(int argc, char **argv)
/*
* 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;
@ -503,6 +512,9 @@ int main(int argc, char **argv)
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;