Quelques notes et remarques à ce sujet

Script : gmail_archiver-fr_cron.py

#!/bin/env python2
# coding: UTF-8

########################################################################
# GMail Archiver 1.1
#
# 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
#=======================================================================
# Modification de GMail Archiver pour cron.
#
# Auteur :
#	Thibaud CANALE
#	http://thican.net/
#	thican [at] thican [dot] net
#
# Licence :
#	GPL v3 (pour l'instant, je ne suis pas très bien renseigné)
########################################################################

import getopt,sys,time
import imaplib,getpass,os
import subprocess

def recup_opts():
    """ Récupère les options en paramètres. Utile pour tâche automatisée ou script.

    Il est conseillé de faire un test en ligne de commande avant de rajouter directement une entrée dans cron, car les mots de passe contenant des caractères spéciaux peuvent ne pas passer correctement en entrées.


    Conseils d'installations et d'utilisations :
    - récupérez ce script
    	wget http://thican.net/gmail_archiver-fr_cron.py
    - avec les droits root, stockez ce fichier dans /usr/local/bin/
    	sudo mv gmail_acchiver-fr_cron.py /usr/local/bin
    - avec les droits root, donnez les droits d'utilisation suivants rwxr-xr-x
    	sudo chmod 755 /usr/local/bin/gmail_archiver-fr_cron.py
    - créez une entrée dans cron avec votre simple utilisateur (pas besoin de créer cet entrée chez root, sauf si vous préférez qu'on évite de fouiller justement votre cron pendant votre absence ...)
    	crontab -e
        0 12 1 * * /usr/local/bin/gmail_archiver-fr_cron.py -u votre_utilisateur --pwd 'votre_mot_de_passe' -o /le_répertoire_de_votre_choix # Exécution à midi le premier jour de chaque mois.
    - ???
    - PROFIT!


    Commandes :
    -a/--ask	Ignore les paramètres user et pwd entrés en ligne de commande. -o/--dest est conservé.

    -h/--help	Affiche le message d'aide et quitte.

    -o/--dest	Le répertoire où sera stocké le fichier final.
    		Attention ! Il sagit du répertoire et non du fichier ! À la fin, le fichier aura pour destination /"dest"/"user"-"la_date_avec_heures".mbox

    --pwd	(Obligatoire) Le mot de passe du compte Gmail en question. Attention ! Si vous avez des caractères spéciaux, vous devez mettre entre simples quotes. Un mot de passe contenant une ou plusieurs simple quotes (apostrophe) n'est pas conseillé.

    -u/--user	(Obligatoire) Le nom d'utilisateur du compte Gmail en question (fonctionne sans le arobase '@', à tester avec)


    Requière :
    - Python 2.5
    - et les besoins de GMail archiver 1.1 (voir ci-dessous)


    Auteur :
        Thibaud CANALE
        http://thican.net/
        thican [at] thican [dot] net

    Licence : GPL v3
    """
    # Initialisation des variables par défaut.
    if os.geteuid() != 0:
        process = subprocess.Popen("whoami",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
        (sout,serr) = process.communicate()
        process.wait()
        destdefaut = "/home/%s" % sout.strip()
    else:
        destdefaut = "/root"
    dest = destdefaut
    option = True
    pwd = None
    user = None

    # Déclaration des options.
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'aho:u:', ['ask', 'help', 'dest=', 'pwd=', 'user='])
    except getopt.GetoptError, err:
        # print help information and exit:
        print str(err) # will print something like "option -a not recognized"
        sys.exit(2)

    # Acquisition des options.
    for o, a in opts:
        if o in ("-a","--ask"):
            option = False
        elif o in ("-h","--help"):
            help()
            sys.exit(255)
        elif o in ("-o","--dest"):
            dest = a
        elif o == "--pwd":
            pwd = a
        elif o in ("-u","--user"):
            user = a
        else:
            assert False, "unhandled option"

    # Vérification des options requises au fonctionnement du script d'archivage et appel.
    if (option == False):	# Cet option permet de rentrer à la main les informations.
        user = raw_input("Entrez votre nom d'utilisateur GMail : ")
        pwd = getpass.getpass("Entrez votre mot de passe : ")
    else:	# l'option -a/--ask n'a pas été entrée, donc les identifiants sont donc remplis par les options.
        if user == None or pwd == None:
            print "Echec : Au moins un des paramètres (user,pwd) est manquant.\nSi vous souhaitez entrer vos identifiants pendant l'exécution, veuillez rajouter l'option -a ou --ask."
            sys.exit(1)

    # Essayer ici si le fichier s'ouvre, sinon changer destination pour le $HOME et renouveller le contenu de la variable fichier.
    fichier = "%s/%s%s.mbox" % (dest,user,time.strftime("-%Y%m%d_%H%M"))
    # Note de l'auteur : oui, un try imbrigué dans un try pour faire la même vérification, ce n'est pas joli, mais je ne m'aitrise pas le python. ;)
    try:
        file = open(fichier,"a")
    except IOError:
        print "IOError : impossible d'écrire le fichier."
        if (dest == destdefaut):
            # Si nous sommes déjà dans le dossier par défaut, à savoir le /home de l'utilisateur ou le /root, ça ne sert à rien de recommencer, donc on quitte.
            print "Le fichier ne peut être créé.\nAbandon."
            sys.exit(2)
        else:
            # On retente avec le dossier par défaut (/home ou /root)
            dest = destdefaut
            fichier = "%s/%s%s.mbox" % (dest,user,time.strftime("-%Y%m%d_%H%M"))
            try:
                file = open(fichier,"a")
            except IOError:
                # Deuxième et dernière tentative, vu qu'il s'agit du dossier par défaut. Fin de programme.
                print "IOError : impossible d'écrire le fichier."
                print "Le fichier ne peut être créé.\nAbandon."
                sys.exit(2)
    # Le fichier a pu être ouvert, on continue.
    file.close()
    gmail_archiver(user,pwd,fichier)


def help():
    """ Affiche l'aide du programme, et quitte."""
    print """GMail Archiver 1.1 pour cron


    Ce programme télécharge et archive tous vos courriels de votre compte GMail vers un fichier standard mbox.
    Les dossiers insclus sont Boîte de réception, Archivés et Messages envoyés, quelque soit le label.
    Ceux contenus dans la Corbeille et la boîte Spam ne sont pas récupérés.
    
    Le fichier .mbox au final est lisible et manipulable avec n'importe quel client courriel (exemple : Icedove/Thunderbird)


    Options :
    -h/--help	Affiche cette aide et quitte.
    -o/--dest	Le répertoire où sera stocké le fichier final.
    		Attention ! Il sagit du répertoire et non du fichier ! À la fin, le fichier aura pour destination /"dest"/"user"-"la_date_avec_heures".mbox
    --pwd	(Obligatoire) Le mot de passe du compte Gmail en question. Attention ! Si vous avez des caractères spéciaux, vous devez mettre entre simples quotes. Un mot de passe contenant une ou plusieurs simple quotes (apostrophe) n'est pas conseillé.
    -u/--user	(Obligatoire) Le nom d'utilisateur du compte Gmail en question (fonctionne sans le arobase '@', à tester avec)


    De plus amples informations à l'intérieur du fichier, ouvrez-le avec un simple éditeur de texte par exemple.
    """
    return

def gmail_archiver(user,pwd,fichier):
    """ 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 french
	- Python 2.5
    """
 
    print "GMail archiver 1.1"


    # Code original de GMail archiver 1.1
    m = imaplib.IMAP4_SSL("imap.gmail.com")
    m.login(user,pwd)
    m.select("[Gmail]/Tous les messages")
    resp, items = m.search(None, "ALL")
    items = items[0].split()
    count = len(items)
    print "%d courriels trouvés." % count
    for emailid in items:
        print "Téléchargement courriel %s (%d restant)" % (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."
        # TODO: Erreur, il manque la date avec cette première ligne.
        email_body = "From %s\n%s" % (from_line[5:].strip(),email_body)
        file = open(fichier,"a")
        file.write(email_body)
        file.write("\n")
        file.close()
        count -= 1
    m.close()
    m.logout()
    print "Terminé avec succés.\n"

    print "%s" % fichier	# Tentative ici d'afficher le lien vers le fichier final, pour ensuite le manipuler automatiquement (exemples : chiffrement avec GPG par exemple, stockage avec dupplication ou alertes)

if __name__ == "__main__":
    recup_opts()