Postfix / Versand an bestimmte Email-Adressen blockieren

Postfix, QMail, Sendmail, Dovecot, Cyrus, Courier, Anti-Spam
chris.berlin
Posts: 6
Joined: 2005-04-22 16:11
 

Postfix / Versand an bestimmte Email-Adressen blockieren

Post by chris.berlin »

Hallo Forum,

ich würde gern den Versand von Mails über Postfix an bestimmte Mail-Adressen blockieren. Das ganze soll per MySQL geregelt werden. Über die Suche habe ich schon einige ähnliche Beiträge gefunden, allerdings nichts was konkret in diese Richtung geht.

Folgendermaßen sieht bisher mein Ansatz aus:

In der main.cf

Code: Select all

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_recipient_access mysql:/etc/postfix/mysql-virtual_blocked_recipients.cf
SQL-Query

Code: Select all

SELECT CASE 1 WHEN (select count(email) from blocked_recipients where email="email@domain.tld" limit 1) THEN 'REJECT' ELSE 'OK' END;
Liefert "REJECT", falls ein Eintrag in blocked_recipients vorhanden ist, ansonsten "OK".

In der Tabelle blocked_recipients gibt es nur das Feld "email". Obiger Query klappt einwandfrei (ab MySQL 5).

Nur stellt sich mir nun die Frage, wie ich den Query in das Schema von Postfix pressen kann :(
In der /etc/postfix/mysql-virtual_blocked_recipients.cf

Code: Select all

user = mein_dbuser
password = mein_dbpass
dbname = mein_dbname
table = ...
select_field = ...
where_field = ...
hosts = sql.meinhost.de
Im Prinzip könnte der SQL Query viel einfacher sein, afaik muss jedoch ein "OK" zurückgeliefert werden, damit Postfix die Mail versendet.
Es wäre allerdings ziemlich unmöglich, jede einzelne E-Mail-Adresse, an die je eine Mail verschickt wird, in die Liste einzutragen mit einem weiteren Feld "OK".
Daher bin ich eben im SQL-Code den Umweg über CASE-WHEN-THEN gegangen.

Hat vielleicht jemand eine Idee, wie ich das am besten lösen könnte?

Danke & Gruß,
Christian
lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57
 

Re: Postfix / Versand an bestimmte Email-Adressen blockieren

Post by lord_pinhead »

In dem Fall würde ich Postfix mal im Debug laufen lassen, so läuft die Abfrage (auch mit Mysql 4.1), aber wenn er trotzdem blockt passt was beim Postfix nicht. Schau mal was er sagt im Debug.
chris.berlin
Posts: 6
Joined: 2005-04-22 16:11
 

Re: Postfix / Versand an bestimmte Email-Adressen blockieren

Post by chris.berlin »

Ja die Abfrage läuft problemlos, das Problem ist allerdings, dass ich nicht weiß, wie ich diesen Query in das Schema von Postfix eingeben kann.
Postfix nimmt ja nur select_field, where_field, table und erstellt daraus wohl sowas wie
SELECT <select_field> FROM <table> WHERE <where_field>

Nur ist eben meine Abfrage überhaupt nicht in diesem Schema :( Vielleicht eine Idee, wie ich mein Query dementsprechend abändern könnte? Oder akzeptiert Postfix irgendwie kompliziertere Querys?


Edit: Postfix kann's tatsächlich, gerade das hier gefunden:

Code: Select all

Postfix 2.2 has enhanced query interfaces  for  MySQL  and
       PostgreSQL,  these  include  features previously available
       only in the Postfix LDAP client. In the new interface  the
       SQL  query  is  specified  via  a  single  query parameter
       (described in more detail  below).   When  the  new  query
       parameter  is not specified in the map definition, Postfix
       reverts to the old interface,  with  the  SQL  query  con-
       structed  from  the  select_field,  table, where_field and
       additional_conditions parameters.  The old interface  will
       be  gradually  phased out. To migrate to the new interface
       set:

           query = SELECT [select_field]
               FROM [table]
               WHERE [where_field] = '%s'
                   [additional_conditions]
von http://www.postfix.org/mysql_table.5.html
lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57
 

Re: Postfix / Versand an bestimmte Email-Adressen blockieren

Post by lord_pinhead »

Was passiert eigentlich wenn Postfix nichts zurückbekommt? Wird es ignoriert? An sich müsstest du dann ja einfach nur nach der Mailadresse fragen und könntest dir ein kompliziertes Konstrukt sparen. Ein versuch ist es wert denke ich.
chris.berlin
Posts: 6
Joined: 2005-04-22 16:11
 

Re: Postfix / Versand an bestimmte Email-Adressen blockieren

Post by chris.berlin »

Lord_Pinhead wrote:Was passiert eigentlich wenn Postfix nichts zurückbekommt? Wird es ignoriert? An sich müsstest du dann ja einfach nur nach der Mailadresse fragen und könntest dir ein kompliziertes Konstrukt sparen. Ein versuch ist es wert denke ich.
Soweit ich das im Netz gelesen hab wird dann die automatisch REJECT angenommen. Wie auch immer, es klappt nun mit

Code: Select all

query = SELECT CASE 1 WHEN (select count(email) from blocked_recipients where email='%s' limit 1) THEN 'REJECT' ELSE 'OK' END;
Aber ich glaub, ich hab irgendwo einen Denkfehler gemacht. Und zwar klappt die Blockierung einwandfrei für eingehende Mails, ausgehende werden aber scheinbar gar nicht überprüft.

Gilt denn smtpd_recipient_restrictions nur für eingehende Mails? Wie kann ich einen Filter für ausgehende Mails erstellen?

Gruß,
Chris


Edit: Es klappt nun :) smtpd_recipient_restrictions geht wohl auch für ausgehende, wie hier steht http://www.postfix.org/postconf.5.html# ... strictions

Problem war allerdings die Reihenfolge:

Code: Select all

smtpd_recipient_restrictions =
    check_recipient_access mysql:/etc/postfix/mysql-virtual_blocked_recipients.cf,
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination
Vorher stand check_recipient_access am Ende, die Mail wurde also natürlich aufgrund von permit_sasl_authenticated durchgelassen.

Nachtrag: So geht das natürlich auch nicht, da so ein Relay aufgemacht wird.

Jetzt muss ich es nur noch irgendwie hinbekommen, dass diese Restrictions auch für sendmail bzw über PHP verschickte Mails greifen. Oder einfach PHP zu smtp zwingen.