Postfix: header_check - Rewrite Subject

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
shellshock
Beiträge: 22
Registriert: 22.12.2014 13:49:58

Postfix: header_check - Rewrite Subject

Beitrag von shellshock » 04.12.2015 17:17:32

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

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Postfix: header_check - Rewrite Subject

Beitrag von Cae » 04.12.2015 18:04:31

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 ueber

Code: Alles auswählen

/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
ergaenzen. Zur Vorfilterung scheint ein Konstrukt wie

Code: Alles auswählen

if /To:.*example.org/
	/^Subject:/ REPLACE ...
endif
geeignet zu sein, das hab' ich nun aber nicht getestet.

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

Benutzeravatar
heisenberg
Beiträge: 3532
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Postfix: header_check - Rewrite Subject

Beitrag von heisenberg » 04.12.2015 20:13:52

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".
Zuletzt geändert von heisenberg am 04.12.2015 21:12:43, insgesamt 2-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Dimejo
Beiträge: 503
Registriert: 21.07.2014 13:37:23

Re: Postfix: header_check - Rewrite Subject

Beitrag von Dimejo » 04.12.2015 20:34:09

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 ueber

Code: Alles auswählen

/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
ergaenzen. Zur Vorfilterung scheint ein Konstrukt wie

Code: Alles auswählen

if /To:.*example.org/
	/^Subject:/ REPLACE ...
endif
geeignet zu sein, das hab' ich nun aber nicht getestet.
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.

/etc/postfix/main.cf

Code: Alles auswählen

header_checks = pcre:/etc/postfix/header_checks_normal
/etc/postfix/header_checks_normal

Code: Alles auswählen

/^To:.*@example.com.*/ FILTER test:
/etc/postfix/master.cf

Code: Alles auswählen

test      inet  n       -       -       -       -       smtpd
  -o header_checks=/etc/postfix/header_checks_test
/etc/postfix/header_checks_test

Code: Alles auswählen

/^Subject: (.*)$/ REPLACE Subject: foobar $1

Benutzeravatar
heisenberg
Beiträge: 3532
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Milter mit Postfix und MIMEDefang

Beitrag von heisenberg » 05.12.2015 00:25:39

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:
  • 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/mimedefang

    Code: Alles auswählen

    SOCKET=inet:17889
    Der 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.
  • 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

    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
    
    Siehe Debian Bugreport807078.
  • Testmail schicken
Eine kleine Warnung noch vom Autor:

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);
....
Eine weitere hilfreiche Anleitung zum schreiben des Filters ist hier:

http://www.mickeyhill.com/mimedefang-howto/
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
shellshock
Beiträge: 22
Registriert: 22.12.2014 13:49:58

Re: Postfix: header_check - Rewrite Subject

Beitrag von shellshock » 05.12.2015 10:51:24

Vielen Dank für die Rückmeldungen! Da hatte ich ja nicht als Einziger mit dem Problem zu kämpfen...
Dimejo hat geschrieben:
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 ueber

Code: Alles auswählen

/^Subject: (.*)$/ REPLACE Subject: foobar $(1)
ergaenzen. Zur Vorfilterung scheint ein Konstrukt wie

Code: Alles auswählen

if /To:.*example.org/
	/^Subject:/ REPLACE ...
endif
geeignet zu sein, das hab' ich nun aber nicht getestet.
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.

/etc/postfix/main.cf

Code: Alles auswählen

header_checks = pcre:/etc/postfix/header_checks_normal
/etc/postfix/header_checks_normal

Code: Alles auswählen

/^To:.*@example.com.*/ FILTER test:
/etc/postfix/master.cf

Code: Alles auswählen

test      inet  n       -       -       -       -       smtpd
  -o header_checks=/etc/postfix/header_checks_test
/etc/postfix/header_checks_test

Code: Alles auswählen

/^Subject: (.*)$/ REPLACE Subject: foobar $1
Wenn ich den Vorschlag umsetze, dann scheitere ich an dieser Stelle:
/etc/postfix/master.cf

Code: Alles auswählen

test      inet  n       -       -       -       -       smtpd
  -o header_checks=/etc/postfix/header_checks_test
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:

Code: Alles auswählen

test          25/tcp          mail
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?

Benutzeravatar
shellshock
Beiträge: 22
Registriert: 22.12.2014 13:49:58

Re: Postfix: header_check - Rewrite Subject

Beitrag von shellshock » 06.12.2015 16:09:57

/etc/postfix/header_checks

Code: Alles auswählen

/^To:.*@DOMAIN.de/ FILTER smtp:127.0.0.1:10025
/etc/postfix/master.cf

Code: Alles auswählen

10025     inet  n       -       n       -       -       smtpd      
   -o header_checks=/etc/postfix/advanced_header_checks
Da funktioniert jetzt die »Übergabe« an localhost:10025, nur kommt dann:

Code: Alles auswählen

Diagnostic-Code: smtp; 554 5.4.0 Error: too many hops
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

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
Was für ein blödes Gefrickel. Und es geht noch immer nicht. :twisted: :twisted: :twisted:

Dimejo
Beiträge: 503
Registriert: 21.07.2014 13:37:23

Re: Postfix: header_check - Rewrite Subject

Beitrag von Dimejo » 06.12.2015 18:24:40

shellshock hat geschrieben:Wenn ich den Vorschlag umsetze, dann scheitere ich an dieser Stelle:
/etc/postfix/master.cf

Code: Alles auswählen

test      inet  n       -       -       -       -       smtpd
  -o header_checks=/etc/postfix/header_checks_test
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:

Code: Alles auswählen

test          25/tcp          mail
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?
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:

Code: Alles auswählen

test    unix    -    -    n    -    -    smtp
  -o smtp_header_checks=pcre:/etc/postfix/header_checks_test

Dimejo
Beiträge: 503
Registriert: 21.07.2014 13:37:23

Re: Postfix: header_check - Rewrite Subject

Beitrag von Dimejo » 06.12.2015 18:26:57

shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht. :twisted: :twisted: :twisted:
header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.

Benutzeravatar
shellshock
Beiträge: 22
Registriert: 22.12.2014 13:49:58

Re: Postfix: header_check - Rewrite Subject

Beitrag von shellshock » 06.12.2015 18:43:43

Dimejo hat geschrieben:
shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht. :twisted: :twisted: :twisted:
header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.
Ja da habt ihr wohl Recht. Sonst wird das nichts.

Dimejo
Beiträge: 503
Registriert: 21.07.2014 13:37:23

Re: Postfix: header_check - Rewrite Subject

Beitrag von Dimejo » 06.12.2015 19:26:26

shellshock hat geschrieben:
Dimejo hat geschrieben:
shellshock hat geschrieben:Was für ein blödes Gefrickel. Und es geht noch immer nicht. :twisted: :twisted: :twisted:
header_checks sind dafür einfach nicht gedacht. Die bessere Variante wäre sicher ein Milter wie von heisenberg vorgeschlagen.
Ja da habt ihr wohl Recht. Sonst wird das nichts.
Die korrigierte Variante funktioniert, ich habe sie vorhin getestet.

Benutzeravatar
shellshock
Beiträge: 22
Registriert: 22.12.2014 13:49:58

Re: Postfix: header_check - Rewrite Subject

Beitrag von shellshock » 06.12.2015 22:06:17

Nope leider nicht.

Es kommt:

Code: Alles auswählen

mail for DOMAIN.de loops back to myself

Antworten