J’ai fait un script ( rapidement, donc un bash et pas du Perl ou du Python) pour parser tous les emails dans Mail, il suffit de mettre ce script sous : /Users/MonLogin/Library/Mail/ .
Le scripts en version V1 :
#!/bin/bash # compteur=0 erreur=0 chercheFichier() { Rep="$1" for item in $Rep/* do [ -f "$item" ] ext="${item##*.}" #echo "$item $ext" #if file -i $item | grep -q text ; then if [ "$ext" = "emlx" ] ; then from=`head -40 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1` if [ ! -n "$from" ] ; then from=`head -40 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1` fi date=`head -50 $item | grep "^Date: " | sed 's/Date: //g' | sed 's/.*,//' | head -1` if [ ! -n "$date" ] ; then date=`head -50 $item | grep "^Date: " | head -1` fi if [ -n "$from" ] ; then if [ -n "$date" ] ; then compteur=`expr $compteur + 1` echo "$compteur | $from | $date" >> list.txt else erreur=`expr $erreur + 1` echo "Pas de date : $compteur / $erreur / $from / $item" fi else erreur=`expr $erreur + 1` from=`head -10 $item | grep "^From: " | head -1` echo "Pas d'email : $compteur / $erreur / $from / $item" fi fi #fi [ -d "$item" ] && chercheFichier "$item" done } [ -d "${1:-.}" ] && chercheFichier ${1:-.}
J’ai fait un test et sur 140.000 emails (en 14 ans) j’ai eu 500 erreurs, le problèmes des erreurs ce sont les emails en binaires. Il faut trouver la bonne limite dans le « head -40 » et « head -50 » afin de n’avoir que l’entête de l’email. Mais le champ « Date » se trouve après le champ « To », qui lors d’un spam est très très long .
A la fin de l’exécution on a une fichier list.txt avec numéro, from, date. Pour le reste il suffit de faire un peu d’Excel :
Les emails c’était 5 heures de travail par jour pour les cadres en 2015 : https://www.usine-digitale.fr/article/les-e-mails-c-est-5-heures-de-travail-par-jour-pour-les-cadres-de-2015.N346564 .
L’idée serait de pouvoir identifié les flux (une cartographie des flux) des emails envoyés et reçus … mais c’est pour la version V2. Et aussi de voir l’évolution des flux dans le temps.
Pour l’instant j’ai trouvé ceci pour les flux : https://rgeomatic.hypotheses.org/415 .
A suivre.
La version V1 bis (moins d’erreur : 200).
#!/bin/bash compteur=0 erreur=0 chercheFichier() { Rep="$1" for item in $Rep/* do [ -f "$item" ] ext="${item##*.}" #echo "$item $ext" #if file -i $item | grep -q text ; then if [ "$ext" = "emlx" ] ; then from=`head -10 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1` if [ ! -n "$from" ] ; then from=`head -40 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1` fi if [ ! -n "$from" ] ; then from=`head -80 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1` fi date=`head -30 $item | grep "^Date: " | sed 's/Date: //g' | sed 's/.*,//' | head -1` if [ ! -n "$date" ] ; then date=`head -70 $item | grep "^Date: " | sed 's/.*,//' | head -1` fi if [ -n "$from" ] ; then if [ -n "$date" ] ; then compteur=`expr $compteur + 1` echo "$compteur | $from | $date" >> list.txt else erreur=`expr $erreur + 1` echo "Pas de date : $compteur / $erreur / $from / $item" fi else erreur=`expr $erreur + 1` from=`head -15 $item | grep "^From: " | head -1` echo "Pas d'email : $compteur / $erreur / $from / $item" fi fi #fi [ -d "$item" ] && chercheFichier "$item" done } [ -d "${1:-.}" ] && chercheFichier ${1:-.} echo "Fin du script : $compteur / $erreur "
Sinon il est possible de faire ainsi :
$ time find ~/Library/Mail/ -name *.emlx > file_email.txt
$ time tr ‘\n’ ‘\0’ < file_email.txt | xargs -0 egrep '^Date:' > date-email.txt
$ time tr ‘\n’ ‘\0’ < file_email.txt | xargs -0 egrep '^From:' > from-email.txt
$ time tr ‘\n’ ‘\0’ < file_email.txt | xargs -0 egrep '^To:' > to-email.txt
Et ensuite de refaire un merge de date, from et To.