Postfix alle ausgehenden Mails an einen festgelegten Empfänger umleiten Vor allem auf Entwicklungsservern macht es oft Sinn, dass alle Mails, die diese Server verschicken sollen, nur an einen vorher festgelegten Empfänger gehen, um z.B. echte Kunden nicht zu belästigen oder ungewollte Bestellungen aufzugeben. Alle Mail soll an entwicklung@meinedomain.de gehen. Folgende Files müssen angepasst oder erstellt werden: always_bcc=entwicklung@meinedomain.de transport_maps = hash:/etc/postfix/transport always_bcc=entwicklung@meinedomain.de transport_maps = hash:/etc/postfix/transport Dies bewirkt, dass alle Mails per BCC an entwicklung@meinedomain.de geschickt werden. Jetzt muss nur noch verhindert werden, dass die echten Mails verschickt werden. Dazu folgendes Transport-File erstellen /etc/postfix/transport entwicklung@meinedomain.de : * discard:silently Die erste Zeile sorgt dafür, dass Mails an entwicklung@meinedomain.de auf normalem Weg zugestellt werden. Zeile 2 wirft alle anderen Mails weg. Das transport-File muss jetzt nur noch gehasht (postmap /etc/postfix/transport) und der Postfix reloaded werden (/etc/init.d/postfix reload). Die korrekte Funktionalität kann man natürlich in /var/log/mail.log überwachen. Disclaimer an ausgehende Mails ranhängen Postfix selbst läßt keine Änderung des Bodies durchlaufender Mails zu. Um einen Disclaimer oder sonstigen Text ans Ende jeder Mail zu hängen bedienen wir uns des Tools „altermime“ und konfigurieren im Postfix einen zusätzlichen Content-Filter. Postfix master.cf, ändern der Zeile smtp (-o content_filter hinzufügen): smtp inet n - n - - smtpd -o content_filter=dfilt: Am Ende der Datei folgenden Eintrag hinzufügen: dfilt unix - n n - - pipe flags=Rq user=filter argv=/etc/postfix/disclaimer -f ${sender} -- ${recipient} Erstellen des disclaimer-Scripts /etc/postfix/disclaimer mit folgendem Inhalt: #!/bin/sh # Localize these. INSPECT_DIR=/var/spool/filter SENDMAIL="/usr/sbin/sendmail -G -i" # don't alter mails from the addresses in this file DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer_addresses # Exit codes from EX_TEMPFAIL=75 EX_UNAVAILABLE=69 # Clean up when done or when aborting. trap "rm -f in.$$" 0 1 2 3 15 # Start processing. cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; } cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; } # obtain From address from_address=`grep -m 1 "^From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed 's/^From: //g' | awk '{print $1}'` if [ ! `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then /usr/bin/altermime --input=in.$$ \ --disclaimer=/etc/postfix/disclaimer.txt \ --disclaimer-html=/etc/postfix/disclaimer.txt || \ { echo Message content rejected; exit $EX_UNAVAILABLE; } fi $SENDMAIL "$@" ; for ( @data ) { if ( /^(\w+)(\*|\!)?\s/ ) { $queue_id = $1 ; } if ( $queue_id ) { if ( /$REGEXP/i ) { $Q { $queue_id } = 1 ; $queue_id = "" ; } } } #open(POSTSUPER,"|cat") || die "couldn't open postsuper" ; open ( POSTSUPER , "|postsuper -d -" ) || die "couldn't open postsuper" ; foreach ( keys %Q ) { print POSTSUPER "$_ \n " ; } ; close ( POSTSUPER ) ; Mails werden manchmal doppelt zugestellt Manchmal werden Mails doppelt zugestellt, dies wird durch die doppelte Auswertung der virtual_alias_maps in Postfix, einmal vor dem content_filter, und dann nach dem content_filter, wenn Amavisd-new die Mail wieder an Postfix zurückgibt, hervorgerufen. Um dies abzustellen muss in der /etc/postfix/master.cf folgendes konfiguriert werden: [...] 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 Hinzufügen: -o receive_override_options=no_address_mappings falls es die Zeile „-o receive_override_options=“ bereits gibt, muss „no_address_mappings“ einfach durch Komma getrennt hinten angehängt werden. Mails über ein Relay verschicken, außer bestimmte Empfänger Alle ausgehenden Mails sollten über ein Relay verschickt werden. Nur Mails an bestimmte Empfänger sollen direkt zugestellt werden. In der Postfix-Standardkonfiguration werden noch folgende Anpassungen gemacht: an /etc/postfix/main.cf wird folgende Zeile angehängt. Die Variable relay_host wird nicht konfiguriert transport_maps = hash:/etc/postfix/transport Empfänger, an die direkt zugestellt werden soll, werden in der Datei /etc/postfix/transport eingetragen. Das Standard-Relay wird die letzte Zeile in der Datei testuser@domain1.de : direkt@domain2.de : * smtp:mein.relay.de Nun muss noch das File-Hash erzeugt werden: postmap /etc/postfix/transport und die Postfix Konfiguration neu geladen werden: /etc/init.d/postfix reload jetzt einige Testmails verschicken und den Weg in /var/log/mail.log überprüfen: direkt: echo "Testmail direkt" | mail -s Test1 direkt@domain2.de über das Relay: echo "Testmail relay" | mail -s Test2 nichtdirekt@domain2.de Postfix catch-all Mailaccount Dies beschreibt die Einrichtung eines catch-all Mailaccounts im Postfix-MTA Als root die Datei /etc/postfix/main.cf bearbeiten und folgenden Eintrag vornehmen/aktivieren: virtual_alias_maps = hash:/etc/postfix/virtual in der Datei /etc/postfix/virtual werden nun die die virtuellen Accounts definiert: # lokale user heinz@server.de heinz bert@server.de bert schwuffi@server.de schwuffi # catch-all @server.de mailsammler um daraus das DB-File für Postfix zu erzeugen: postmap /etc/postfix/virtual jetzt noch den Postfix reloaden mit: postfix reload Flush mailqueues - Auslieferung erzwingen ganz einfach über folgenden Befehl: postqueue -f Um die Queue betrachten und z.B. nur einzelne Mails zu flushen oder auf HOLD zu setzen, bietet sich das Tool „pfqueue“ an, dass bei allen gängigen Distris in den Repos enthalten sein sollte.