[Postfixbuch-users] amavis Quarantäne in MySQL mit eigenem DB-Schema
Andreas Pankratz
Andreas.Pankratz at s-square.de
Di Sep 9 12:38:41 CEST 2008
Hallo,
ich habe einen Großteil der Voschläge aus dem Buch wirklich gebrauchen können, Vielen Dank dafür.
Jetzt möchte ich die E-Mails, die in Quarantäne kommen in MySQL speichern. Da ich aus verschiedenen Gründen das vorgeschlagene DB-Schema (Es wurden nur Spalten- und Tabellennamen geändert, keine Datentypen/Domänen ) nicht benutzen kann, habe das Schema geändert und in ein bestehendes System integriert. Das ganze hat mit $sql_select_policy und $sql_select_white_black_list wunderbar funktioniert. Da ich keine Views einsetzen möchte habe ich das ganze im Query so zusammengeschustert, dass amavis damit umgehen kann:
$sql_select_white_black_list = 'SELECT ganz_andere_spalte AS wb FROM ganz_andere_tabelle ...';
Zum Einsatz kommt amavisd-new-2.5.4-1 über content_filter=, vorweg noch: Meine Perl Kenntnisse sind gleich null. Der "partition_tag" ist im Schema nicht enthalten. Laut Doku wurde dieser erst in 2.6.0 eingeführt
Im Quelltext vom amavis Daemon stehen in "%sql_clause" die restlichen Queries, diese habe ich mir rausgesucht und an das neue Schema angepasst. Da, so wie ich das ganze verstanden habe die amavisd.conf ja auch nur "included" wird müsste es ja ohne Probleme möglich sein, die Queries in die Konfigurationsdatei aufzunehmen.
Um die Übersicht zu gewährleisten habe ich jedes Query in eine extra Variable gepackt:
Ausschnitt aus der Konfigurationsdatei:
---------------------------------------
#Define vars for strict mode
my $sql_select_address;
my $sql_insert_address;
my $sql_insert_msgs;
my $sql_update_msgs;
my $sql_insert_rcpt;
my $sql_insert_quar;
my $sql_select_quar;
my $sql_select_penpals;
my $sql_select_penpals_msgid;
#Quarantine Queries, these have to be added to %sql_clause
$sql_select_address = 'SELECT spalte_id AS id FROM tabelle WHERE spalte_email = ?';
......
omitted
......
# Redefine sql_clause for working with WSH tables
%sql_clause = (
'sel_policy' => \$sql_select_policy,
'sel_wblist' => \$sql_select_white_black_list,
'sel_adr' => \$sql_select_address,
'ins_adr' => \$sql_insert_address,
'ins_msg' => \$sql_insert_msgs,
'upd_msg' => \$sql_update_msgs,
'ins_rcp' => \$sql_insert_rcpt,
'ins_quar' => \$sql_insert_quar,
'sel_quar' => \$sql_select_quar,
'sel_penpals' => \$sql_select_penpals,
'sel_penpals_msgid' => \$sql_select_penpals_msgid,
);
-----------------------------------
Wenn jetzt eine E-Mail eintrifft bekomm ich im Maillog folgende Fehlermeldung:
Sep 9 11:35:29 mail1 amavis[26045]: (26045-01) (!!)TROUBLE in check_mail: sql-enter FAILED: sql exec: err=16, S1000, DBD::mysql::st bind_param failed: Illegal parameter number at (eval 77) line 167, <GEN15> line 22.
Sep 9 11:35:29 mail1 amavis[26045]: (26045-01) (!)PRESERVING EVIDENCE in /var/amavis/tmp/amavis-20080909T113529-26045
Sep 9 11:35:29 mail1 postfix/smtp[26055]: 4F94139C87E0: to=<user at example.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=1.1, delays=1/0.01/0.01/0.04, dsn=4.5.0, status=deferred (host 127.0.0.1[127.0.0.1] said: 451 4.5.0 Error in processing, id=26045-01, sql-enter FAILED: sql exec: err=16, S1000, DBD::mysql::st bind_param failed: Illegal parameter number at (eval 77) line 167, <GEN15> line 22. (in reply to end of DATA command))
Mark Martinec schrieb zu dem gleichen Problem bei einem anderem Benutzer, als es bei einem Update auftrat (s. amavis Mailinglist 7.August):
Looks like the 'ins_msg' entry in %sql_clause (probably in a config file) does not match the version of amavisd.
Wie gesagt, ich hab die SQL-Queries direkt aus dem Quellcode raus, also würde ich behaupten, dass diese zur Version passen. Das Problem ist, das ich nun mit dieser Fehlermeldung nichts anfangen kann. Ich persönlich interpretiere das ganze so, als das amavisd eben einen Parameter nicht mit übergeben kann, dass also ein "?" zuviel oder zu wenig im Quelltext steht. Um mich selbst als Fehler auszuschließen, habe ich zwei Kollegen gebeten die Queries zu überprüfen. Auch Sie fanden nichts. Das es an den Queries selber liegt würde ich jetzt ausschließen, da sonst aussagekräftigere Fehlermeldungen wie "table XYZ not found" kommen würden.
Außerdem kann ich die Fehlermeldung keinem bestimmten Query zuordnen das fehlschlägt.
Ist das jetzt überhaupt möglich die SQL Queries in Variablen auszulagern und dann eben in %sql_clause einzubinden?
Kann jemand die Fehlermeldung einem bestimmten Query zuordnen, das fehlerhaft ist?
Gruß
Andreas Pankratz
Mehr Informationen über die Mailingliste Postfixbuch-users