Mac OS X : Script pour parser tous les emails de Mail ( format emlx )

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 "

Une réflexion sur « Mac OS X : Script pour parser tous les emails de Mail ( format emlx ) »

  1. 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.

Répondre à Frederic Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.