Migration Emailkonten von confixx nach Syscp
Erfahrungen, die ich machte und die anderen eventuell helfen können.
Ich kann weder garantieren, dass diese Anleitung vollständig ist, noch dass sie fehlerfrei ist. Möglicherweise richtet sie sogar Schaden auf Ihrem System an, oder es können Daten verloren gehen. Bitte beachten Sie, dass sie nur von Menschen verwendet sollte, die aufgrund ihres Fachwissens in der Lage sind, solche Schäden zu vermeiden.
Da ich es für Kunden als unzumutbar erachte, ihre Email-Zugangsdaten zu ändern, suchte ich nach einem Weg, diese nach Syscp zu migrieren, ohne das Emailsystem von Syscp zu beinträchtigen.
Der migrierte Kunde kann die Email-Konten ganz normal verwalten. Sie werden unter Syscp als erstes unter dem Menüpunkt Email/ Adressen aufgeführt (ohne Domain-Header). Der Kunde kann diese ändern und Weiterleitungen hinzufügen. Wenn er sie jedoch löscht, kann er sie nie wieder anlegen, da ihm die Dummy-Domain 'account' nicht gehört. Neu angelegte Kunden sollten durch die Anpassungen keine Beeinträchtungen bemerken.
Nicht beschrieben habe ich, wie man die Emails selbst vom alten auf den neuen Server bekommt, da dies stark vom verwenden Mailsystem des Ausgangsserves abhängt.
1. Ausgangsituation
Ausgangsystem:
Suse 9.3 Rootserver mit Confixx 3pro
Zielsystem:
Ubuntu Dapper 6.06 LTS mit folgenden Voraussetzungen
- Der Mysql-Server 5.x ist installiert. Die Version 5 ist so wichtig, weil Views verwendet werden.
- Funktionsfähige Grundinstallation Syscp 1.2.15/ 1.2.16
- Alle Kunden wurden angelegt und genau so benannt wie auf dem alten System
- Domains sind ebenfalls angelegt und zwar genau so wie auf dem alten System
- Email und Courier/ Imap/ Maildrop arbeiten prinzipiell korrekt
- Es sollten crypted-Passwords verwendet werden (lt. folgender Anleitung http://www.syscp.de/wiki/contrib/CryptedMailPasswords)
- Das Mailsystem sollte sich nocht nicht im Echtbetrieb befinden, dh. der Server sollte nirgendwo als MX eingetragen sein.
- Nicht zwingend, aber hilfreich: phpMyAdmin
2. Vorbereitung
Es wird ein Mysql-Admin-User benötigt, der auf alle Datenbanken Zugriff hat. Das kann mit phpmyadmin geschehen oder an der Konsole. Anschließen solle eine Datei mit dem Namen /root/.my.cnf angelegt werden:
# EDITOR /root/.my.cnf: [client] user=[myadminuser] password=[passwort] host=localhost # chmod 600 /root/.my.cnf
Nun sollte man sich mit
mysql syscp
ohne Passwortnachfrage in die syscp-Datenbank einloggen können.
# mysql syscp
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is ..... Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Wenn das klappt, muss die confixx-Datenbank auf den neuen Server übertragen werden (am besten mit phpMyAdmin).
Einen eigener Benutzer für diese Datenbank anzulegen ist nicht notwendig.
Noch ein Hinweis zu den crypted passwords:
Bei mir hat das Ganze so funktioniert, wie beschrieben. Ein kleiner Schönheitsfehler jedoch blieb zurück:
/etc/init.d/saslauthd restart/stop
funktionierten nicht mehr, weil durch die geänderteten Startparameter das pid-file nicht mehr dort liegt, we es das Start-Stop-Script erwartet. Durch das Hinzufügen von
PIDFILE="/var/spool/postfix/var/run/saslauthd/saslauthd.pid"
ans Ende von
/etc/default/saslauthd
funktioniert das wieder einwandfrei.
Testen, ob das bisherige Email-System funktioniert, geht (bei bestehendem Email-Konto mit bekanntem Passwort) so:
# testsaslauthd -f /var/spool/postfix/var/run/saslauthd/mux \ -u [konto] -p [passwort] -s smtp 0: OK "Success." # courierauthtest [konto] [passwort] Trying authdaemon... Authenticated: module authdaemon Home directory: /var/spool/kunden/mail UID/GID: 2000/2000 Maildir: web1/mail@domain.de/ AUTHADDR=mail@domain.de AUTHFULLNAME=<none> OPTIONS=<none>
Es ist wichtig, dass das klappt, das erleicht die spätere Fehlersuche.
Die Datei
/etc/courier/maildroprc
sollte so angelegt sein, dass sie die entsprechenden Maildirs automatisch anlegt.
3. Datenmigration
Folgende Befehle ausführen:
-- pop3 (bitte eigenes Maildir-Base verwenden): insert into mail_users select NULL id, concat(op.account,'@account') email, concat(op.account,'@account') username, '' password, op.longpw password_enc, 2000,2000, '/var/spool/kunden/mail/'homedir, concat(op.kunde,'/',op.account,'/') maildir,'Y'postfix,0 domainid,c.customerid from confixx.pop3 op INNER JOIN panel_customers c ON c.loginname = op.kunde; -- virtual-mailboxes: insert into mail_virtual select NULL id, u.email, u.email emailfull, concat(u.email,'') destination, u.domainid, u.customerid, u.id as popaccountid, 0 iscatchall from mail_users u where u.email like '%@account'; -- domain fuer migration anlegen: INSERT INTO `panel_domains` (`id`, `domain`, `adminid`, `customerid`, `aliasdomain`, `documentroot`, `ipandport`, `isbinddomain`, `isemaildomain`, `iswildcarddomain`, `subcanemaildomain`, `caneditdomain`, `zonefile`, `parentdomainid`, `openbasedir`, `openbasedir_path`, `safemode`, `speciallogfile`, `specialsettings`, `deactivated`) VALUES (NULL, 'account', 1, 0, NULL, '/dev/null', 1, 0, 1, 0, 0, 0, '', 0, 1, 0, 1, 0, '', 1); -- uebernahme destinations - funktioniert bei bis zu fuenf -- zus. Weiterleitungen u. Postfaechern -- ansonsten muessen weitere Konstrukte drangehaengt wrden insert into mail_virtual select NULL id, concat( IF(oe.prefix='*','',oe.prefix),'@',oe.domain) email, concat(IF(oe.prefix='*','catchall',oe.prefix),'@',oe.domain) email_full,TRIM(CONCAT(oe.pop3,IF(oe.pop3 like '%@%','','@account'), ' ' ,IF(oe.pop3x='','',CONCAT(SUBSTRING_INDEX(oe.pop3x,':',1), IF(SUBSTRING_INDEX(oe.pop3x,':',1) like '%@%','','@account'))) ,' ',IF(pop3x REGEXP '.*:', CONCAT(SUBSTRING_INDEX( SUBSTRING_INDEX(oe.pop3x,':',2),':',-1), IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',2),':',-1) like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*', CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',3),':',-1), IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',3),':',-1) like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*', CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',4),':',-1), IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',4),':',-1) like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*:.*', CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',5),':',-1), IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',5),':',-1) like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*:.*:.*', CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',6),':',-1), IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',6),':',-1) like '%@%','','@account') ),'') )) destination, d.id domainid, d.customerid, 0 popaccountid, IF(oe.prefix='*',1,0) iscatchall FROM confixx.email oe INNER JOIN panel_domains d ON d.domain = oe.domain LEFT OUTER JOIN mail_users u ON u.username = concat(oe.pop3,'@account'); -- zaehlen -- hier bin ich mir nicht ganz sicher, ob es korrekt so ist -- accounts create or replace view vtemp as select customerid,count(*) c from mail_users group by customerid; update panel_customers, vtemp set panel_customers.email_accounts_used = vtemp.c where vtemp.customerid = panel_customers.customerid; -- emailaddresses create or replace view vtemp as select customerid,count(*) c from mail_virtual where popaccountid = 0 group by customerid; update panel_customers, vtemp set panel_customers.emails_used = vtemp.c where vtemp.customerid = panel_customers.customerid; -- forwarders create or replace view vitemp as (select v.customerid, 1 c from mail_virtual v where destination != '' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ ' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ .*\ ' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ .*\ .*\ ' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ .*\ .*\ .*\ ' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ .*\ .*\ .*\ .*\ ' and popaccountid = 0) union all (select v.customerid,1 c from mail_virtual v where destination REGEXP '.*\ .*\ .*\ .*\ .*\ .*\ ' and popaccountid = 0); create or replace view vtemp as select customerid,count(*) c from vitemp group by customerid; update panel_customers, vtemp set panel_customers.email_forwarders_used = vtemp.c where vtemp.customerid = panel_customers.customerid; drop view vitemp; drop view vtemp; -- View fuer Passwortabfrage anlegen: create view vmig_mail_users as select IF(username like '%@account', REPLACE(username,'@account',''), username) username, password_enc, uid, gid, homedir, maildir from mail_users;
Dateien
/etc/pam.d/smtp + /etc/courier/authmysqlrc
anpassen: Ersetzen von Tabelle
mail_users
durch vmig_mail_users.
/etc/init.d/courier-authdaemon restart /etc/init.d/postfix restart
Mit
testsaslauthd
und
courierauthtest
erneut die Funktionstüchtigkeit der Authentifizierung prüfen.
4. Anlegen der Emailkonten
Ausgangsbasis ist wie gesagt, die Zustellung per Maildrop. Meine Konfiguration sieht in etwa wie folgt aus (rot sind die Anpassungen für die Confixx-Migration):
/etc/postfix/master.cf:
...
maildrop unix - n n - 2 pipe
flags=ODRhu user=vmail argv=/usr/bin/maildrop -w 80 \
-d ${recipient} ${extension} ${recipient} \
${user} ${nexthop} ${sender} ${mailbox}
...
/etc/courier/maildropmysql.conf:
hostname localhost
database syscp
dbuser [syscpuser]
dbpw [password]
dbtable mail_users
default_uidnumber 2000
default_gidnumber 2000
uid_field username
uidnumber_field uid
gidnumber_field gid
maildir_field TRIM(maildir)
homedirectory_field concat(homedir,left(maildir, position('\/' in maildir)-1))
# 100 MB Quota
quota_field '104857600S'mailstatus_field postfix
/etc/courier/maildroprc.createsub(Ein Ersatz für eine Subroutine zum anlegen von Maildirs):
`test -d $_parent/.$_subfolder`
if ( $RETURNCODE == 1 )
{
`maildirmake -f $_subfolder $_parent`
`echo INBOX.$_subfolder >> $DEFAULT/courierimapsubscribed`
}
/etc/courier/maildrop:
SHELL="/bin/bash"
_domain="$4"
_user="$6"
# Korrektur
#if ( $DOMAIN == "account" )
if ( "$_domain" eq "account" )
{
DEFAULT="$HOME/${_user}"
}
else
{
DEFAULT="$HOME/$LOGNAME"
}
SPAM="Spam"
SENT="Sent"
DRAFTS="Drafts"
TRASH="Trash"
#include file um subfolder anzulegen
_include_create_sub="/etc/courier/maildroprc.createsub"
# create maildir if not exists
`test -d $DEFAULT`
if ( $RETURNCODE == 1 )
{
`maildirmake "${DEFAULT}"`
`touch $DEFAULT/courierimapsubscribed`
`chmod 600 $DEFAULT/courierimapsubscribed`
}
# check default subfolders
_parent=$DEFAULT
_subfolder=$SENT
include $_include_create_sub
_subfolder=$DRAFTS
include $_include_create_sub
_subfolder=$TRASH
include $_include_create_sub
# Das Folgende NUR dann einfügen,
# wenn Sie GANZ GANZ sicher sind,
# dass der Mailserver keine Emails empfängt,
# also keinesfalls im Life-Betrieb!!!
# Bitte unbedingt im Anschluss entfernen, da sonst
# ALLE Emails unwiderruflich im Nirwana landen
to "/dev/null"
# evtuell ein ein wenig spamfiltern
if ( $SIZE < 126144 )
{
exception {
xfilter "/usr/bin/spamc -u $LOGNAME"
}
}
...
to "${DEFAULT}"
Evtuell in Postfix Content-Filter temporär ausschalten.
/etc/postfix/main.cf:
#content_filter = amavis:[127.0.0.1]:10024
content_filter =
# /etc/init.d/postfix restart
Mailkonten anlegen (Eine leere Email an alle Mailkonten schicken):
# echo "select concat('echo \"\" | mail -s \"\" ',email) \
from mail_users where email like '%@account';" \
| mysql syscp > /tmp/createmaildirs.sh
# EDIT /tmp/createmaildirs.sh
Erste Zeile ersetzen durch #!/bin/bash
sh /tmp/createmaildirs.sh
rm /tmp/createmaildirs.sh
Nun sollten die für alle @account-Konten leere Maildirs vorhanden sein
WICHIG:
Den Eintrag
to "/dev/null"aus
/etc/courier/maildroprcwieder entfernen und ggf. den Mailfilter in
/etc/postfix/main.cferneut aktivieren (content-filter).
5. Schlussüberlegungen
Natürlich sollte das Ganze noch ausführlich getestet werden. Das kann man zum Beispiel so machen, dass man eine Subdomain/ Domain, die per Nameserver auf den neuen Server zeigt, einem Test-Migrationskunden zuweist. Bei diesem legt man dann eine Emailadresse unter der Domain an und Weiterleitungen für migrierte Email-Adressen hinzu. Dann ein paar Mails dorthin schicken und sehen, ob sie im richtigen Postfach landen. Die
/var/log/mail.logsollte man dabei immer im Blick haben.
Nun muss man sich noch ein paar Gedanken machen, wie man die Mails selbst migriert. Wie gesagt, hängt dies stark vom bestehenden Ausgangsystem ab. Bei mir ist das Cyrus und ich werde mich deshalb mal mit
cyrus2courierbeschäftigen müssen.
fetchmailund
imapsyncenfallen, wenn man davon ausgeht, dass die Kunden-Email-Passworte nicht bekannt sind.
Ich hoffe, dass diese Anleitung nützlich ist.
Für Hinweise auf Fehler oder Verbesserungsvorschläge wäre ich dankbar.
Petra Arentzen