Outils pour utilisateurs

Outils du site


gmail_archiver

GMail archiver

GMail archiver backups all your emails from GMail (inbox, archived, sent). Mails will be saved in the standard "mbox" format which can be opened by almost any email client.

Requirements

  • You must have Python installed.
  • GMail must be configured in english. 1)
  • You must have activated IMAP feature:

Source

Click to show source

Click to show source

gmail_archiver.py
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
""" GMail archiver 1.1
 
This program will download and archive all you emails from GMail.
Simply enter your login and password, and all your emails will
be downloaded from GMail and stored in a standard mbox file.
This inclues inbox, archived and sent mails, whatever label you applied.
Spam is not downloaded.
 
This mbox files can later on be opened with almost any email client (eg. Evolution).
 
Author:
    Sébastien SAUVAGE - sebsauvage at sebsauvage dot net
    Webmaster for http://sebsauvage.net/
 
License:
 
    This program is distributed under the OSI-certified zlib/libpnglicense .
    http://www.opensource.org/licenses/zlib-license.php
 
    This software is provided 'as-is', without any express or implied warranty.
    In no event will the authors be held liable for any damages arising from
    the use of this software.
 
    Permission is granted to anyone to use this software for any purpose,
    including commercial applications, and to alter it and redistribute it freely,
    subject to the following restrictions:
 
        1. The origin of this software must not be misrepresented; you must not
           claim that you wrote the original software. If you use this software
           in a product, an acknowledgment in the product documentation would be
           appreciated but is not required.
 
        2. Altered source versions must be plainly marked as such, and must not
           be misrepresented as being the original software.
 
        3. This notice may not be removed or altered from any source distribution.
 
Requirements:
 
    - a GMail account with IMAP enabled in settings.
    - GMail settings in english
    - Python 2.5
"""
import imaplib,getpass,os
 
print "GMail archiver 1.1"
user = raw_input("Enter your GMail username:")
pwd = getpass.getpass("Enter your password: ")
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("[Gmail]/All Mail")
resp, items = m.search(None, "ALL")
items = items[0].split()
print "Found %d emails." % len(items)
count = len(items)
for emailid in items:
    print "Downloading email %s (%d remaining)" % (emailid,count)
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    # We duplicate the From: line to the beginning of the email because mbox format requires it.
    from_line = "from:unknown@unknown"
    try:
        from_line = [line for line in email_body[:16384].split('\n') if line.lower().startswith('from:')][0].strip()
    except IndexError:
        print "  'from:' unreadable."
    email_body = "From %s\n%s" % (from_line[5:].strip(),email_body)
    file = open("%s.mbox"%user,"a")
    file.write(email_body)
    file.write("\n")
    file.close()
    count -= 1
print "All done."

Usage

Start the Python script, then enter your login and password, then wait for the end of operations. Mails will be saved in yourlogin.mbox.

Adapting the inbox name

Depending on the language your GMail account is in, you will have to change the "Inbox" name in the previous source code (m.select("[Gmail]/All Mail")). Thanks to BoboTiG, here is the list:

all_mail = [
    "Semua Email", # Bahasa Indonesian
    "Semua Mel", # Bahasa Melayu
    "Tots els missatges", # Català
    "V&AWE-echny zpr&AOE-vy", # Cesky
    "Alle e-mail", # Dansk
    "Alle Nachrichten", # Deutsch
    "K&APU-ik kirjad", # Eesti keel
    "All Mail", # English (US|UK)
    "Todos", # Espanol
    "Mezu guztiak", # Euskara
    "Lahat ng Mail", # Filipino
    "Tous les messages", # Français
    "Sva po&AWE-ta", # Hrvatski
    "Tutti i messaggi", # Italiano
    "Allur p&APM-stur", # Islenska
    "Barua Zote", # Kiswahili
    "Visas v&ARM-stules", # Latviesu
    "Visi lai&AWE-kai", # Lietuvi
    "&ANY-sszes lev&AOk-l", # Magyar
    "Alle berichten", # Nederlands
    "All e-post", # Norks (Bokmal)
    "Wszystkie", # Polski
    "Todos os e-mails", # Português (Brasil)
    "Todo o correio", # Português (Portugal)
    "Toate mesajele", # Româna
    "V&AWE-etky spr&AOE-vy", # Slovensky
    "Vsa po&AWE-ta", # Slovenscina
    "Kaikki viestit", # Suomi
    "Alla mail", # Svenska
    "T&HqU-t c&HqM- th&AbA-", # Tieng Viet
    "T&APw-m Postalar", # Türkçe
];
1)
The IMAP folder names depend on the language. You can use your own language, but you will have to adapt the line m.select("[Gmail]/All Mail")).

Discussion

Karl3i, 2011/04/17 18:28

Hi,

thanks for this code snippet. I'm not able to run it, I think this is because of my Python version (3.2).

The line: print “GMail archiver 1.1” gives me a syntax error - it should be print(“xxx”) in 3.2. I will try to see if this is the only syntax difference between 2.5 & 3.2 regarding this snippet.

Regards,

Karl3i.

Sébastien SAUVAGE, 2011/05/09 14:55, 2012/05/31 13:26

My program work under Python 2.X (2.6 or 2.7). It's not compatible with Python 3. I haven't checked it against Python 3 at this time.

Frank, 2011/07/24 18:50

Salut ! J'ai python 2.7.1 sur ubuntu 11.04, Gmail en anglais(UK), l'IMAP activé, et j'ai des erreurs en sortie, ça ressemble à ça :

franku@frqnkU:~/Bureau$ python gmail_archiver.py GMail archiver 1.1 Enter your GMail username:blablabla@gmail.com Enter your password: Traceback (most recent call last):

File "gmail_archiver.py", line 54, in <module>
  resp, items = m.search(None, "ALL")
File "/usr/lib/python2.7/imaplib.py", line 627, in search
  typ, dat = self._simple_command(name, *criteria)
File "/usr/lib/python2.7/imaplib.py", line 1070, in _simple_command
  return self._command_complete(name, self._command(name, *args))
File "/usr/lib/python2.7/imaplib.py", line 825, in _command
  ', '.join(Commands[name])))

imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED franku@frqnkU:~/Bureau$

Je n'y connais présentement rien en python (ou n'importe quel langage en fait), mais au vu de l'erreur, c'est dû à la version 2.7 ? Ou a une configuration de mon compte gmail ? (always https=on) D'après ce que j'en comprends, il aime pas la commande “search” pendant qu'on est en train de s’authentifier ? Merci par avance :-)

Cordialement, Frank

Sébastien SAUVAGE, 2011/07/25 13:23

Je ne peux pas tester là maintenant, mais apriori je dirai que tu n'es pas correctement authentifié sur le serveur (mauvais mot de passe ?)

Thom, 2011/07/25 13:06

Ca marche sous windows ?

Sébastien SAUVAGE, 2011/07/25 13:22

oui ça marche sous Windows.

Thoams, 2011/07/25 13:23

Ok merci

Thoams, 2011/07/25 14:16

Et comment on fait pour le faire fonctionner avec GMAIL en français ?

Pruls, 2011/07/25 18:05

Je teste à l'instant, j'ai remplacé “All Mail” de ”[Gmail]/All Mail” par “Tous les messages” et ça semble fonctionner.

Si quelqu'un a une solution simple pour lancer le programme sous Ubuntu de manière automatique si la dernière mise à jour est trop vieille, je suis preneur.

L'idéal serait qu'au lancement du PC une vérification automatique se lance puis déclenche si besoin la mise à jour.

Merci d'avance!

PS: j'ai pas bien compris où les mails étaient enregistrés, mais là, le programme bosse sur mes 14471 mails ^^, je verrai plus tard.

herberts, 2011/07/26 02:17

Les mails sont enregistrés dans un fichier nommé tonlogingmail.mbox, situés dans le dossier d'où tu as lancé le script de sauvegarde.

Pour lancer le programme de manière automatique, tu peux déjà mettre en place une règle cron, par exemple une fois par mois ou autre.

Sinon avec un script dans ce genre :

http://paste.tdct.org/index.php?m

que tu lancerais dans tes programmes au démarrage d'ubuntu

Bon là je l'ai fait vite fait ça demande quelques améliorations, notamment en l'état il faut que le script, le fichier mbox et gmail_archiver.py soient dans le même dossier. De plus, pour que ça marche sans te demander ton login / mdp à chaque fois, il faudrait les entrer “en dur” dans gmail_archiver.py :

remplacer

user = raw_input(“Enter your GMail username:”)

pwd = getpass.getpass(“Enter your password: ”)

par

user = “tonlogin”

pwd = “tonmotdepasse”

Enfin pour finir le script ne teste pas l'existence du fichier donc il faut lancer gmail_archiver.py une première fois à la main avant d'utiliser ce script.

si ça peut te donner une piste ;)

Pruls, 2011/07/26 07:09

Bonjour,

merci pour ces infos, je testerai ce soir.

Pour éviter de demander les login et mdp, j'y avais pensé mais je me suis demandé si ce n'était pas un risque en terme de sécurité?

herberts, 2011/07/26 10:36

Ah ben si, à partir du moment où tu écris tes login / mot de passe dans un fichier, il y a un risque. Mais pas plus que d'enregistrer les mot de passe dans firefox sans mettre de mot de passe principal.

C'est à toi de voir, tu peux aussi laisser la demande de login / mdp, mais ça veut dire qu'il te les demandes à chaque démarrage. Sinon le lancer à la main, de temps en temps.

Pruls, 2011/07/26 21:05

Bonsoir,

le script a l'air de fonctionner mais j'ai pas le temps de voir ce qu'il renvoi, le terminal se ferme trop vite!

J'ai changé le délais à 1 jour pour voir si ça marche. Après, je mettrais surement 15 jours comme proposé par défaut.

herberts, 2011/07/26 21:48

Tu le lances comment ?

parce que si tu ouvres un terminal (dans le dossier où est le script) et que tu lances ./lenomduscript le terminal ne devrait pas se refermer.

Au passage, merci sebsauvage pour ton programme, ça faisait un moment que je voulais récupérer tous mes mail “au cas où”, c'est chose faite :).

Pruls, 2011/07/27 07:06

J'ai lancé en cliquant dessus et en lançant dans un terminal.

Et oui, merci Sebsauvage d'avoir attiré mon attention, une fois de plus, sur le minitel Google et de proposer une solution.

Cal, 2011/07/28 07:41

Salut,

d'abord un grand merci d'avoir créé ce script et de le partager. J'ai essayé de le faire tourner mais j'ai le même problème que Frank (commentaire n°3). Je ne pense pas que ce soit un problème d'identification. J'ai d'abord cru que c'était du au fait que je lançais le script depuis mon travail (donc derrière un proxy) mais même depuis chez moi, j'ai le même problème. Quelqu'un peut il m'aider s'il vous plait ? Ah oui en cherchant sur le net et dans la doc j'ai trouvé que cela pouvait être un problème de port à définir (port 993 a priori) mais ça n'a pas l'air d'être ça non plus. Merci d'avance.

carmelo, 2011/08/09 09:08

Merci pour ce script, il tourne en ce moment même sur mon Hackintosh ;)

Petite question : une fois le script fini, si je le relance quelques jours plus tard, est-ce qu'il fera une sauvegarde incrémentale ? Ou il recommence tout à zéro ?

Merci :)

Sébastien SAUVAGE, 2011/08/19 14:03

Il recommence tout à zéro (ah désolé je n'ai pas fait en finesse). Perso, je le fais tourner une fois par semaine, en tâche de fond.

Pruls, 2011/08/09 09:15

Houla, aucune sauvegarde ne s'est faite depuis que j'ai bidouillé… J'ai du faire un truc de travers…

Merci Carmelo d'avoir posté, l'alerte que j'ai reçue va me permettre de me repencher sur la question!

octy, 2011/08/11 21:16

Bonjour, merci pour ce script que j'utilise. Malheureusement après un essai ce soir, j'ai les mêmes symptômes que Frank et Carmelo.

Traceback (most recent call last): File ”../gmail_archiver.py”, line 54, in <module> resp, items = m.search(None, “ALL”) File ”/usr/lib/python2.7/imaplib.py”, line 627, in search typ, dat = self._simple_command(name, *criteria) File ”/usr/lib/python2.7/imaplib.py”, line 1070, in _simple_command return self._command_complete(name, self._command(name, *args)) File ”/usr/lib/python2.7/imaplib.py”, line 825, in _command ', '.join(Commands[name]))) imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED

Ma config: ubuntu 11.04, python 2.7.1

Sébastien SAUVAGE, 2011/08/19 14:05

ça doit être que tu n'a pas sélectionner le bon nom pour ton “inbox”: m.select(”[Gmail]/All Mail”)

C'est différent selon la langue configurée dans GMail.

Julien, 2011/08/29 09:08

Bonjour,

Je viens d'appliquer le script, mais le truc qui me gène, c'est qu'il marque lu les messages non lus qui étaient dans ma boîte mail…

Est ce possible de remédier à ça ?

Sinon, le script a merdoyé plusieurs fois avant que j'arrive à tout télécharger, sans raison apparente (si ce n'est que 5000 mails, c'est long).

Merci pour ton script

tony, 2012/03/04 12:53

Merci pour ce script.

J'ai eu un problème avec Python 2.6 (et bcp bcp de mails à rapatrier):

<pre> Traceback (most recent call last):

File "gmail_archiver.py", line 59, in <module>
  resp, data = m.fetch(emailid, "(RFC822)")
File "C:\Python26\lib\imaplib.py", line 436, in fetch
  typ, dat = self._simple_command(name, message_set, messa
File "C:\Python26\lib\imaplib.py", line 1060, in _simple_c
  return self._command_complete(name, self._command(name,
File "C:\Python26\lib\imaplib.py", line 888, in _command_c
  typ, data = self._get_tagged_response(tag)
File "C:\Python26\lib\imaplib.py", line 989, in _get_tagge
  self._get_response()
File "C:\Python26\lib\imaplib.py", line 951, in _get_respo
  data = self.read(size)
File "C:\Python26\lib\imaplib.py", line 1161, in read
  chunks.append(data)

MemoryError </pre>

J'ai appliqué ce patch: http://hg.python.org/cpython/rev/0dee36595699

Sébastien SAUVAGE, 2012/03/20 09:57

Hello. Je n'ai jamais eu ce problème. Peut-être en ré-essayant sans le patch ?

Tom, 2012/05/23 19:09

Merci Seb pour ce petit script fort utile qui fait bien ce qu'on lui demande. J'ai le terminal qui tourne en tâche de fond… 16 953 mails, soit 5 ou 6 ans de correspondances, ça risque de prendre un peu de temps :D

Enfin bref, moi qui souhaite me débarrasser de Gmail, ça me facilite grandement les choses !

kleim, 2012/07/30 08:26

Avec les nouvelles mesures de sécurité de Google, il n'y a aucune chance que ce script marche si tu entres ton mot de passe normal. Google ne reconnaîtra pas la “machine” ui essaye de connecter et enverra une demande de double authentification que tu ne recevras jamais.

Je te conseille donc de créer un token à l'adresse suivante que tu pourras utiliser comme “mot de passe” : https://accounts.google.com/b/0/IssuedAuthSubTokens?hl=fr

mart-e, 2012/07/31 08:36

Petite précision concernant le “All Mail”. J'ai mis un certain temps à comprendre d'où venait le problème mais il faut activer le label “All Mail” depuis l'interface pour y accéder en ligne de commande. Settings > Label > All Mail > Show in IMAP.

Vérification facile:

  >>> m.list("[Gmail]")''
  ('OK', ['(\\Noselect \\HasChildren) "/" "[Gmail]"', '(\\HasChildren \\HasNoChildren) "/" "[Gmail]/All Mail"', '(\\HasNoChildren) "/" "[Gmail]/Important"', '(\\HasNoChildren) "/" "[Gmail]/Spam"'])
mart-e, 2012/07/31 10:27

For python 3 users, I have ported the code to be compatible with both versions of python (tested with python 2.7 and 3.2). It was mostly type checking and print functions.

You can find the code here http://paste.mart-e.be/fowupemelu.py

Please notice that the code seems not to work on too big email lists for an unknown reason (cf http://stackoverflow.com/q/11736842/147904) when using python 3 (was ok with 400 emails, failed with 6000).

I have tester it on my inbox, passed with both versions of python but there may be some strange-encoding cases that have not been tested.

mart-e, 2012/07/31 20:30

Ok I have been a bit fast to post it maybe, still had some encoding problem. This version should work better http://paste.mart-e.be/jaqasewadu.py

gmail_archiver.txt · Dernière modification : 2021/07/19 05:56 de sebsauvage