Développement Web

Migrer de Google Workspace ou Microsoft 365 vers Mailcow : tutoriel 2026

10 min de lecture

📍 Article principal de la série : Mailcow 2026 : guide pratique.

Vous avez 5-10 ans d’emails dans Google Workspace ou Microsoft 365. Migration vers Mailcow auto-hébergé sans perdre un message, sans interruption de service, sans drama. Ce tutoriel détaille la procédure validée chez plusieurs PME francophones via imapsync, l’outil open source de référence.

Prérequis

  • Mailcow en production (voir tutoriel installation).
  • DNS validé (SPF/DKIM/DMARC, voir tutoriel DNS).
  • Boîtes Mailcow créées correspondant aux Google/365 (mêmes adresses).
  • Mots de passe Application (App Password) Google ou MS.
  • Niveau attendu : avancé.
  • Temps estimé : 1 jour préparation + jours selon volume.

Étape 1 — Audit des comptes source

Pour chaque boîte à migrer :

  • Adresse email exacte.
  • Volume données (Google Settings → Storage, M365 OWA → Mailbox usage).
  • Nombre de dossiers/labels.
  • Filtres et règles à recréer manuellement.

Étape 2 — Générer App Passwords

Google Workspace

  1. Activer 2FA sur compte Google.
  2. Account → Security → App passwords.
  3. Generate password « Mail » pour chaque compte à migrer.
  4. Noter password 16 chars (utilisable une seule fois).

Microsoft 365

  1. Activer Modern Authentication + IMAP côté admin tenant.
  2. Pour chaque user : security.microsoft.com → Additional security verification → App passwords.
  3. Generate.

Étape 3 — Installer imapsync

Sur VPS Mailcow ou poste local :

apt install -y imapsync libio-socket-ssl-perl libio-tee-perl libfile-copy-recursive-perl libreadonly-perl libterm-readkey-perl libsys-meminfo-perl libdigest-md5-file-perl libdate-manip-perl libencode-imaputf7-perl libtest-mockobject-perl libcrypt-openssl-rsa-perl libdata-uniqid-perl libio-compress-perl libregexp-common-perl libfile-tail-perl
imapsync --version  # Doit retourner > 2.0

Étape 4 — Test sur une boîte pilote

imapsync \
  --host1 imap.gmail.com --port1 993 --ssl1 \
  --user1 amadou.diop@old-entreprise.com \
  --password1 'APP-PASSWORD-GOOGLE' \
  --host2 mail.votre-entreprise.com --port2 993 --ssl2 \
  --user2 amadou.diop@votre-entreprise.com \
  --password2 'PASSWORD-MAILCOW' \
  --automap \
  --useheader 'Message-Id' \
  --skipsize \
  --dry  # Mode dry-run pour tester

Output liste les emails qui seraient copiés. Vérifier OK puis enlever --dry pour vraie migration.

Étape 5 — Lancer migration réelle

imapsync \
  --host1 imap.gmail.com --port1 993 --ssl1 \
  --user1 amadou.diop@old-entreprise.com \
  --password1 'APP-PASSWORD' \
  --host2 mail.votre-entreprise.com --port2 993 --ssl2 \
  --user2 amadou.diop@votre-entreprise.com \
  --password2 'PASSWORD-MAILCOW' \
  --automap \
  --useheader 'Message-Id' \
  --logfile /tmp/imapsync-amadou.log

Pour 5 GB de boîte, comptez 1-2 heures sur Hetzner.

Étape 6 — Migration bulk via script

#!/bin/bash
while IFS=, read -r email_old pass_old email_new pass_new; do
  imapsync \
    --host1 imap.gmail.com --port1 993 --ssl1 \
    --user1 "$email_old" --password1 "$pass_old" \
    --host2 mail.votre-entreprise.com --port2 993 --ssl2 \
    --user2 "$email_new" --password2 "$pass_new" \
    --automap --useheader 'Message-Id' \
    --logfile "/tmp/imapsync-$(echo $email_new | cut -d@ -f1).log" &
  sleep 60  # Stagger pour éviter rate limit Google
done < migration-list.csv
wait

Étape 7 — Période de bascule MX

Stratégie sans downtime :

  1. Avant : MX pointe Google. Tous emails arrivent Google.
  2. Pendant : ajouter MX secondaire Mailcow priority 20 (Google priority 10).
  3. Migration imapsync de l'historique.
  4. Bascule : Google priority 20, Mailcow priority 10. Emails arrivent Mailcow.
  5. Imapsync incrémental dernières 24h pour rattraper.
  6. Désactiver Google MX.

Étape 8 — Communication aux utilisateurs

  • J-7 : annonce migration prévue.
  • J-3 : envoi credentials Mailcow + URL webmail SOGo + guide configuration mobile.
  • J : bascule MX.
  • J+1 : webinar 30 min troubleshooting.
  • J+7 : sondage satisfaction, ajustements.

Étape 9 — Configuration mobile et desktop clients

Distribuer doc :

  • iPhone Mail : Réglages → Mail → Comptes → Ajouter → Autre. Manual config IMAP/SMTP.
  • Android Gmail app : Add Account → Other.
  • Outlook desktop : Account Settings → Add → IMAP. Outgoing SMTP avec STARTTLS.
  • Apple Mail : Add Other Mail Account.

Étape 10 — Décommissionnement Google/M365

Au jour J+30 (sécurité) :

  1. Vérification finale : aucun email récent uniquement sur Google.
  2. Export final via Google Takeout pour archive (.mbox).
  3. Annuler abonnement Google Workspace.
  4. Suppression données Google : 30 jours après cancel.
  5. Documentation interne wiki : « Migration terminée le DD/MM/YYYY ».

Erreurs fréquentes

Erreur Cause Solution
imapsync rate limit Google Trop de requêtes --noreleasecheck --tmpdir + sleeps
Authentification échec Google App Password obligatoire Activer 2FA Google + App Password
Labels Gmail vs folders Mailcow Concept différent imapsync --automap remappe
Volumes énormes timeout Connexion lente Lancer depuis VPS Hetzner directement
Doublons après resync Message-Id changé --useheader 'Message-Id' obligatoire
Calendrier non migré imapsync = mail uniquement Export ICS Google → import SOGo

Considérations propres à l'écosystème sous-régional

Trois précisions. Bandwidth : pour 100 GB total à migrer, lancer depuis VPS Hetzner direct (gigabit) plutôt que poste local (4G). Heures décalées : migration lourde 22h-5h heure locale pour ne pas saturer le réseau bureau. Communication équipe : webinar live avec Q&A. Vidéo enregistrée pour replay. Économies : 25 personnes Google Workspace = 3 600 USD/an. Migration 1 jour ROI immédiat.

Tutoriels frères

FAQ

imapsync paid version ? Open source GPL. Author propose support paid mais binaire gratuit.

Calendrier et contacts ? imapsync = mail. Calendar export ICS, contacts vCards.

Combien temps pour 100 GB ? 24-48h selon bandwidth. Lancer en parallèle 5-10 boîtes.

Filtres Gmail migrés ? Non. Recréer manuellement dans SOGo ou avec Sieve filtres serveur.

Sent items et drafts ? Migrés. imapsync copie tous les dossiers.

Pour approfondir

Étape 1 — Préparer le VPS Mailcow et estimer le coût

Avant de toucher à un seul mail, vérifiez que votre VPS supporte la charge. Mailcow Dockerized réclame officiellement 6 Go de RAM minimum, 20 Go de disque pour le système et au moins 1 Go par boîte mail à migrer. Pour une PME de 20 collaborateurs à Dakar ou Abidjan avec en moyenne 5 Go de mails par boîte, prévoyez un VPS à 8 Go RAM et 200 Go SSD, typiquement 25 EUR par mois (16 400 FCFA au taux fixe 1 EUR = 655,957 FCFA). Comparé aux 6 EUR par utilisateur de Google Workspace Business Standard, le break-even est à 5 utilisateurs.

Choisissez Debian 12 ou Ubuntu 24.04 LTS, IPv4 dédiée non blacklistée (testez sur mxtoolbox.com avant achat), et reverse DNS configurable côté hébergeur. Sans rDNS propre, vos mails finiront en spam chez Gmail et Outlook.

Étape 2 — Installer Mailcow Dockerized proprement

sudo apt update && sudo apt install -y curl git docker.io docker-compose-v2
sudo systemctl enable --now docker
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
sudo ./generate_config.sh
# Renseigner : mail.votre-domaine.com (FQDN du serveur mail)
sudo docker compose pull
sudo docker compose up -d

Au bout de 4 à 6 minutes (selon la connexion), docker compose ps doit afficher une vingtaine de conteneurs en état "Up". Connectez-vous sur https://mail.votre-domaine.com avec admin / moohoo et changez immédiatement le mot de passe. Si l'interface ne charge pas, c'est presque toujours un firewall qui bloque les ports 80, 443, 25, 465, 587, 993 — ouvrez-les avec sudo ufw allow.

Étape 3 — Configurer le domaine et les boîtes dans Mailcow

Allez dans Email → Configuration → Domains → Add domain. Renseignez votre domaine racine (sans sous-domaine), une quota par défaut (par exemple 10 Go), un nombre maximum de boîtes. Mailcow génère automatiquement les enregistrements DNS attendus : ne les publiez PAS encore, on les bascule à l'étape 6.

# Création en masse de boîtes via API Mailcow
curl -X POST https://mail.votre-domaine.com/api/v1/add/mailbox \
  -H "X-API-Key: VOTRE_CLEF_API" \
  -H "Content-Type: application/json" \
  -d '{
    "local_part": "fatou",
    "domain": "votre-domaine.com",
    "name": "Fatou Diop",
    "quota": "10240",
    "password": "MotDePasseFort!2026",
    "password2": "MotDePasseFort!2026",
    "active": "1"
  }'

La réponse JSON doit contenir {"type":"success"}. Pour 50 boîtes, scriptez en bash en lisant un CSV. Si la réponse contient "type":"danger", lisez le champ msg : généralement un mot de passe trop faible ou un local_part déjà existant. La clef API se génère dans System → Configuration → API.

Étape 4 — Migrer les boîtes via imapsync depuis Google ou Microsoft 365

Mailcow embarque un outil de migration IMAP (Email → Configuration → Sync Jobs). Mais pour 50 boîtes, lancer imapsync directement en CLI est plus rapide. Côté Google Workspace, créez un mot de passe d'application par compte (l'authentification IMAP standard est désactivée depuis 2022). Côté Microsoft 365, activez IMAP par utilisateur dans Exchange Admin Center et utilisez un mot de passe d'application si MFA actif.

# Installer imapsync sur le VPS Mailcow
sudo apt install -y imapsync

# Migration une boîte (exemple Gmail → Mailcow)
imapsync \
  --host1 imap.gmail.com --port1 993 --ssl1 \
  --user1 fatou@votre-domaine.com --password1 "mdp-app-google" \
  --host2 mail.votre-domaine.com --port2 993 --ssl2 \
  --user2 fatou@votre-domaine.com --password2 "MotDePasseFort!2026" \
  --automap --skipheader 'X-Gmail-Labels' \
  --logdir /var/log/imapsync

La sortie affiche en temps réel le nombre de messages copiés. Pour une boîte de 5 Go avec 30 000 messages, comptez 30 à 90 minutes selon la bande passante. Après complétion, la dernière ligne doit afficher "Detected 0 errors". Une erreur fréquente : "Login failed for password" côté Gmail — vous avez utilisé le mot de passe utilisateur au lieu du mot de passe d'application.

Étape 5 — Configurer SPF, DKIM et DMARC avant la bascule

Sans ces trois enregistrements, vos mails partent directement en spam chez Gmail, Yahoo et Outlook. Mailcow génère la clef DKIM dans Email → Configuration → ARC/DKIM keys (cliquez Add).

# Récupérer les valeurs à publier dans le DNS du domaine :

# SPF (TXT racine)
"v=spf1 mx a -all"

# DKIM (TXT sur dkim._domainkey)
"v=DKIM1; k=rsa; t=s; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."

# DMARC (TXT sur _dmarc, mode reporting d'abord)
"v=DMARC1; p=none; rua=mailto:dmarc@votre-domaine.com; aspf=s; adkim=s"

Publiez SPF et DKIM immédiatement (ces enregistrements n'affectent pas l'envoi en cours depuis Google ou Microsoft). Gardez DMARC en mode p=none pendant 7 à 14 jours pour collecter les rapports avant de passer en quarantine puis reject. Vérifiez la propagation avec dig +short TXT dkim._domainkey.votre-domaine.com.

Étape 6 — Basculer les MX records et baisser le TTL

Le moment critique. 48 heures avant la bascule, baissez le TTL de vos MX à 300 secondes (5 minutes) pour pouvoir rollback rapidement si problème.

# Vérifier les MX actuels
dig +short MX votre-domaine.com

# Anciens MX Google : aspmx.l.google.com (priorité 1), etc.
# Nouveaux MX Mailcow :
# Type MX, Priority 10, Value: mail.votre-domaine.com
# TTL: 300

# Vérifier après publication
dig +short MX votre-domaine.com
# Doit retourner : 10 mail.votre-domaine.com.

# Test envoi/réception
echo "Test Mailcow" | mail -s "Migration ok" fatou@votre-domaine.com
# Vérifier dans le webmail SOGo de Mailcow

Pendant les 24 à 48 heures de propagation DNS mondiale, certains expéditeurs continueront d'envoyer chez Google. C'est pourquoi on garde l'ancienne boîte Google active 7 jours et on relance imapsync à J+2 et J+7 en mode --addheader pour récupérer les derniers mails arrivés côté Google après le coupage.

Étape 7 — Configurer les clients (Outlook, Thunderbird, mobile)

Communiquez à chaque collaborateur les paramètres : IMAP mail.votre-domaine.com:993 SSL, SMTP mail.votre-domaine.com:465 SSL. Pour les mobiles, l'autoconfig Mailcow détecte automatiquement les paramètres si le sous-domaine autoconfig.votre-domaine.com et autodiscover.votre-domaine.com pointent (CNAME) sur le serveur Mailcow.

# DNS additionnels à publier
autoconfig.votre-domaine.com.    CNAME    mail.votre-domaine.com.
autodiscover.votre-domaine.com.  CNAME    mail.votre-domaine.com.

# Test autoconfig Thunderbird
curl https://autoconfig.votre-domaine.com/mail/config-v1.1.xml?emailaddress=fatou@votre-domaine.com

La réponse XML doit contenir les serveurs IMAP/SMTP. Si vous obtenez 404, Mailcow n'a pas généré la config — rechargez le conteneur nginx-mailcow avec docker compose restart nginx-mailcow.

Étape 8 — Sauvegarder Mailcow et résilier les anciens comptes

Mailcow inclut un script officiel de sauvegarde qui dump MySQL, copie vmail (les boîtes), Redis et Rspamd. Lancez-le quotidiennement.

cd /opt/mailcow-dockerized/helper-scripts
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups ./backup_and_restore.sh backup all --delete-days 14

# Cron quotidien à 3h
sudo crontab -e
# Ajouter :
0 3 * * * cd /opt/mailcow-dockerized/helper-scripts && MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups ./backup_and_restore.sh backup all --delete-days 14 >> /var/log/mailcow-backup.log 2>&1

Le lendemain matin, vérifiez la taille du dossier généré : il doit représenter approximativement la somme des quotas utilisés. Une fois Mailcow stable depuis 7 jours sans incident et imapsync final lancé, vous pouvez résilier les abonnements Google ou Microsoft. Conservez quand même un export Takeout/eDiscovery archivé hors-ligne pendant 12 mois pour conformité comptable et juridique.

Pour durcir Mailcow contre le spam et les attaques, voyez notre tutoriel Rspamd et postscreen Mailcow. Pour héberger un webmail moderne en complément, consultez le guide installation SnappyMail.

Partager