# [script] Vérifier un dossier IMAP (résolu)

## masterinferno

Hello, 

Suite à ce sujet je réitère ma demande.

Je cherche un programme qui vérifierait (en tâche de fond, et donc fonctionnant avec un cron) un dossier IMAP distant.

Puis, à l'aide de ce programme, il faudrait créer un script qui exécuterait ces tâches:

```
- Vérification de la boîte imap.machin.truc (avec login et mot de passe) toutes les heures

- Si nouveau mail(s) alors -> echo 1 > /proc/driver/acerhk/led

- Une fois que la boîte mail ne contient plus de nouveaux messages, alors -> echo 0 > /proc/driver/acerhk/led
```

Sauf, que je n'y connais que dalle en programmation et j'aimerais savoir comment traduire ça en script...

Donc si quelqu'un a des pistes...

En vous remerciant !

----------

## kwenspc

 *masterinferno wrote:*   

> 
> 
> Sauf, que je n'y connait que dalle en programmation et j'aimerais savoir comment traduire ça en script...
> 
> 

 

C'est peut-être le bon moment de t'y mettre  :Wink: 

Ça ne semble pas bien compliqué, je pense que des librairies permettant de manipuler le protocole IMAP très facilement existent pour la plupart des langages. Ça doit pouvoir tenir sur très peu de ligne en fait.

----------

## masterinferno

 :Shocked:  La programmation ???   :Laughing: 

(pas le temps en fait   :Sad: )

J'ai cherché un peu dans l'arbre Portage des paquets ayant un rapport avec IMAP mais ya rien qui me parle vraiment...  :Confused: 

Effectivement, c'est un script qui est vraiment simple. Mais voilà quoi (<- flemme)

----------

## Temet

C'est moi qui l'ai fait : http://goondy.free.fr/gentoo/mailkount

Le protocol IMAP (comme POP) est ultra con ... avec perl ou python tu fais ça en 20 lignes  :Wink: 

(j'avais fut un temps un script perl qui le faisait pour POP, ca se trouve facilement)

----------

## masterinferno

Oui, mais le programme que tu as fait est un kicker pour KDE. Je n'ai pas ça en stock... :Sad: 

Ceci dit, si tu as une idée d'un paquet dans Portage qu'il faut que j'explore...   :Rolling Eyes: 

----------

## xaviermiller

tiens, est-ce que Fetchmail ne fait déjà pas ça ? (pas vérifié)

----------

## Temet

Tu sors le tank pour tuer le moustique là!

----------

## Bapt

Plusieurs solution : 

1/ imapfilter, le fichier de config est un script en lua, donc tu peux facilement te connecter a un ou plusieurs compte et effectuer une action si ton imap à des nouveaux mails dans la INBOX (un coup de cron pour le mettre toutes les heures)

2/ sinon un coup de script c'est environ deux secondes et sa roule, en perl par exemple : 

```
#!/usr/bin/perl

use strict;

use Mail::IMAPClient;

my $imap = Mail::IMAPClient->new(

        Server => "host",

        User => "user",

        Password => "password"

) or die "Impossible de se connecter au serveur imap : $@";

my $unseen = $imap->unseen_count("INBOX");

if ($unseen == 0){

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "0\n";

        close(TOTO);

}else{

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "1\n";

        close(TOTO);

}

```

Pour l'exemple il te faudra dev-perl/Mail-IMAPClient

En python ou en ruby ça ne doit pas être beaucoup plus difficile.

----------

## masterinferno

Mille fois merci !  :Smile:  Je vais essayer ça tout de suite !

Je vais aussi essayer de comprendre le comment du pourquoi de ce script   :Wink: 

----------

## Bapt

 *masterinferno wrote:*   

> Je vais aussi essayer de comprendre le comment du pourquoi de ce script  

 

Le même avec des commentaires :

```

#!/usr/bin/perl

#Je veux faire du perl propre donc je veux qu'il soit stricte

use strict;

#Je veux utiliser la bibliothèque Mail::IMAPClient (=> je lui dit)

use Mail::IMAPClient;

#Je crée un objet imap qui correspondra à ma connexion imap (qui se connectera)

my $imap = Mail::IMAPClient->new(

        Server => "host",

        User => "user",

        Password => "password"

) or die "Impossible de se connecter au serveur imap : $@";

#au dessus : si la connexion foire je te le dit et je rajoute les gros mots qui viennent de ton serveur

#au dessous : je regarde dans le dossier INBOX et compte les mails non lus

my $unseen = $imap->unseen_count("INBOX");

#Je pense que la suite tu pourra le deviner tout seul (TOTO est un descripteur de fichier et > vers le nom de fichier permet d'écraser le fichier à chaque fois).

if ($unseen == 0){

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "0\n";

        close(TOTO);

}else{

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "1\n";

        close(TOTO);

} 

```

----------

## kwenspc

En python on aurait un truc comme ça:

```

#!/usr/bin/python

# Les variables à configurer

host="<serveur>"

user="<login>"

password="<password>"

import imaplib, os

# On creer la connexion IMAP et on se log

mail_box = imaplib.IMAP4(host)

mail_box.login(user, password)

# On séléctionne le repertoire de réception

mail_box.select("INBOX")

# On cherche les mails non lus

typ, msgnums = mail_box.search(None, 'UNSEEN')

#On agit en conséquence

if msgnums != ['']:

    os.system("echo 1 > /proc/driver/acerhk/led")

else:

    os.system("echo 0 > /proc/driver/acerhk/led")

# On ferme tout ça

mail_box.close()

mail_box.logout()

```

Mais en cherchant un peu sur le ouèb on remarque que d'autres ont déjà travaillés sur ton problème:

http://www.yeiazel.net/post/2006/05/26/Linux-sur-un-Acer-Aspire-3620

(partie "vérification des mails")

----------

## masterinferno

Nom de Zeus...   :Shocked: 

Alors ça... donc là je suis servi niveau réponses, je vais étudier ça en adaptant le script qui se trouve sur le site !

Merci encore   :Cool: 

----------

## Bapt

oups j'ai oublié le $imap->close;  :Smile: 

A rajouter à la fin bien sûr.

----------

## masterinferno

Maintenant, pour procéder un peu différemment. 

Si je reprends le script Perl

```
#!/usr/bin/perl

use strict;

use Mail::IMAPClient;

my $imap = Mail::IMAPClient->new(

        Server => "host",

        User => "user",

        Password => "password"

) or die "Impossible de se connecter au serveur imap : $@";

my $unseen = $imap->unseen_count("INBOX");

if ($unseen == 0){

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "0\n";

        close(TOTO);

}else{

        open(TOTO,"> /proc/driver/acerhk/led");

        print TOTO "1\n";

        close(TOTO);

} 
```

Dans l'avant-dernière partie du script, il est dit que "si le nombre de mails est égal à 0 alors on envoie 0 à /proc/driver/acerhk/led"

En rajoutant une condition:

 *Quote:*   

> si le nombre de mails est égal à 0
> 
> ET/OU dès que la touche avec le keycode 236 est appuyée
> 
> alors echo 0 > /proc/driver/acerhk/led

 

Comment ça pourrait se traduire ?  :Embarassed: 

edit: ah merde... je sais pas si c'est faisable en fait... vu qu'en plus le script est crontabé   :Confused: 

----------

## Bapt

En crontab c'est pas faisable...

sinon tu fais un daemon. Mais là il faut que tu gère si tu es en console ou en X, etc.

----------

## masterinferno

Je tourne sous X 99,9% du temps...

Mais je sens que ça va compliquer tout le truc...  :Sad: 

Un démon qui se placerait dans /etc/init.d/ donc ?

----------

## Bapt

Si tu es sous X tu fait un autre script tout con en shell :

```

#!/bin/sh

echo 0 > /proc/.....

```

tu le déclenches quand tu appuie sur ta touche : via ton environnement de bureau ou alors via xmodmap, xbindkeys, ... tu as plein de choix. On va pas tout te faire non plus la binding de touche clavier en X tu dois pouvoir facilement trouver sur le net.

EDIT: oublie le coup du daemon c'est une connerie.

----------

## masterinferno

Ahhhh !!!

Idée !!!

En fait cette touche est déjà affectée sous Fluxbox (grâce à Xmodmap)

Elle lance:

firefox "http://imp.free.fr/rc"

Je vais refaire un script qui:

1-Eteint cette LED

2-Lance le courrier

ça peut donner ça:

```
#!/bin/sh

echo 0 > /proc/driver/acerhk/led

firefox "http://imp.free.fr/rc"
```

Je mets un && entre les deux commandes ?

EDIT: je pense à un truc... pour faire un echo sur /proc* il faut être root...

Avec l'autre script, j'ai pu outre-passer cet obstacle dans le crontab

----------

## Bapt

Et jamais tu te renseignes, lit de doc, etc ?

Il y a plein de mécanisme pour prendre les droits root en tant que user et sans mot de passe.

----------

## masterinferno

Ben si que je me renseigne... depuis le temps (pfiouu !)

RTFM, Google et compagnie y passent !

Mais cette semaine je suis flemmard...  :Very Happy:   :Embarassed: 

(allez je vais faire un chmod -R 777 /proc ça va être plus simple...   :Laughing: )

edit: c'est pour déconner hein  :Wink:  je vais me tenter sudo, mais ça fait trop hou boune tou

----------

