Postfix: header_check - Rewrite Subject
- shellshock
- Beiträge: 26
- Registriert: 22.12.2014 13:49:58
Postfix: header_check - Rewrite Subject
Moin in die Runde,
ich habe ein Problem mit den Postfix header_checks.
Und zwar möchte ich dort folgendes lösen:
/^To:.*@DOMAIN.de/ REPLACE Subject: Text: "Original Subject"
Also wenn der Mailserver an die Domain *@DOMAIN.de eine Mail sendet, dann soll er das Subject der Mail ersetzen mit "Text:" und dem original Subject hintendran.
Beispiel:
Original Subject: Anfrage wegen Debian
Umgeschrieben: Text: Anfrage wegen Debian
Ich möchte also vor das ursprüngliche Subject noch "Text:" setzen, sofern jemand an die Domain *@DOMAIN.de etwas schreibt.
Allerdings gelingt es mir nicht das ursprüngliche Subject auszulesen bzw. hinten anzuhängen.
Hat jemand eine Idee?
Grüße
shelli
ich habe ein Problem mit den Postfix header_checks.
Und zwar möchte ich dort folgendes lösen:
/^To:.*@DOMAIN.de/ REPLACE Subject: Text: "Original Subject"
Also wenn der Mailserver an die Domain *@DOMAIN.de eine Mail sendet, dann soll er das Subject der Mail ersetzen mit "Text:" und dem original Subject hintendran.
Beispiel:
Original Subject: Anfrage wegen Debian
Umgeschrieben: Text: Anfrage wegen Debian
Ich möchte also vor das ursprüngliche Subject noch "Text:" setzen, sofern jemand an die Domain *@DOMAIN.de etwas schreibt.
Allerdings gelingt es mir nicht das ursprüngliche Subject auszulesen bzw. hinten anzuhängen.
Hat jemand eine Idee?
Grüße
shelli
Re: Postfix: header_check - Rewrite Subject
Ich glaube, du ersetzt da den To:-Header durch einen zweiten Subject:-Header und fasst den originalen gar nicht an. Das Subject: selbst wuerde man ueberergaenzen. Zur Vorfilterung scheint ein Konstrukt wiegeeignet zu sein, das hab' ich nun aber nicht getestet.
Gruss Cae
Code: Alles auswählen
/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
Code: Alles auswählen
if /To:.*example.org/
/^Subject:/ REPLACE ...
endif
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
- heisenberg
- Beiträge: 4203
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Postfix: header_check - Rewrite Subject
AFAIU geht das leider überhaupt nicht. Ich würde mich freuen, wenn ich Unrecht hätte, da ich auch schon intensiver versucht habe, so etwas umzusetzen.
AFAIU beziehen sich alle Regeln der Header Checks nur auf eine Zeile - Pardon - einen einzelnen Header, der bei Überlänge im Emailquelltext üblicherweise in mehreren Zeilen dargestellt wird. Eine Verknüpfung zwischen verschiedenen Headern ist so erst Mal nicht vorgesehen.
---
Die Variante für die erweiterten Checks wären dann "Milter".
AFAIU beziehen sich alle Regeln der Header Checks nur auf eine Zeile - Pardon - einen einzelnen Header, der bei Überlänge im Emailquelltext üblicherweise in mehreren Zeilen dargestellt wird. Eine Verknüpfung zwischen verschiedenen Headern ist so erst Mal nicht vorgesehen.
---
Die Variante für die erweiterten Checks wären dann "Milter".
Zuletzt geändert von heisenberg am 04.12.2015 21:12:43, insgesamt 2-mal geändert.
Re: Postfix: header_check - Rewrite Subject
Das funktioniert so nicht, weil Postfix immer nur eine Zeile nach der anderen auswertet. Ich habe auf der Postfix-Mailingliste von einer Möglichkeit gelesen diese Einschränkung zu umgehen, finde aber den Beitrag gerade nicht. Im Prinzip geht es darum die E-Mail im normalen header_check zu filtern und an einen zweiten SMTP-Server mit eigenem header_check zu senden.Cae hat geschrieben:Ich glaube, du ersetzt da den To:-Header durch einen zweiten Subject:-Header und fasst den originalen gar nicht an. Das Subject: selbst wuerde man ueberergaenzen. Zur Vorfilterung scheint ein Konstrukt wieCode: Alles auswählen
/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
geeignet zu sein, das hab' ich nun aber nicht getestet.Code: Alles auswählen
if /To:.*example.org/ /^Subject:/ REPLACE ... endif
/etc/postfix/main.cf
Code: Alles auswählen
header_checks = pcre:/etc/postfix/header_checks_normal
Code: Alles auswählen
/^To:.*@example.com.*/ FILTER test:
Code: Alles auswählen
test inet n - - - - smtpd
-o header_checks=/etc/postfix/header_checks_test
Code: Alles auswählen
/^Subject: (.*)$/ REPLACE Subject: foobar $1
- heisenberg
- Beiträge: 4203
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Milter mit Postfix und MIMEDefang
So, weil mir das schon lange ein Dorn im Auge ist, dass ich das(einfach Mails bearbeiten / filtern) nicht kann, habe ich jetzt mal MIMEDefang ausprobiert. Und siehe da: Es ist doch gar nicht so schwer. Das folgende Script hat bei mir in dieser Form funktioniert.
Hier mal die Kurzffassung der Anleitung von MIMEDefang und postfix für Jessie:
Eine weitere hilfreiche Anleitung zum schreiben des Filters ist hier:
http://www.mickeyhill.com/mimedefang-howto/
Hier mal die Kurzffassung der Anleitung von MIMEDefang und postfix für Jessie:
- Postfix installieren
Code: Alles auswählen
apt-get install postfix
- MIMEDefang installieren
Code: Alles auswählen
apt-get install mimedefang
- MIMEDefang konfigurieren in /etc/default/mimedefangDer Socket nimmt nur auf localhost Verbindungen entgegen laut Doku, auch wenn er laut netstat sich an 0.0.0.0 bindet. Zur Sicherheit gehört da noch eine iptables-Regel rein.
Code: Alles auswählen
SOCKET=inet:17889
- Postfix konfigurieren in /etc/postfix/main.cf
Code: Alles auswählen
smtpd_milters=inet:127.0.0.1:17889
- Das Filterscript schreiben /etc/mail/mimedefang-filter
Code: Alles auswählen
# -*- Perl -*- # -- values from the template $AdminAddress = 'postmaster@localhost'; $DaemonAddress = 'mailer-daemon@localhost'; $Stupidity{"NoMultipleInlines"} = 0; # --------------------------- sub filter_end { my($entity) = @_; for ($count=0;$myRecipient=$entity->head->get("To",$count);$count++) { if($myRecipient =~ m/\<[^@]+\@mydomain.de\>/) { $sbj = $entity->head->get("Subject",0); action_change_header("Subject","HARHAR: $sbj"); break; } } } # DO NOT delete the next line, or Perl will complain. 1;
- Das Filterscript testen
Code: Alles auswählen
root@meinserver:~# mimedefang.pl -test Filter /etc/mail/mimedefang-filter seems syntactically correct.
- Postfix und MIMEDefang neustarten
Siehe
Code: Alles auswählen
/etc/init.d/mimedefang restart # Beim restart von mimedefang mittels systemd wird der # tcp port nicht hochgefahren, weil er schon offen ist. Wohl ein Timing-Bug. # Das init-Script wartet beim herunterfahren mehrere Sekunden. Damit # klappt das alles einwandfrei. (Bugreport wurde erstellt) systemctl restart postfix
807078.
- Testmail schicken
Code: Alles auswählen
.....
# My deepest apologies for this mess of globals...
use vars qw($AddWarningsInline @StatusTags
$Action $Administrator $AdminName $AdminAddress $DoStatusTags
$Changed $CSSHost $DaemonAddress $DaemonName
$DefangCounter $Domain $EntireMessageQuarantined
$MessageID $Rebuild $QuarantineCount
$QuarantineSubdir $QueueID $MsgID $MIMEDefangID
$RelayAddr $WasResent $RelayHostname
$RealRelayAddr $RealRelayHostname
$ReplacementEntity $Sender $ServerMode $Subject $SubjectCount
$ClamdSock $SophieSock $TrophieSock
$SuspiciousCharsInHeaders
$SuspiciousCharsInBody $Helo @ESMTPArgs
@SenderESMTPArgs %RecipientESMTPArgs
$TerminateAndDiscard $URL $VirusName
$CurrentVirusScannerMessage @AddedParts
$VirusScannerMessages $WarningLocation $WasMultiPart
$CWD $FprotdHost $Fprotd6Host
$NotifySenderSubject $NotifyAdministratorSubject
$ValidateIPHeader
$QuarantineSubject $SALocalTestsOnly $NotifyNoPreamble
%Actions %Stupidity @FlatParts @Recipients @Warnings %Features
$SyslogFacility $GraphDefangSyslogFacility
$MaxMIMEParts $InMessageContext $InFilterContext $PrivateMyHostName
$EnumerateRecipients $InFilterEnd $FilterEndReplacementEntity
$AddApparentlyToForSpamAssassin $WarningCounter
@VirusScannerMessageRoutines @VirusScannerEntityRoutines
$VirusScannerRoutinesInitialized
%SendmailMacros %RecipientMailers $CachedTimezone);
....
http://www.mickeyhill.com/mimedefang-howto/
- shellshock
- Beiträge: 26
- Registriert: 22.12.2014 13:49:58
Re: Postfix: header_check - Rewrite Subject
Vielen Dank für die Rückmeldungen! Da hatte ich ja nicht als Einziger mit dem Problem zu kämpfen...
/etc/postfix/master.cf
Füge ich das hinzu, dann kommt die Mail-Error Meldung:
postfix/master[17263]: fatal: 0.0.0.0:test: Servname not supported for ai_socktype
Füge ich den fehlenden Service hinzu unter /etc/services:
Dann fährt der Mail-Server wieder hoch. Wenn ich dann allerdings eine E-Mail an die betreffende Domain verschicke erhalte ich folgende Meldung in den Log-Files:
orig_to=<it@DOMAIN.de>, relay=none, delay=0.05, delays=0.05/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable)
Daher die Frage an Dimejo: Meinst du tatsächlich einen zweiten SMTP-Server oder lässt sich das auch innerhalb einer Postfix-Instanz lösen?
Wenn ich den Vorschlag umsetze, dann scheitere ich an dieser Stelle:Dimejo hat geschrieben:Das funktioniert so nicht, weil Postfix immer nur eine Zeile nach der anderen auswertet. Ich habe auf der Postfix-Mailingliste von einer Möglichkeit gelesen diese Einschränkung zu umgehen, finde aber den Beitrag gerade nicht. Im Prinzip geht es darum die E-Mail im normalen header_check zu filtern und an einen zweiten SMTP-Server mit eigenem header_check zu senden.Cae hat geschrieben:Ich glaube, du ersetzt da den To:-Header durch einen zweiten Subject:-Header und fasst den originalen gar nicht an. Das Subject: selbst wuerde man ueberergaenzen. Zur Vorfilterung scheint ein Konstrukt wieCode: Alles auswählen
/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
geeignet zu sein, das hab' ich nun aber nicht getestet.Code: Alles auswählen
if /To:.*example.org/ /^Subject:/ REPLACE ... endif
/etc/postfix/main.cf/etc/postfix/header_checks_normalCode: Alles auswählen
header_checks = pcre:/etc/postfix/header_checks_normal
/etc/postfix/master.cfCode: Alles auswählen
/^To:.*@example.com.*/ FILTER test:
/etc/postfix/header_checks_testCode: Alles auswählen
test inet n - - - - smtpd -o header_checks=/etc/postfix/header_checks_test
Code: Alles auswählen
/^Subject: (.*)$/ REPLACE Subject: foobar $1
/etc/postfix/master.cf
Code: Alles auswählen
test inet n - - - - smtpd
-o header_checks=/etc/postfix/header_checks_test
postfix/master[17263]: fatal: 0.0.0.0:test: Servname not supported for ai_socktype
Füge ich den fehlenden Service hinzu unter /etc/services:
Code: Alles auswählen
test 25/tcp mail
orig_to=<it@DOMAIN.de>, relay=none, delay=0.05, delays=0.05/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable)
Daher die Frage an Dimejo: Meinst du tatsächlich einen zweiten SMTP-Server oder lässt sich das auch innerhalb einer Postfix-Instanz lösen?
- shellshock
- Beiträge: 26
- Registriert: 22.12.2014 13:49:58
Re: Postfix: header_check - Rewrite Subject
/etc/postfix/header_checks
/etc/postfix/master.cf
Da funktioniert jetzt die »Übergabe« an localhost:10025, nur kommt dann:
Problem ist:
In der main.cf steht:
header_checks = regexp:/etc/postfix/header_checks
Bedeutet:
Die Header Checks werden wieder ausgeführt, was ihn letztendlich in eine Endlos-Schleife bringt. Wenn folgendes hinzugefügt wird, dann kommt die Mail an, aber auch der »zusätzliche« Header-Check wird ignoriert:
/etc/postfix/master.cf
Was für ein blödes Gefrickel. Und es geht noch immer nicht.

Code: Alles auswählen
/^To:.*@DOMAIN.de/ FILTER smtp:127.0.0.1:10025
Code: Alles auswählen
10025 inet n - n - - smtpd
-o header_checks=/etc/postfix/advanced_header_checks
Code: Alles auswählen
Diagnostic-Code: smtp; 554 5.4.0 Error: too many hops
In der main.cf steht:
header_checks = regexp:/etc/postfix/header_checks
Bedeutet:
Die Header Checks werden wieder ausgeführt, was ihn letztendlich in eine Endlos-Schleife bringt. Wenn folgendes hinzugefügt wird, dann kommt die Mail an, aber auch der »zusätzliche« Header-Check wird ignoriert:
/etc/postfix/master.cf
Code: Alles auswählen
10025 inet n - n - - smtpd
-o receive_override_options=no_header_body_checks
-o header_checks=/etc/postfix/advanced_header_checks



Re: Postfix: header_check - Rewrite Subject
Mein Fehler - da hatte ich wohl geschrieben ohne genauer darüber nach zu denken. Das soll natürlich kein SMTP-Server sein, sondern ein SMTP-Client. Versuche es mal hiermit:shellshock hat geschrieben:Wenn ich den Vorschlag umsetze, dann scheitere ich an dieser Stelle:
/etc/postfix/master.cfFüge ich das hinzu, dann kommt die Mail-Error Meldung:Code: Alles auswählen
test inet n - - - - smtpd -o header_checks=/etc/postfix/header_checks_test
postfix/master[17263]: fatal: 0.0.0.0:test: Servname not supported for ai_socktype
Füge ich den fehlenden Service hinzu unter /etc/services:Dann fährt der Mail-Server wieder hoch. Wenn ich dann allerdings eine E-Mail an die betreffende Domain verschicke erhalte ich folgende Meldung in den Log-Files:Code: Alles auswählen
test 25/tcp mail
orig_to=<it@DOMAIN.de>, relay=none, delay=0.05, delays=0.05/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable)
Daher die Frage an Dimejo: Meinst du tatsächlich einen zweiten SMTP-Server oder lässt sich das auch innerhalb einer Postfix-Instanz lösen?
Code: Alles auswählen
test unix - - n - - smtp
-o smtp_header_checks=pcre:/etc/postfix/header_checks_test
Re: Postfix: header_check - Rewrite Subject
header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht.![]()
![]()
- shellshock
- Beiträge: 26
- Registriert: 22.12.2014 13:49:58
Re: Postfix: header_check - Rewrite Subject
Ja da habt ihr wohl Recht. Sonst wird das nichts.Dimejo hat geschrieben:header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht.![]()
![]()
Re: Postfix: header_check - Rewrite Subject
Die korrigierte Variante funktioniert, ich habe sie vorhin getestet.shellshock hat geschrieben:Ja da habt ihr wohl Recht. Sonst wird das nichts.Dimejo hat geschrieben:header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht.![]()
![]()
- shellshock
- Beiträge: 26
- Registriert: 22.12.2014 13:49:58