URL: https://linuxfr.org/users/mildred/journaux/architecture-pour-un-mua-mail-user-agent Title: Architecture pour un MUA: Mail User Agent Authors: Mildred Date: 2010年09月02日T18:22:08+02:00 Tags: Score: 10 Bonjour, J'ai eu l'occasion de travailler sur Tracker ces derniers temps, le nouveau moteur de recherche de bureau soutenu par GNOME et utilisant les ontologies Nopomuk et le langage de requêtes SPARQL standardisé par le W3C. Et j'ai comme idée d'utiliser cette fabuleuse plate-forme pour gérer mes e-mails à la place de Thunderbird. Pourquoi quitter Thunderbird ? Pour les millions de mails que j'ai en stock, il commence sérieusement à être lent. Et la gestion et le classement commence à être très difficile. Effet direct: je ne regarde plus mes e-mails. **Comment fonctionne tracker ?** Tout d'abord, il y a tracker-store qui gère les accès à la base de donnée. On peut l'appeler via DBus avec des requêtes SPARQL ou pour faire plus rapidement, les bibliothèques tracker permettent d'accéder directement aux fichiers en lecture. Ensuite, il y a tracker-miner-fs qui une fois lancé va utiliser inotify pour scruter les dossiers dont il à la charge, et indexer les nouveaux fichiers. Si un fichier change, il va appeler tracker-extract pour lire les métadonnées et les insérer dans la base de données toujours avec des requêtes SPARQL. tracker-store utilise des plugins pour lire les différents types de fichiers, et tout le monde peut écrire un plugin. Dans le cadre de mon travail, j'ai écrit un début de plugin pour le format mbox et les mails au format RFC 2822. Une autre approche, utilisée par evolution, est que l'application qui gère les données va elle même se charger de mettre à jour la base de donnée tracker avec des requêtes SPARQL. L'inconvénient, si cela n'est pas couplé à l'indexation des fichiers, est que si l'application arrête de gérer certaines données (on enregistre un mail dans ~/Documents), alors on perd les informations sémantiques. **Un MUA basé sur Tracker** J'ai pour idée de séparer mon MUA en trois parties: **- un MDA** qui va recevoir les emails des comptes POP ou IMAP et les stocker en local dans des fichiers indexés par Tracker. **- un MUA** qui va demander à Tracker la liste des emails indexés sur la machine et les présenter en fonction de plusieurs critères. **- un MTA** qui va envoyer les emails par SMTP Et rien n'interdirait de placer les fichiers emails dans ~/Documents/Banque/E-Mails ou encore ~/Documents/Factures/Electricité et pourtant pouvoir les retrouver dans le MUA. **SPARQL** Je vous ai parlé de SPARQL, il s'agit d'un langage simple pour faire des requêtes dans la base de données. D'abord, comment cette base de donnée est elle structurée? La base de donnée est composée d'objets. Chaque objet à une URI qui va l'identifier et va avoir des relations avec d'autres objets ou des types de base (string, entier, date, ...). Ces relations ne sont pas au hasard mais normalisées par les ontologies Nepomuk. En pratique, un objet sera l'instance d'une classe ontologique qui peut elle même hériter d'autres classes ontologiques. Chaque classe est associée à un ensemble de propriétés qui peuvent aussi s'hériter. Dans SPARQL, les relations sont définies ainsi: [sujet] [propriété1] [objet1], [objet1] ; £spaces£ £/spaces£[propriété2] [objet3], [objet4] . Une propriété spéciale, **a** permet de donner la classe d'un objet en particulier, l'exemple suivant représente un e-mail: <file:///home/toto/Mails/1> a nmo:Email ; nmo:messageSubject "Salut!" . On peut ensuite introduire des inconnues en préfixant le nom de la variable inconnue par **?** et on peut construire des requêtes: SELECT ?x nmo:messageSubject(?x) WHERE { ?x a nmo:Email . } Ontologies nepomuk: [http://www.semanticdesktop.org/ontologies/nmo/](http://www.semanticdesktop.org/ontologies/nmo/) Tracker: [http://projects.gnome.org/tracker/](http://projects.gnome.org/tracker/) SPARQL Query: [http://www.w3.org/TR/rdf-sparql-query/](http://www.w3.org/TR/rdf-sparql-query/) QPARQL Update: [http://www.w3.org/TR/sparql11-update/](http://www.w3.org/TR/sparql11-update/)

AltStyle によって変換されたページ (->オリジナル) /