SysCP: mysql+postfix+courier+maildrop

Postfix, QMail, Sendmail, Dovecot, Cyrus, Courier, Anti-Spam
tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-06 00:38

Huhu,

SysCP arbeitet ohne Shell-Benutzer. Alle User und Daten sind in der MySQL-Datenbank gespeichert. Das rennt auch alles soweit ganz prima. Jedoch habe ich ein Problem mit maildrop.

Ich möchte eingehende Mails auf dem Server durch Spamassassin jagen und serverseitig Mails filtern für courier-imap. Bisher habe ich das alles mit procmail gelöst, das allerdings hierbei aufgrund der fehlenden Shell-User nicht möglich ist.

courier-maildrop habe ich per dpkg-buildpackage neu kompilert, so dass ich nun MySQL-Support habe und die Datei /etc/maildropmysql.config:

Code: Select all

$ maildrop -v
maildrop 1.7.0 Copyright 1998-2003 Double Precision, Inc.
GDBM extensions enabled.
Maildir quota extension enabled.
Virtual user database extension enabled.
Virtual user database via MySQL extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
Konfigurationsdateien

/etc/postfix/main.cf:

Code: Select all

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost =

append_dot_mydomain = no
myhostname = srv.testdomain.de
mydomain = testdomain.de
mydestination = $myhostname localhost localhost.$mydomain
mynetworks = 127.0.0.0/8

smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_non_fqdn_hostname, reject_unknown_recipient_domain, reject_invalid_hostname, reject_unknown_sender_domain

maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1

virtual_mailbox_base = /var/kunden/mail/
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
virtual_transport = maildrop
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

smtpd_use_tls = no
smtpd_enforce_tls = no

bounce_size_limit = 50000

mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
/etc/postfix/master.cf:

Code: Select all

[...]
maildrop unix -     n     n     -     -     pipe
flags=R user=vmail argv=/usr/bin/maildrop -d ${user}@${nexthop} ${extension} ${recipient} ${user}
${nexthop} ${sender}

#maildrop unix -     n     n     -     -     pipe
# flags=R user=vmail argv=/usr/bin/maildrop -d ${recipient}

#maildrop unix -     n     n     -     -     pipe
# flags=R user=vmail argv=/usr/bin/maildrop -V9
# -d ${user}@${nexthop} ${extension} ${recipient} ${user} ${sender}
[...]
Ich habe übrigens alle 3 Maildrop-Konfigurationen probiert. Jedoch gibts ein Problem bei der Zustellung der eingehenden Mail (ohne maildrop gehts einwandfrei):

Code: Select all

Nov 5 06:29:00 srv postfix/pipe[32662]: 2A29C2AF1: to=<meinuser@testdomain.de>, relay=maildrop, delay=0, status=bounced (user unknown. Command output: Invalid user specified. )
Hier die dazugehörigen Queries aus dem mysql.log:

Code: Select all

041105 13:58:00     4 Connect     syscp@localhost on syscp
                     4 Query     select domain from panel_domains where domain = 'absenderdomain.de'
                     4 Query     select domain from panel_domains where domain = 'empfaengerdomain.de'
                     5 Connect     syscp@localhost on syscp
                     5 Query     select destination from mail_virtual where email = 'tomek@empfaengerdomain.de'
                     6 Connect     syscp@localhost on syscp
                     6 Query     select destination from mail_virtual where email = 'tomek@empfaengerdomain.de'
                     4 Query     select domain from panel_domains where domain = 'empfaengerdomain.de'
                     7 Connect     syscp@localhost on
                     7 Init DB     syscp
                     7 Query     SELECT email, uid, gid, homedir, maildir, 50000000 FROM mail_users WHERE email = "tomek@empfaengerdomain.de" "where postfix = 'Y'"
                     7 Quit    
                     6 Query     select destination from mail_virtual where email = 'absender@absenderdomain.de'
                     6 Query     select destination from mail_virtual where email = '@absenderdomain.de'
                     4 Query     select domain from panel_domains where domain = 'absenderdomain.de'
041105 13:59:00     5 Quit    
                     6 Quit    
                     4 Quit     
(Domains sind auf Beispiele abgeändert.)

Wo steckt nun der Fehler? Bis zum Filtern, also das Auslesen der /etc/courier/maildroprc, kommt es ja gar nicht. Ich komme da nicht hinter. Bin dankbar für jede Idee.

tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

Re: SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-06 00:57

Eine Datei vergessen zu posten. :oops:

/etc/maildropmysql.config:

Code: Select all

hostname                localhost
# port                  3306
socket                  /var/run/mysqld/mysqld.sock
database                syscp
dbuser                  syscp
dbpw                    richtiges_passwort
dbtable                 mail_users
# timeout               5
default_uidnumber       2000
default_gidnumber       2000
uid_field               email
uidnumber_field         uid
gidnumber_field         gid
maildir_field           maildir
homedirectory_field     homedir
quota_field             50000000
# quota_field           quota
mailstatus_field        postfix
where_clause            "where postfix = 'Y'"

tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

Re: SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-06 10:13

So, die Sache mit Spamassassin habe ich nun auf eine andere Art und Weise erledigt und es funktioniert auch:

/usr/local/bin/sa-filter.sh:

Code: Select all

#!/bin/bash
/usr/bin/spamc -f | /usr/sbin/sendmail -i "$@"
exit $?
/etc/postfix/master.cf:

Code: Select all

[...]
smtp      inet  n       -       -       -       -       smtpd
  -o content_filter=spamassassin:
[...]
spamassassin unix -     n       n       -       -       pipe   
  user=nobody argv=/usr/local/bin/sa-filter.sh -f ${sender} -- ${recipient}
[...]
Jetzt bleibt nur noch die Sache mit dem serverseitigen Filtern/Sortieren der Mails per maildrop. Im Prinzip habe ich das Problem mit maildrop für Spamassassin umgangen.

netzmeister
Posts: 25
Joined: 2003-06-11 00:50
Location: Stuttgart

Re: SysCP: mysql+postfix+courier+maildrop

Post by netzmeister » 2004-11-06 16:59

Hi,
Tomek wrote:SELECT email, uid, gid, homedir, maildir, 50000000 FROM mail_users WHERE email = "tomek@empfaengerdomain.de" "where postfix = 'Y'"
Ich vermute, sobald du den Fehler in der SQL-Query korrigierst, wird das ganze auch geschmeidig laufen.

Gruss
Alexander

tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

Re: SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-06 20:28

Habe nun einen weiteren Fehler korrigiert.

/etc/maildropmysql.config
Falsch:

Code: Select all

where_clause            "where postfix = 'Y'"
Richtig:

Code: Select all

where_clause            AND postfix = 'Y'
Maildrop mit MySQL funktioniert nun. Die Mails landen allerdings nun in der Datei /var/kunden/mail/Maildir, müssen aber in /var/kunden/mail/kundenname/email@testdomain.de/new/ gespeichert werden.

Daraufhin habe ich die Datei /etc/courier/maildroprc bearbeitet:

Code: Select all

#LOGNAME=tolower("$LOGNAME")
RECIPIENT=tolower("$1")
EXTENSION="$3"
USER="$4"
HOST="$5"
SENDER="$6"
#DOMAIN="$7"

# Keep a log of deliveries.
#LOGDIR="$HOME"
#logfile "$LOGDIR/maildrop.log"

# Drop all mails into the default mailbox.
to "$HOME/$DEFAULT/"
Ich weiss nicht ob das so richtig ist. Ohne Maildrop werden die Mails ja richtig gespeichert. Allerdings erhalte ich mit dieser Konfiguration folgende Fehlermeldung im Postfix-Log:

Code: Select all

maildrop[10296]: Unable to create a dot-lock.
postfix/pipe[10295]: A19D679624: to=<tomek@testdomain.de>, relay=maildrop, delay=0, status=deferred (temporary failure. Command output: /usr/bin/maildrop: Unable to create a dot-lock. )
Nach einigem Google'n konnte ich aber keine Lösung hierzu finden.

tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

Re: SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-07 00:34

Bin wieder weitergekommen, so dass der Fehler "Unable to create a dot-lock." behoben ist.

/etc/postfix/master.cf:

Code: Select all

maildrop  unix  -       n       n       -       -       pipe
  flags=R user=vmail argv=/usr/bin/maildrop -d ${user}@${nexthop} ${extension} ${recipient} ${user} ${nexthop} ${sender}
/etc/courier/maildroprc:

Code: Select all

LOGNAME=tolower("$LOGNAME")
EXTENSION="$1"
RECIPIENT=tolower("$2")
USER="$3"
HOST="$4"
SENDER="$5"

DEFAULT="/var/kunden/mail/testdomain/$USER@$HOST"
to "$DEFAULT"
Das funktioniert. Bleibt nur noch folgendes: Ich möchte "testdomain" in der Variable $DEFAULT den Verzeichnisnamen "testdomain" nicht manuell festlegen, sondern automatisch setzen lassen. Dort muss automatisch der Kundenname aus SysCP benutzt werden. Ich weiss allerdings nicht wie.

tomek
Posts: 243
Joined: 2003-08-05 09:44
Location: Paderborn

Re: SysCP: mysql+postfix+courier+maildrop

Post by tomek » 2004-11-07 13:35

Juhu! Nun rennt alles wie es soll. :D

Ich habe dazu eine PHP-Datei von SysCP geändert, so dass die Mailordner nicht /var/kunden/mail/kontoname/email@testdomain.de in der MySQL-Datenbank lauten, sondern /var/kunden/mail/email@testdomain.de.

Dazu noch folgende /etc/courier/maildroprc erstellt:

Code: Select all

LOGNAME=tolower("$LOGNAME")
EXTENSION="$1"
RECIPIENT=tolower("$2")
USER="$3"
HOST="$4"
SENDER="$5"

xfilter "/usr/bin/spamc"

`test -e /var/kunden/mail/$USER@$HOST`
if ( $RETURNCODE != 0 )
{
        `maildirmake /var/kunden/mail/$USER@$HOST`
        `chown vmail:vmail -R /var/kunden/mail/$USER@$HOST`
        `chmod 0700 /var/kunden/mail/$USER@$HOST`
}

DEFAULT="/var/kunden/mail/$USER@$HOST"
to "$DEFAULT"
Squirrelmail mit entsprechender Konfiguration funktioniert damit auch einwandfrei.

Ich habe fertig. :P