Sauve­gar­der Gmail

J’ai un histo­rique de 25 ans d’emails et j’y tiens. Il m’ar­rive encore régu­liè­re­ment d’al­ler fouiller pour retrou­ver trace de contacts ou d’échanges d’il y a 10 ans. Je l’ai fait encore ce matin.

Je tiens donc à assu­rer la péren­nité de tout ça. J’ai confiance en Google1 mais j’ai déjà lu les récits de personnes qui se sont vus clôtu­rer leur compte sans préavis ni possi­bi­lité de récu­pé­ra­tion. Je ne suis pas non plus à l’abri de faire moi-même des bêtises dans mon compte.

J’ai déjà utilisé Getmail par le passé pour télé­char­ger un à un tous mes emails en prove­nance de Google. Il n’a cepen­dant pas été mis à jour pour Python3. Getmail6 semble avoir pris le relai et il a la bonne idée d’être dispo­nible sous macos via home­brew.

POP3

Mon compte dépasse le demi-million d’emails archi­vés. La synchro­ni­sa­tion IMAP semble prendre des années à balayer tous les emails pour savoir lesquels sont nouveaux depuis la dernière fois. C’est jouable si vous avez juste quelques dizaines de milliers d’emails. Au-delà il faut utili­ser le bon vieux POP3.

  1. Acti­ver POP3 dans les options de Gmail
  2. S’as­su­rer de le confi­gu­rer pour récu­pé­rer tous les emails et pas unique­ment ceux qui arrivent à partir d’aujourd’­hui.

Si vous aviez déjà utili­ser POP3 par le passé, il faut lui deman­der de réac­ti­ver le télé­char­ge­ment de tous les emails, y compris ceux qui ont déjà été télé­char­gés.

Si vous avez déjà un client email qui se connecte en POP3, passez-le en IMAP. Ils se feraient concur­rence. Vous auriez une partie des emails d’un côté et une partie de l’autre.

Confi­gu­ra­tion

Ma confi­gu­ra­tion getmailrc ressemble à ça :

L’uti­li­sa­teur est l’adresse email complète. N’uti­li­sez pas votre mot de passe Google et créez un mot de passe d’ap­pli­ca­tion dédié, ça vous permet­tra de le révoquer un jour. Pensez à proté­ger ce fichier de confi­gu­ra­tion parce que celui qui y aura accès aura aussi accès à votre compte Google.

Le para­mètre recei­ved assure que Getmail récu­père le message tel quel, sans ajou­ter d’en­tête.

Erreurs de synchro­ni­sa­tion

Google envoie tous les emails par groupes de 200 à 1000 non télé­char­gés à chaque appel POP3. Si le para­mètre read_all est à false, Getmail ne télé­charge pas les emails qu’il a déjà vu.

Pour une raison ou une autre, ça peut partir en boucle si Getmail pense avoir déjà vu un email que Google pense pour­tant ne pas être déjà télé­chargé : L’email va être repro­posé à chaque fois. Si ça fait ça sur plusieurs centaines d’emails, vous prenez le risque que vous restiez bloqué sur le même groupe d’emails indé­fi­ni­ment à chaque appel.

Véri­fiez bien que le read_all est à true. Si le problème persiste, une solu­tion est de passer par le type BrokenUIDLPOP3SSLRe­trie­ver plutôt que SimplePOP3SSLRe­trie­ver. Getmail télé­charge alors systé­ma­tique­ment les messages sans se préoc­cu­per de ce qu’il a déjà lu ou non.

Quota

Gmail a des quota sur ses APIs. Pour initia­li­ser mon demi-million d’emails j’ai lancé Getmail en boucle et je suis tombé sur des erreurs 403. Si vous devez comme moi initia­li­ser plusieurs dizaines de Go, ça demande un peu de surveillance.

Le quota semble toute­fois très très large. En rythme de croi­sière je compte proba­ble­ment synchro­ni­ser 1 à 2 fois par jours mais on peut sans problèmes faire plusieurs synchro­ni­sa­tion par heures si ça vous semble indis­pen­sable.

Mail­dir

Il y a deux formats, mbox et mail­dir. Mbox c’est un unique gros fichier, un peu comme une archive tar. Mail­dir c’est un réper­toire avec un fichier par email, ce qui me semble plus adapté pour des sauve­gardes avec de nouveaux emails tous les jours.

Initia­li­ser un mail­dir c’est juste un réper­toire qui contient un sous-réper­toire tmp, un new, et un cur. Tous les emails envoyés par Getmail iront dans new.

Il reste que pour mon demi-million d’emails ça commence à faire beau­coup de fichiers dans un seul réper­toire. J’ai fait un petit script qui parcourt l’in­té­gra­lité des emails, lit la date2, et les répar­tit dans des mail­dir spéci­fiques par année. Ça faci­li­tera aussi la sauve­garde et me permet­tra éven­tuel­le­ment de faire un zip pour les vieilles années.

Emails envoyés

Le problème du POP3 c’est que ça ne télé­charge que les emails reçus, pas les emails envoyés. J’ai donc dû ajou­ter une seconde synchro­ni­sa­tion IMAP sur le dossier des emails envoyés. Là j’ai dans les 30 000 emails. C’est long à parcou­rir mais encore jouable tant que je ne lance pas la récu­pé­ra­tion toutes les deux minutes.

J’ai donc deux fichiers getmailrc, un pop.getmailrc (emails reçus) et un imap.getmailrc (emails envoyés). Je dois donc manuel­le­ment spéci­fier les para­mètres –rcfile= quand j’ap­pelle Getmail. On peut spéci­fier plusieurs fois le para­mètre, les synchro­ni­sa­tions sont alors lancées l’une après l’autre.

J’en­vois ça vers le même dossier mail­dir, puis fais la même répar­ti­tion par année.

Enre­gis­trer en tâche plani­fiée

Sous Linux il suffit proba­ble­ment de faire une entrée dans le cron.

Sous Macos, si je veux que la synchro­ni­sa­tion s’exé­cute même quand je ne suis pas connecté, il faut enre­gis­trer le script dans /Library/Laun­chDae­mons.

Comme le réper­toire desti­na­tion de mes sauve­garde est hors de mon disque prin­ci­pal, Macos impose aussi que le programme lancé ait la permis­sion spéciale « full disk access ». Getmail n’est qu’un script Python et je n’ai pas voulu donner des droits larges à tout Python. J’ai dû faire un programme natif qui lance mon script Getmail et donner les droits sur le disque à ce script là.

Je ferai proba­ble­ment un billet dédié à tout ça.

Entre temps j’ai presque 40 Go d’his­to­rique email à synchro­ni­ser depuis Google par batch de 200 à 1000 mails. Ça va me prendre un peu de temps.


  1. Oui, j’uti­lise Google. J’ai soupesé plein de fois les alter­na­tives mais toutes auraient demandé un compro­mis signi­fi­ca­tif et je ne suis pas encore passé à l’ac­tion. Ça vien­dra. J’ai besoin de trou­ver le bon équi­libre et de ne pas perdre la recherche dans le passé. ↩︎
  2. Je ferais un billet spéci­fique, ça s’est révélé bien moins évident que je ne l’ima­gi­nais naïve­ment. ↩︎

Comments

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *