Nach dem Upgrade auf Postfix 3.5.6 werden virtuelle Alias-Zuordnungen für mehrere Empfänger als einzelne Namen behandelt, die ein Komma enthalten

Nach dem Upgrade auf Postfix 3.5.6 werden virtuelle Alias-Zuordnungen für mehrere Empfänger als einzelne Namen behandelt, die ein Komma enthalten

Gerade von Debian Wheezy Postfix 2.9.6 auf Debian Bullseye Postfix 3.5.6 aktualisiert.

Wir verwenden virtuelle Alias-Zuordnungen für mehrere Empfänger, wie diese hier:

[email geschützt]@theidsp-network.inter-realm.net,[email geschützt]

Dabei werden Mails an[email geschützt]werden weitergeleitet an [email geschützt]und zu[email geschützt]. Es funktioniert seit Jahren einwandfrei.

Wir haben zuvor gelernt vonhttp://www.postfix.org/virtual.5.htmldass die Reihenfolge der mehreren Empfänger wichtig ist. „Wenn das Ergebnis die Form @otherdomain hat, wird das Ergebnis zum selben Benutzer in otherdomain. Dies funktioniert nur für die erste Adresse in einem Suchergebnis mit mehreren Adressen.“ Daher setzen wir das Platzhalterzeichen @recipient an den Anfang.

Nach dem Postfix-Upgrade scheint der SMTP-Dienst zu versuchen, die E-Mail an einen einzelnen Empfänger weiterzuleiten.[email geschützt],jim"@space-port-pros.com.

Da der Benutzer nicht existiert, landet diese Mail im Catchall.

Hier ist eine Ausgabe aus dem Mail-Log:

Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: connect to subsystem private/proxymap
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: send attr request = lookup
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: send attr table = mysql:/etc/postfix/mysql-virtual_forwardings.cf
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: send attr flags = 540736
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: send attr key = [email protected]
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: private/proxymap socket: wanted attribute: status
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: input attribute name: status
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: input attribute value: 0
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: private/proxymap socket: wanted attribute: value
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: input attribute name: value
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: input attribute value: @theidsp-network.inter-realm.net,[email protected]
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: private/proxymap socket: wanted attribute: (list terminator)
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: input attribute name: (end)
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: dict_proxy_lookup: table=mysql:/etc/postfix/mysql-virtual_forwardings.cf flags=lock|fold_fix|utf8_request
 [email protected] -> status=0 [email protected],[email protected]
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: maps_find: virtual_alias_maps: proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf(0,lock|fold_fix|utf8
_request): [email protected] = @theidsp-network.inter-realm.net,[email protected]
Apr 14 10:45:17 mail7-057 sslmx/smtpd[8640]: mail_addr_find: [email protected] -> @theidsp-network.inter-realm.net,[email protected]
...
Apr 14 10:45:17 mail7-057 postfix/smtp[8669]: 55E65C895: to=<"[email protected],jim"@space-port-pros.com>, orig_to=<jimays@theids
p.net>, relay=mail7-052.idsp56.net[192.168.56.52]:52025, delay=0.06, delays=0.01/0.02/0.01/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 5F628
A882)

Hier sind Ausschnitte aus einem Protokoll vom Juni, die zeigen, dass die Weiterleitung zuvor zu zwei unterschiedlichen Zeilen mit status=sent führte, eine über SMTP-Transport an[email geschützt]und eine über lmtp-g Transport nach[email geschützt].

Jun 20 06:30:58 mail7-057 sslmx/smtpd[28956]: connect from mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:30:58 mail7-057 sslmx/smtpd[28956]: Anonymous TLS connection established from mail7-055.idsp56.net[192.168.56.55]: TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)
Jun 20 06:30:58 mail7-057 sslmx/smtpd[28956]: B91A42BE4: client=mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:30:58 mail7-057 cleanup-srs/cleanup[28963]: B91A42BE4: message-id=<[email protected]>
Jun 20 06:30:58 mail7-057 postfix/qmgr[19327]: B91A42BE4: from=<SRS0=Z5tX=LO=connect.match.com=bounces-MA-1-858-ea0868c4-498f-401a-b6f1-c3ce593994a7@trumail7.inter-dimensional-space-port.net>, size=47942, nrcpt=2 (queue active)
Jun 20 06:30:58 mail7-057 sslmx/smtpd[28956]: disconnect from mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:30:58 mail7-057 postfix/smtp[28966]: Anonymous TLS connection established to mail7-052.idsp56.net[192.168.56.52]:52025: TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)
Jun 20 06:30:58 mail7-057 lmtp-g/lmtp[28965]: Trusted TLS connection established to lmtp7-g.inter-dimensional-space-port.net[216.184.19.228]:64007: TLSv1 with cipher AES256-SHA (256/256 bits)
Jun 20 06:30:58 mail7-057 postfix/smtp[28966]: B91A42BE4: to=<[email protected]>, relay=mail7-052.idsp56.net[192.168.56.52]:52025, delay=0.16, delays=0.04/0.02/0.02/0.08, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as C66855B94)
Jun 20 06:30:59 mail7-057 sslmx/smtpd[28956]: connect from mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:30:59 mail7-057 sslmx/smtpd[28956]: Anonymous TLS connection established from mail7-055.idsp56.net[192.168.56.55]: TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)
Jun 20 06:30:59 mail7-057 sslmx/smtpd[28956]: 9D1D12CA5: client=mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:30:59 mail7-057 cleanup-srs/cleanup[28963]: 9D1D12CA5: message-id=<[email protected]>
Jun 20 06:30:59 mail7-057 postfix/qmgr[19327]: 9D1D12CA5: from=<SRS0=Z5tX=LO=connect.match.com=bounces-MA-1-858-ea0868c4-498f-401a-b6f1-c3ce593994a7@trumail7.inter-dimensional-space-port.net>, size=50423, nrcpt=1 (queue active)
Jun 20 06:30:59 mail7-057 sslmx/smtpd[28956]: disconnect from mail7-055.idsp56.net[192.168.56.55]
Jun 20 06:31:07 mail7-057 lmtp-g/lmtp[28965]: B91A42BE4: to=<[email protected]>, relay=lmtp7-g.inter-dimensional-space-port.net[216.184.19.228]:64007, delay=8.9, delays=0.04/0.02/0.12/8.7, dsn=2.0.0, status=sent (250 Ok)
Jun 20 06:31:07 mail7-057 postfix/qmgr[19327]: B91A42BE4: removed

Derhttp://www.postfix.org/COMPATIBILITY_README.htmlhat nichts Konkretes über eine Verhaltensänderung in virtuellen Aliaskarten erwähnt.

mysql-virtual_forwardings.cf liegt in einem von ISPConfig erstellten Standardformat vor.

user = ispconfig
password = redacted
dbname = idsp_mail7_062
table = mail_forwarding
select_field = destination
where_field = source
additional_conditions = and active = 'y' and server_id = 81
hosts = 192.168.56.121

Der relevante Teil von main.cf, der die Datei aufruft, ist:

virtual_alias_maps = regexp:/etc/postfix/regexp-virtual_forwardings__admin.cf, proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, proxy:mysql:/etc
/postfix/mysql-virtual_email2email.cf

Die Tabelle „virtual_forwardings“ sieht folgendermaßen aus:

MariaDB [idsp_mail7_057]> select * from mail_forwarding where source='[email protected]';
+---------------+------------+-------------+---------------+----------------+----------------+-----------+--------------------+----------------------------------------------------------+---------+--------+
| forwarding_id | sys_userid | sys_groupid | sys_perm_user | sys_perm_group | sys_perm_other | server_id | source             | destination                                              | type    | active |
+---------------+------------+-------------+---------------+----------------+----------------+-----------+--------------------+----------------------------------------------------------+---------+--------+
|           201 |          2 |           2 | riud          | riud           |                |        69 | [email protected] | @theidsp-network.inter-realm.net,[email protected] | forward | y      |
+---------------+------------+-------------+---------------+----------------+----------------+-----------+--------------------+----------------------------------------------------------+---------+--------+
1 row in set (0.001 sec)

Erweiterte Protokollierung auf smtpd -v -v und dies wird im Protokoll angezeigt:

dict_proxy_lookup: table=mysql:/etc/postfix/mysql-virtual_forwardings.cf flags=lock|fold_fix|utf8_request
 [email protected] -> status=0 [email protected],[email protected]
Apr 20 16:44:37 mail7-057 sslmx/smtpd[9561]: maps_find: virtual_alias_maps: proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf(0,lock|fold_fix|utf8
_request): [email protected] = @theidsp-network.inter-realm.net,[email protected]
Apr 20 16:44:37 mail7-057 sslmx/smtpd[9561]: mail_addr_find: [email protected] -> @theidsp-network.inter-realm.net,[email protected]

Es scheint also, dass die Suche korrekt abläuft, und trotzdem erfolgt nur eine statt zwei Versendungen.

Antwort1

Es ist nur dann darauf gestoßen, wenn die Form "@otherdomain" verwendet wurde, alsokönnte umgangen werden:

  1. indem Sie von der veralteten table/select_field/..Form zur Angabe queryin Ihrer mysql-*.cfDatei migrieren und in SQL nachahmen, was Postfix nicht mehr tut, oder
  2. indem Sie Ihre Tabelle dauerhaft ändern, um diese Aliase auf die vollständige user@domainForm zu erweitern.

Beide Problemumgehungen würden eine Abfrage beinhalten, die etwas enthält wie „ CASE WHEN destination LIKE "@%" THEN SUBSTR(source,1,INSTR(source,"@"))||destination ELSE destination ENDSQL einfach das Quellpostfach verketten lassen, wenn die Suche mit @ beginnt.“ Überlegen Sie genau, was mit Adresserweiterungen wie geschehen soll user+extensions@onedomain, falls Sie diese verwenden!

Bei der Suche nach möglichen Gründen für das geänderte Verhalten stieß ich auf einige RFC822-Anführungszeichen-Überarbeitungen, dieMairelevant sein, CHANGELOG erwähnt:

eine Adresserweiterung korrekt propagieren

von „aa bb+ext“@example.com bis „cc dd+ext“@other.example

Man könnte zwar ebenso argumentieren, dass das GanzeFunktion, die nur funktioniert, wenn sie für den ersten Eintrag in einer Adressliste ausgeführt wirdDas ist in erster Linie ein Fehler. Ein solcher Nachbearbeitungsschritt sollte auf alle Elemente des Ergebnissatzes angewendet werden, ohne dass es zu möglichen Mehrdeutigkeiten zwischen Postfach/Erweiterung/Trennzeichen kommt.


Ich konnte diese Verwirrung zwischen Listen- und Postfachtypen in Postfix 3.4.13 (wie von Ubuntu verteilt) reproduzieren, indem ich entweder queryund verwendete table/select_field/.., mit oder ohneProxy-Karte, und entweder mit mehrzeiligem Ergebnis oder mit einem durch Kommas getrennten Ergebnis. Möglicherweise können Sie die folgenden fast funktionierenden Schritte in einen funktionierenden Reproduzierer integrieren, um sie upstream zu melden. OffensichtlichFühren Sie diese Schritte nur auf einer Testbox aus.

exit 1  # DATA LOSS! ONLY RUN ON VIRTUAL MACHINE FOR TESTING!
postconf virtual_transport=error
postconf virtual_alias_maps=proxy:sqlite:/etc/postfix/repro.cf
postconf virtual_alias_domains=e.invalid
postconf debug_peer_list=[::1]
sqlite3 /etc/postfix/repro.sqlite3 <<'EOF'
CREATE TABLE repro(s text, d text);
INSERT INTO repro(s,d) VALUES ("[email protected]", "@e.invalid,[email protected]");
INSERT INTO repro(s,d) VALUES ("[email protected]", "[email protected],[email protected]");
EOF
cat >/etc/postfix/repro.cf <<'EOF'
dbpath=/etc/postfix/repro.sqlite3
query=SELECT d FROM repro WHERE s='%s'
EOF
# send test mail (smtp not setuid, because smtp produces nicer logs)
printf %b 'import smtplib;\nsmtplib.SMTP("::1").sendmail("","[email protected]", "")' | python3
printf %b 'import smtplib;\nsmtplib.SMTP("::1").sendmail("","[email protected]", "")' | python3
# check logs

verwandte Informationen