PEGU Consulting

Webdesign | Hosting | Support | Consulting

Weblog von PEGU Consulting

Freitag, 23. März 2007 / 15:03

Migration Emailkonten von confixx nach Syscp

Abgelegt unter System — von P. Arentzen

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/maildroprc
wieder entfernen und ggf. den Mailfilter in
/etc/postfix/main.cf
erneut 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.log
sollte 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

cyrus2courier
beschäftigen müssen.
fetchmail
und
imapsync
enfallen, 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

Zurück
Seiten
  • Home
  • Impressum
  • Nutzungsbedingungen
  • Datenschutzerklärung
  • Kontakt
  • Webseite
Kategorien
  • Allgemein (65)
  • PEGU intern (25)
  • Computer-News (49)
    • Hardware (8)
    • Software (61)
    • Spiele (34)
    • Internet (39)
    • Diverses (5)
  • Shortcuts (8)
  • Subjektives (72)
  • System (23)
  • Mac-Welten (26)
  • Mobiles Leben (62)
  • TypoScript-Schnipsel (4)
  • Games (19)
  • Linux (32)
  • Satire (4)
  • Im Test (51)
  • Entwicklung (1)
    • Tipps und Tricks (0)
    • JavaScript / Vue Schnipsel (5)
Archiv
  • Mai 2023 (5)
  • Dezember 2022 (1)
  • November 2021 (2)
  • September 2021 (1)
  • August 2021 (2)
  • Juli 2021 (1)
  • Juni 2021 (4)
  • Mai 2021 (9)
  • April 2021 (3)
  • März 2021 (2)
  • Februar 2021 (4)
  • Januar 2021 (5)
  • Dezember 2020 (8)
  • November 2020 (7)
  • September 2020 (1)
  • Juli 2020 (5)
  • Juni 2020 (6)
  • Mai 2020 (8)
  • Dezember 2018 (1)
  • Juli 2018 (1)
  • Mai 2018 (1)
  • April 2018 (1)
  • Februar 2018 (1)
  • Januar 2018 (2)
  • Dezember 2017 (2)
  • November 2017 (3)
  • Oktober 2017 (1)
  • März 2017 (2)
  • Februar 2017 (3)
  • Januar 2017 (2)
  • Dezember 2016 (2)
  • November 2016 (1)
  • Oktober 2016 (1)
  • September 2016 (2)
  • August 2016 (2)
  • Juli 2016 (2)
  • Mai 2016 (3)
  • April 2016 (4)
  • März 2016 (2)
  • Februar 2016 (4)
  • Januar 2016 (5)
  • Dezember 2015 (3)
  • November 2015 (2)
  • Oktober 2015 (1)
  • September 2015 (1)
  • August 2015 (2)
  • Juli 2015 (2)
  • Juni 2015 (2)
  • Mai 2015 (4)
  • April 2015 (11)
  • März 2015 (6)
  • Februar 2015 (2)
  • Januar 2015 (9)
  • Dezember 2014 (7)
  • November 2014 (4)
  • Oktober 2014 (7)
  • September 2014 (9)
  • August 2014 (10)
  • Juli 2014 (2)
  • Mai 2014 (2)
  • April 2014 (15)
  • März 2014 (8)
  • Februar 2014 (12)
  • Januar 2014 (3)
  • Dezember 2013 (3)
  • November 2013 (8)
  • Oktober 2013 (4)
  • September 2013 (7)
  • August 2013 (3)
  • Juli 2013 (6)
  • Juni 2013 (7)
  • Mai 2013 (6)
  • April 2013 (6)
  • März 2013 (13)
  • Februar 2013 (10)
  • Januar 2013 (7)
  • Dezember 2012 (5)
  • November 2012 (5)
  • Oktober 2012 (5)
  • September 2012 (2)
  • August 2012 (5)
  • Juli 2012 (10)
  • Juni 2012 (3)
  • April 2012 (1)
  • März 2012 (3)
  • Februar 2012 (3)
  • Januar 2012 (1)
  • Dezember 2011 (2)
  • November 2011 (2)
  • Oktober 2011 (5)
  • September 2011 (5)
  • August 2011 (4)
  • Juli 2011 (2)
  • Juni 2011 (2)
  • Mai 2011 (7)
  • April 2011 (12)
  • März 2011 (9)
  • Februar 2011 (2)
  • Dezember 2010 (1)
  • September 2010 (3)
  • Juni 2010 (1)
  • Mai 2010 (2)
  • Februar 2010 (3)
  • Januar 2010 (3)
  • Dezember 2009 (5)
  • November 2009 (1)
  • Juli 2009 (1)
  • Mai 2009 (2)
  • April 2009 (1)
  • März 2009 (2)
  • Februar 2009 (3)
  • Dezember 2008 (1)
  • Oktober 2008 (1)
  • August 2008 (1)
  • Juni 2008 (1)
  • Mai 2008 (2)
  • April 2008 (6)
  • März 2008 (3)
  • Februar 2008 (2)
  • Januar 2008 (4)
  • Dezember 2007 (6)
  • November 2007 (1)
  • Oktober 2007 (2)
  • September 2007 (1)
  • August 2007 (3)
  • Juli 2007 (5)
  • Mai 2007 (1)
  • April 2007 (6)
  • März 2007 (5)
  • Februar 2007 (4)
  • Januar 2007 (2)
  • Dezember 2006 (5)
  • November 2006 (2)
  • Oktober 2006 (5)
  • September 2006 (13)
  • März 2004 (1)
  • Oktober 2003 (1)
  • April 2003 (1)
  • Februar 2003 (1)
Blogroll
  • PEGU Webseite
  • Schriftsteller G. Arentzen
Feeds
  • RSS 2
© by PEGU Consulting, P. Arentzen — Design & Realisierung by PEGU Consulting — Powered by TYPO3