Envoyer des photos par mail

4 05 2009

Il y a peu, j’ai passé ma chère Maman sous Ubuntu Jaunty (version 9.04). Un de ses besoins est de pouvoir envoyer une ou des photos à ses amis. Rien de bien méchant en somme, sauf qu’elle ne veut pas envoyer les versions haute définition générées par son appareil photo : on ne peut pas en envoyer beaucoup dans un même mail et ses amis mettent trop de temps à les récupérer.

Je lui ai donc développé un script Nautilus en Python.

Pré-requis

Je me suis basé sur une installation standard d’Ubuntu Jaunty. Le client de messagerie est Evolution et le gestionnaire de fichiers est Nautilus.

Le seul paquet à installer est Image Magick :

sudo apt-get install imagemagick

Le script utilise aussi python-gnome2-desktop et zenity mais il sont installés en standard.

Téléchargement

Télécharger le script Envoyer des photos par mail

Installation

Copier le fichier contenant le script dans le répertoire ~/.gnome2/nautilus-scripts

Vous pouvez changer le nom du script à votre convenance en gardant à l’esprit qu’il doit commencer par une majuscule.

Utilisation

  1. Sélectionner les photos à envoyer dans Nautilus
  2. Appeler le menu contextuel sur cette sélection (clic droit de la souris) et sélection Scripts → Envoyer des photos par mail
  3. Sélectionner le destinataire
  4. La fenêtre de composition de mail d’Evolution apparaît vous permettant de faire les dernières modifications avant envoi (changement de destinataire, de sujet, de message, suppression ou ajout de pièce jointe etc.)

Développement

Ce script a été développé en Python. Il utilise plusieurs facilités :

  • Interfaçage avec le système de script de Nautilus
  • Accès à la liste des contacts d’Évolution
  • Utilisation de Zenity (choix du destinataire, barre de progression)
  • Utilisation d’Image Magick pour le redimensionnement des photos en 640×480 avec une qualité à 75%
  • Appel d’évolution depuis la ligne de commande

Scripts Nautilus

Pour récupérer une liste des fichiers (ou dossiers) sélectionnés dans Nautilus, il suffit d’utiliser la commande suivante :

fichiers=getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS","").splitlines()

Nautilus enregistre la liste des fichiers sélectionnés dans une variable d’environnement, chaque entrée étant séparée par un retour à la ligne que la méthode splitlines permet de séparer.

On obtient ainsi une liste qu’une simple boucle for permet de parcourir.

Liste de contacts Evolution

Le paquet python-gnome2-desktop offre la possibilité au développeur Python d’accéder à la liste des contacts d’Evolution à travers ebook.

adresses=ebook.open_addressbook('default')
for contact in adresses.get_all_contacts()
    print contact.get_name()
    print contact.get_property('email-1')

Note : pour plus d’infos sur l’accès au carnet d’adresses, visiter la page Three Useful Python Bindings – ClamAV, Apt and Evolution

Zenity

Zenity est une application couramment installée en standard sur les distributions Linux. Elle permet à tout programme en ligne de commande d’offrir une interface graphique simple à l’utilisateur. Elle est facilement accessible avec la commande Popen de Python.

Ici, Zenity est utilisée pour afficher la liste des destinataires (sur 2 colonnes) et récupérer le choix de l’utilisateur. Elle est aussi utilisée pour afficher une barre de progression.

Cette dernière utilisation est plus subtile car la commande Zenity affichant la barre de progressions  est lancée en parallèle du traitement du script. Pour indiquer à Zenity un changement dans la progression, on a préalablement récupéré le pipe d’entrée du processus créé.

progress=Popen(["zenity","--title","Titre","--text","Texte","--progress","--auto-close"],stdin=PIPE)
progress.stdin.write(str(50))

En positionnant l’option auto-close, on s’assure que le processus de Zenity se terminera automatiquement dès que la barre de progression arrivera à 100%.

Image Magick

Image Magick est utilisé 2 fois dans le script : une première fois pour s’assurer que le fichier est bien une image reconnue par Image Magick (identify) et une seconde fois pour effectuer la transformation.

Quel que soit le format de la photo en entrée, Image Magick génèrera une image JPEG.

Appel d’Evolution

Pour appeler Evolutin depuis Python et lui faire afficher la fenêtre de composition, il suffit de lui passer une URI mailto :

evolution mailto:toto@example.com?subject=Photos&attachment=/a/b/c&attachment=/x/y/z

Notes :

  • Pour n photos, il y aura n parties attachment
  • Il faut impérativement fournir un chemin absolu pour les pièces jointes, sinon Evolution ne les trouvera pas, même si elles se trouvent dans le répertoire courant.

Code source

#!/usr/bin/env python
# coding=utf8
from subprocess import Popen,PIPE,call
from tempfile import mkstemp
from os import unlink,fdopen,getenv
from time import sleep
from evolution import ebook

"""
Pré-requis :
- Evolution
- Image Magick (convert, identify)
- Python-gnome2-desktop
- Zenity

Installer ce fichier dans ~/.gnome2/nautilus-scripts
"""

def filetemp(suffix):
    (fd,fname)=mkstemp(suffix)
    return (fdopen(fd,"w+b"),fname)

# Affiche la liste des adresses emails pour faire un choix
addresses=ebook.open_addressbook('default')

args =["zenity","--list","--title","Destinataire","--text","Sélectionner le destinataire"]
args+=["--width","500","--height","600"]
args+=["--column","Contact","--column","E-mail","--print-column","2"]
for contact in addresses.get_all_contacts():
    email=contact.get_property('email-1')

if type(email) is str: args+=[contact.get_name(),email]

address=Popen(args,stdout=PIPE).communicate()[0]

if address.strip()=="": exit(1)

# Réduit les photos pour les envoyer par mail
images     =getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS","").splitlines()
attachments=[]
progress   =Popen(["zenity","--title","Préparation","--text","Réduction des images...","--progress","--auto-close"],stdin=PIPE)
index      =1
for image in images:
    # Vérifie qu'il s'agit bien d'une image
    if call(["identify","-quiet",image])==0:
        tmp_out=filetemp(".jpg")
        tmp_out[0].close()
        call(["convert",image,"-quality","75%","-resize","640x480>",tmp_out[1]])

        # Ajoute le fichier à la liste des pièces jointes
        attachments.append(tmp_out[1])
    else:
        # Ajoute le fichier aux pièces jointes sans y toucher
        attachments.append(image)

    # La barre de progression de Zenity prend des valeurs de 0 à 100
    progress.stdin.write(str((100*index)/len(images))+"\n")
    index+=1

# Lance évolution
mailto="mailto:"+address+"?subject=Photos"
for attachment in attachments:
    mailto+="&attachment="+attachment

call(["evolution",mailto])

# Supprime les fichiers temporaires après un certain temps
sleep(5)
for attachment in attachments:
    unlink(attachment)

Actions

Information

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s




%d blogueurs aiment cette page :