Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/11/2016, à 17:30

mac-gyver31

Relever courrier google mail en mode commande

Bonjour,

Je voudrai savoir s'il existe un moyen de relever le courrier d'un compte google mail, en ligne de commande. Je voudrai faire celà à partir d'un script, en shell, ou en php, de manière automatique, à intervalle fixe (toutes les 10 mn par exemple. Ensuite rechercher, toujours par le script, dans les mails reçus ceux provenant d'une adresse précise, et récupérer le contenu (horodatage du mail, objet, et corps du message)

Quelqu'un peut-il m'aider ?


Il est temps d'enlever les fenêtres, et de construire un monde ouvert.

Hors ligne

#2 Le 08/11/2016, à 18:29

αjet

Re : Relever courrier google mail en mode commande

En shell script ou php, je ne sais pas trop mais tu as le support d'IMAP dans la bibliothèque standard de python :
https://docs.python.org/3.5/library/imaplib.html

Si tu lis un peu l'anglais voici un exemple de programme interagissant avec un compte gmail. Note que c'est transposable a n'importe quelle boite email IMAP. http://www.voidynullness.net/blog/2013/ … -via-imap/

Je n'ai jamais essaye de me connecter a une boite email programmatiquement, mais je pense que le point délicat est l'authentification. Fais attention si tu rentres en clair les identifiants de connexion dans ton script...


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#3 Le 09/11/2016, à 10:23

credenhill

Re : Relever courrier google mail en mode commande

Hors ligne

#4 Le 11/11/2016, à 13:40

mac-gyver31

Re : Relever courrier google mail en mode commande

Merci pour vos réponses. J'ai commencé par essayer d'explorer la piste fetchmail + procmail.

Avec fetchmail, j'arrive à récupérer le nouveau courrier de mon compte google mail. Je le retrouve dans un fichier unique dans /var/mail portant mon nom de user.

Je lance fetchmail par la commande : fetchmail -a -m "/usr/bin/procmail -d %T"

Il tourne en tâche de fond, et consulte mon compte google toutes les 6 mn.

Par contre, procmail est censé me trier le courrier, et le dispatcher dans /home/usr/Maildir. Je n'arrive pas à le faire fonctionner..
Mon fichier .procmailrc :

MAILDIR=/home/user/Maildir
## Faites en sorte que ça existe.
LOGFILE=/home/user/.procmaillog
LOGABSTRACT=no
#VERBOSE=on (Est utilisé uniquement pour le débogage.)
VERBOSE=off
FORMAIL=/usr/bin/formail
NL="
## Les lignes de « recipe » commencent par « :0 ».
## Ne mettez pas de commentaires dans les lignes de « recipe ».
## Désactivez un « recipe » grace au NON logique (!).
## Les conditions commencent par *, utilisez des expressions rationnelles.
## Les conditions sont associées avec un ET logique.
## Tout ce qui suit * est passé directement à egrep.
## Une ligne d'action suit les conditions, ici c'est un nom de BAL.

# Utilise formail pour les courriels dupliqués.
:0 Whc: .msgid.lock
| $FORMAIL -D 16384 .msgid.cache

#utilisation de spamassassin
:0 a
$MAILDIR/cur/spam
:0fw
| spamassassin -P
:0:
* ^X-Spam-Status: Yes
$MAILDIR/tmp/spam

#tri des courriels locaux
:0
* ^From.*adresse1@domaine1
$MAILDIR/Alina
:0
* ^From.*adresse2@domaine2
$MAILDIR/Nataly
:0
* ^From.*adresse3@domaine3
$MAILDIR/new/nouveau  
#######################################
# Dernière règle : tout ce qui arrive #
# ici va dans la boîte par défaut.    #
#######################################

:0
* .*
$MAILDIR/Inbox/entrant

Rien de vraiment utile dans .procmaillog...

Quelqu'un peut-il m'aider ?


Il est temps d'enlever les fenêtres, et de construire un monde ouvert.

Hors ligne

#5 Le 15/11/2016, à 17:51

mac-gyver31

Re : Relever courrier google mail en mode commande

Je sèche... Du coup, j'ai essayé d'utiliser Python. Là, je vais un peu plus loin.

J'arrive à me connecter, à parcourir la liste des mails dans le dossier INBOX, à décoder les champs from, to et subject. Mais je n'arrive pas à isoler proprement le corps du message.
@ αjet : merci. L'exemple que tu cites, et plus particulièrement https://gist.github.com/robulouski/7441883, m'ont servi de base. Mais il est en Python 2, et j'utilise Python 3. J'ai un problème avec la récupération du corps du message. Je n'arrive pas à trouver la méthode qui va bien.

Précision : je me fout royalement du contenu du message. J'ai juste besoin de le récupérer, pour l'injecter tel quel dans le corps d'un autre message que je veux envoyer. Je précise, car j'ai compris qu'en fonction de la nature du contenu, texte ou html, le code à implémenter n'est pas le même. N'y a-t-il pas un moyen de récupérer le corps quel que soit la nature de son contenu dans une variable de type string ?

Un petit coup de pouce ?

Dernière modification par mac-gyver31 (Le 15/11/2016, à 18:00)


Il est temps d'enlever les fenêtres, et de construire un monde ouvert.

Hors ligne

#6 Le 16/11/2016, à 14:47

αjet

Re : Relever courrier google mail en mode commande

A tout hasard, est-ce que la methode email.message.as_string() repondrait a ce besoin ?
https://docs.python.org/3.5/library/ema … il.message


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#7 Le 17/11/2016, à 14:19

LeoMajor

Re : Relever courrier google mail en mode commande

bonjour,

la récupération du corps du message. Je n'arrive pas à trouver la méthode qui va bien.

-> RFC imap
le format de sortie de FETCH se trouve à la fin de la commande.
...FETCH ... mettre seulement BODY[1] ou BODY\[1\] selon syntaxe, plutôt que RFC822
BODY[1] récupère mime a/ text  b/html   c/alternative a+b, selon la forge du MUA. 

ex Tcl Expect

 if {$fetch_verbose==0} {send "FL01 uid FETCH $item (BODY\[HEADER.FIELDS (From)\])\n"}
 if {$fetch_verbose==2} {send "FL01 uid FETCH $item (BODY\[HEADER.FIELDS (Date Subject Return-Path From)\])\n"}
 if {$fetch_verbose==4} {send "FL01 uid FETCH $item (FLAGS ENVELOPE)\n"}
 if {$fetch_verbose==8} {send "FL01 uid FETCH $item (BODY\[HEADER.FIELDS (From Return-Path)\])\n"}
 if {$fetch_verbose==10} {send "FL01 uid FETCH $item (FLAGS ENVELOPE BODY\[1\])\n"}
 if {$fetch_verbose==12} {send "FL01 uid FETCH $item (RFC822)\n"}
 if {$fetch_verbose==14} {send "FL01 uid FETCH $item (BODY\[2\])\n"}
A001 uid FETCH $item (BODY\[1\])

si tu utilises les uid
$item est un élément type uid de la liste obtenue par  SEARCH.

Hors ligne