Imapsync, ou le transfert de comptes Imap

Lors du transfert de compte Imap entre deux serveurs, lors d’un changement de matériel par exemple, ou pour une sauvegarde distante de ses mails, IMAPSYNC est le soft qu’il vous faut ;)

En effet j’heberge mes mails en Local sur ma SME-SERVER, cependant je souhaite en faire une syncro sur internet pour avoir une sauvegarde permanente de mes mails, au cas ou un disque souhaiterait me lacher ;) (bien que je sois en RAID 1, j’ai toujours voulu avoir les bretelles et la ceinture)

Imapsync va fonctionner d’une manière récursive dans votre boite mail, et il ne copiera dans la boite distante, que les mails qui n’y sont pas, autant dire qu’il est adapté au réseau ADSL avec peu de débit.

La sécurité n’est pas de reste, puisque on peut  (et on DOIT) activer le mode SSL qui va permettre d’avoir une communication chiffrée entre les deux serveurs rendant plus difficile l’interception des messages, bien évidemment cela suppose que le support de compte IMAPS soit installé sur vos serveurs.

Le principe de base est simple, vous aller invoquer imapsync avec des arguments pour chaque boite Mail, si vous voulez en automatique dans le dossier  /etc/cron.daily (ainsi tous les jours une synchronisation se fera automatiquement), ce faisant tous les flags seront respectés (lus, effacés……) ce qui vous permet de retrouver tous votre correspondance dans le même état d’un coté ou de l’autre du tuyau Internet

1.l’utilisation de base

Pour installer Imapsync sur la SME-SERVER

//usr/bin/imapsync --noauthmd5 --host1 localhost --port1 993 --ssl1 \
--user1 TOTO --password1 TOTO --host2 TOTO.COM --port2 993 --ssl2 \
--user2 TOTO@TOTO.com --password2 TOTO --noauthmd5 --delete2
--host1 localhost : votre serveur source mais il peut être distant
--port1 993 --ssl1 : serveur source, activation du SSL, sinon utilisez --port 143
--user1 TOTO --password1 TOTO : définition du compte imap source
(avec la sme on ne met pas le domaine avec le user)
--host2 TOTO.COM : votre serveur destination
--port2 993 --ssl2 : serveur destination, activation du SSL, sinon utilisez --port 143
--user2 TOTO@TOTO.com --password2 TOTO : definition du compte imap destination
--delete2 : efface sur le compte distant les messages non présent dans la source.
--delete --expunge1 : peut être utilisé dans les arguments de la source
pour effacer les mails une fois transférés (intéressant dans le cas d'une migration)

Bien évidemment vous n’allez pas lancer cette commande tous les jours, il vous faut la transformer en tache Cron

pour cela nous allons créer un fichier dans le dossier /etc/cron.daily (du coup cette commande ne sera executé qu’une fois par jour), aussi connecter vous en SSH sur votre serveur

ssh root@votre-serveur
nano /etc/cron.daily/sauvimap

copiez ces Lignes

#!/bin/bash
####sauv du compte imap toto
//usr/bin/imapsync --noauthmd5 --host1 localhost --port1 993 --ssl1 --user1 TOTO \
--password1 TOTO --host2 TOTO.COM --port2 993 --ssl2 --user2 TOTO@TOTO.com \
--password2 TOTO --noauthmd5 --delete2

puis enregistrez avec un ctrl+x

rendez le fichier executable

chmod +x /etc/cron.daily/sauvimap

testez votre fichier pour voir si vous avez des erreurs qui remontent

./etc/cron.daily/sauvimap

vous aurez bien sur  besoin d’inclure une ligne par compte imap que vous voulez transférer :)

2. on customise un peu

Comme vous avez pu le voir, les mots de passe sont en clair dans le script, aussi pour ma part cela ne me dérange pas beaucoup car je suis le seul a utiliser mon serveur, mais dans le cas d’administrateurs partagés cela peut poser un problème.

en effet une personne  pourrait voir dans la liste des taches la ligne complète avec les arguments dont les mots de passe….fâcheux non

voila comment on peut securiser un peu le tout

/usr/bin/imapsync \
  --host1 imap.truc.org --user1 foo --passfile1 /etc/secret1 \
  --host2 imap.trac.org --user2 bar --passfile2 /etc/secret2

–passfile1 /etc/secret1 :fichier de MDP de la source
–passfile2 /etc/secret2 :fichier de MDP de la destination

on voit que l’on utilise l’argument « passfile1 », en effet on va créer des fichier contenant lesmots de passe qui seront appelés par imapsync, « secret » sera le mot de passe et ils ne seront que lisible par ROOT

en root par ssh

echo "secret" > /etc/secret1
echo "secret" > /etc/secret2
chmod 600 /etc/secret1
chmod 600 /etc/secret2

3. la liste complete des arguments

 --host1       <string> : "from" imap server. Mandatory.
 --port1       <int>    : port to connect on host1. Default is 143.
 --user1       <string> : user to login on host1. Mandatory.
 --authuser1   <string> : user to auth with on host1 (admin user).
 Avoid using --authmech1 SOMETHING with --authuser1.
 --password1   <string> : password for the user1. Dangerous, use --passfile1
 --passfile1   <string> : password file for the user1. Contains the password.
 --host2       <string> : "destination" imap server. Mandatory.
 --port2       <int>    : port to connect on host2. Default is 143.
 --user2       <string> : user to login on host2. Mandatory.
 --authuser2   <string> : user to auth with on host2 (admin user).
 --password2   <string> : password for the user2. Dangerous, use --passfile2
 --passfile2   <string> : password file for the user2. Contains the password.
 --noauthmd5            : don't use MD5 authentification.
 --authmech1   <string> : auth mechanism to use with host1:
 PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE.
 --authmech2   <string> : auth mechanism to use with host2. See --authmech1
 --ssl1                 : use an SSL connection on host1.
 --ssl2                 : use an SSL connection on host2.
 --folder      <string> : sync this folder.
 --folder      <string> : and this one, etc.
 --folderrec   <string> : sync this folder recursively.
 --folderrec   <string> : and this one, etc.
 --include     <regex>  : sync folders matching this regular expression
 --include     <regex>  : or this one, etc.
 in case both --include --exclude options are
 use, include is done before.
 --exclude     <regex>  : skips folders matching this regular expression
 Several folders to avoid:
 --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3.
 --exclude     <regex>  : or this one, etc.
 --prefix1     <string> : remove prefix to all destination folders
 (usually INBOX. for cyrus imap servers)
 you can use --prefix1 if your source imap server
 does not have NAMESPACE capability.
 --prefix2     <string> : add prefix to all destination folders
 (usually INBOX. for cyrus imap servers)
 use --prefix2 if your target imap server does not
 have NAMESPACE capability.
 --regextrans2 <regex>  : Apply the whole regex to each destination folders.
 --regextrans2 <regex>  : and this one. etc.
 When you play with the --regextrans2 option, first
 add also the safe options --dry --justfolders
 Then, when happy, remove --dry, remove --justfolders
 --regexmess   <regex>  : Apply the whole regex to each message before transfer.
 Example: 's/\000/ /g' # to replace null by space.
 --regexmess   <regex>  : and this one.
 --regexmess   <regex>  : and this one, etc.
 --regexflag   <regex>  : Apply the whole regex to each flags list.
 Example: 's/"Junk"//g' # to remove "Junk" flag.
 --regexflag   <regex>  : and this one, etc.
 --sep1        <string> : separator in case namespace is not supported.
 --sep2        <string> : idem.
 --delete               : delete messages on source imap server after
 a successful transfer. Useful in case you
 want to migrate from one server to another one.
 With imap, delete tags messages as deleted, they
 are not really deleted. See expunge.
 --delete2              : delete messages on the destination imap server that
 are not on the source server.
 --expunge              : expunge messages on source account.
 expunge really deletes messages marked deleted.
 expunge is made at the beginning on the
 source server only. newly transferred messages
 are expunged if option --expunge is given.
 no expunge is done on destination account but
 it will change in future releases.
 --expunge1             : expunge messages on source account.
 --expunge2             : expunge messages on target account.
 --uidexpunge2          : uidexpunge messages on the destination imap server
 that are not on the source server, requires --delete2
 --syncinternaldates    : sets the internal dates on host2 same as host1.
 Turned on by default.
 --idatefromheader      : sets the internal dates on host2 same as the
 "Date:" headers.
 --buffersize  <int>    : sets the size of a block of I/O.
 --maxsize     <int>    : skip messages larger than <int> bytes
 --maxage      <int>    : skip messages older than <int> days.
 final stats (skipped) don't count older messages
 see also --minage
 --minage      <int>    : skip messages newer than <int> days.
 final stats (skipped) don't count newer messages
 You can do (+ are the messages selected):
 past|----maxage+++++++++++++++>now
 past|+++++++++++++++minage---->now
 past|----maxage+++++minage---->now (intersection)
 past|++++minage-----maxage++++>now (union)
 --skipheader  <regex>  : Don't take into account header keyword
 matching <string> ex: --skipheader 'X.*'
 --useheader   <string> : Use this header to compare messages on both sides.
 Ex: Message-ID or Subject or Date.
 --useheader   <string>   and this one, etc.
 --skipsize             : Don't take message size into account.
 --allowsizemismatch    : allow RFC822.SIZE != fetched msg size
 consider --skipsize to avoid duplicate messages
 when running syncs more than one time per mailbox
 --dry                  : do nothing, just print what would be done.
 --subscribed           : transfers subscribed folders.
 --subscribe            : subscribe to the folders transferred on the
 "destination" server that are subscribed
 on the "source" server.
 --nofoldersizes        : Do not calculate the size of each folder in bytes
 and message counts. Default is to calculate them.
 --justfoldersizes      : exit after printed the folder sizes.
 --syncacls             : Synchronises acls (Access Control Lists).
 --nosyncacls           : Does not synchronise acls. This is the default.
 --debug                : debug mode.
 --debugimap            : imap debug mode.
 --version              : print software version.
 --justconnect          : just connect to both servers and print useful
 information. Need only --host1 and --host2 options.
 --justlogin            : just login to both servers with users credentials
 and exit.
 --justfolders          : just do things about folders (ignore messages).
 --fast                 : be faster (just does not sync flags).
 --reconnectretry1 <int>: reconnect if connection is lost up to <int> times
 --reconnectretry2 <int>: reconnect if connection is lost up to <int> times
 --split1     <int>     : split the requests in several parts on source server.
 <int> is the number of messages handled per request.
 default is like --split1 1000
 --split2     <int>     : same thing on the "destination" server.
 --fastio1              : use fastio with the "from" server.
 --fastio2              : use fastio with the "destination" server.
 --timeout     <int>    : imap connect timeout.
 --help                 : print this.

Posted in: Creative Commons by-sa, Sme-server

8 comments

  1. Benoit says:

    bonjour,

    je n’arrive pas à utilisé imapsync si je met ma commande directement dans le terminal j’ai cette erreur

    failed–compilation aborted at ./imapsync line 439

    franchement j’ignore comment l’utiliser

  2. stephane de labrusse says:

    Bizarre…une erreur de compilation….pour ma part j’utilise le binaire fournie par la distribution Linux, du coup aucun problème de compilation…

    Sur quelle distribution êtes Vous.

  3. vedily says:

    bonjour a tous et meci de me repondre .actuellement je fait une migration avec imapsync, actuelement je bloque au niveau de la connexion bref je ne comprend pas pourquoi la connexion met autant de temps pres d’une demi journee lorsque je lance la commande qui va permettre la migration des mails voici ce qui reste afficher pres d’une demi journee

    and the module Mail::IMAPClient version used here is 2.2.9
    Command line used:
    /usr/bin/imapsync –buffersize 8192000 –nosyncacls –subscribe –syncinternaldates –host1 192.168.1.10 –port1 993 –user1 chimene.ngameni –password1 MASKED –ssl2 –host2 192.168.1.48 port1 143 –user2 admin –password2 MASKED –ssl2 –authmech2 LOGIN –debugimap –authmech1 LOGIN –noauthmd5
    Turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
    TimeZone:[africa/douala]
    Will try to use LOGIN authentication on host1
    Will try to use LOGIN authentication on host2
    From imap server [192.168.1.10] port [993] user [chimene.ngameni]
    To imap server [192.168.1.48] port [993] user [admin]
    From connection

    cordialement

  4. stephdl says:

    Bizarre de lancer une connexion ssl sur l’hôte de destination en passant par le port 143 qui traditionnellement est sans ssl.

    –host2 192.168.1.48 port1 143 –user2 admin –password2 MASKED –ssl2

    comme on peut voir du coup il essaye de se connecter sur le 993 sur la destination…
    From imap server [192.168.1.10] port [993] user [chimene.ngameni]
    To imap server [192.168.1.48] port [993] user [admin]

    est ce que le problème ne viendrait pas de là ?

  5. vedily says:

    bonne annee avous et merci de me repondre j’ai corriger et maintenant la synchronisation reste bloquer a la connection pendand des heur et ne progresse plus j’ai surement manquer quelque chose mais je ne sais pas quoi pouvez vous m’aiguiller???

    cordialement
    $RCSfile: imapsync,v $ $Revision: 1.286 $ $Date: 2009/07/24 15:53:04 $
    Here is a [linux] system (Linux zimbra.axxentis.com 2.6.32-41-generic #94-Ubuntu SMP Fri Jul 6 18:00:34 UTC 2012 x86_64)
    with perl 5.10.1
    Mail::IMAPClient 2.2.9
    IO::Socket 1.31
    IO::Socket::SSL
    Digest::MD5 2.33
    Digest::HMAC_MD5 1.01
    Term::ReadKey 2.30
    Date::Manip
    and the module Mail::IMAPClient version used here is 2.2.9
    Command line used:
    /usr/bin/imapsync –buffersize 8192000 –nosyncacls –subscribe –syncinternaldates –host1 192.168.1.10 –port1 993 –user1 chimene.ngameni –password1 MASKED –ssl2 –host2 192.168.1.48 port2 993 –user2 admin –password2 MASKED –ssl2 –authmech2 LOGIN –debugimap –authmech1 LOGIN –noauthmd5
    Turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
    TimeZone:[africa/douala]
    Will try to use LOGIN authentication on host1
    Will try to use LOGIN authentication on host2
    From imap server [192.168.1.10] port [993] user [chimene.ngameni]
    To imap server [192.168.1.48] port [993] user [admin]
    From connection

  6. stephdl says:

    les mots de passe sont bons ?

  7. seb says:

    Pour info le binaire est disponible sur un repository github en ligne.

    Il suffit (si git d’installer) de faire un git clone adresse

    Ensuite d’installer les packages suivants :
    mail::IMAPClients

    Ainsi que ces dépendances :
    Mail::IMAPClient 2.2.9
    IO::Socket 1.31
    IO::Socket::SSL
    Digest::MD5 2.33
    Digest::HMAC_MD5 1.01
    Term::ReadKey 2.30
    Date::Manip

    Puis passer en root (pour les utilisateurs linux) de faire un make install et ca doit rouler !

    Super article dans tous les cas.
    Je recherche parcontre l’informations me définissant bien que 100% du trafic de la BAL de l’host1 a bien été transferé sur la BAL de l’host2.

    Hormis reparser le retour, si tu as une idée je suis preneur.

  8. stephane de labrusse says:

    et bien il ne m’a pas semblé que cette option soit implémentée, pour ma part je lance plusieurs fois imapsync pour être sur que tous soit transmis.

    Dommage que imapsync ne fasse plus parti du projet Debian :(