PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SysCP: mysql+postfix+courier+maildrop



Tomek
05.11.04, 19:55
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 verwendet wird:


$ 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:

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:

[...]
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):

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:

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. :ugly:

Tomek
06.11.04, 00:54
Eine Datei vergessen zu posten. :rolleyes:

/etc/maildropmysql.config:

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
06.11.04, 10:12
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:

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

[...]
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.

Tomek
06.11.04, 20:26
Habe nun einen weiteren Fehler korrigiert.

/etc/maildropmysql.config
Falsch:

where_clause "where postfix = 'Y'"
Richtig:

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:

#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:

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
07.11.04, 00:32
Bin wieder weitergekommen, so dass der Fehler "Unable to create a dot-lock." behoben ist.

/etc/postfix/master.cf:

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

/etc/courier/maildroprc:

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
07.11.04, 13:31
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:

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