The Personal Analytics of My Life: Mein Mailverkehr

Inspiriert von Stephen Wolframs Blogbeitrag The Personal Analytics of My Life habe ich auch mal versucht, meinen Mailverkehr entsprechend darzustellen. Dazu verwende ich ein Python-Script, welches meine Thunderbird-Mailordner durchforstet, und GNU R, um die Graphiken zu plotten.

R installiert ihr per:

sudo apt-get install r-recommended

Python-Script

Meine Mailkonten sind IMAP-Konten, und diese verwalte ich mit Thunderbird. Ich habe ein Python-Script geschrieben, welches mir für jede Mail das Datum und die Uhrzeit herausfischt. So sieht es aus:

#!/usr/bin/python 
#------------------------------------------------------------------------------------------
#----- Ich mache ne Faxe wie hier:
#----- http://blog.stephenwolfram.com/2012/03/the-personal-analytics-of-my-life/
#------------------------------------------------------------------------------------------
import sys
import time
import datetime
from mailbox import mbox as MBox
from email.utils import parsedate
#---------------------------------
mailboxname = sys.argv[1] # z.B.("~/.thunderbird/foobar.default/ImapMail/imap.foo.bar/INBOX")
myfilename  = sys.argv[2] # Anhaengsel fuer Dateinamen
mbox = MBox(mailboxname)
ZIEL = ("MyMail-%s.txt") % (myfilename)
SCHREIB = open(ZIEL,"w")
#-----------------------------------
for msg in mbox:
  try:  # bei mir sind manche Mails kaputt, darum vorher testen... 
    maildate = time.strftime('%Y%m%d', parsedate(msg.get("date")))
    mailtime = time.strftime('%H%M%S', parsedate(msg.get("date")))
    print maildate, ",", mailtime
  except:
    SCHREIB.write(str('NA,NA\n')) # wenn kaputt, erzeuge NAs (missing values) fuer GNU_R
  else:
    SCHREIB.write(str("%s,%s\n") % (maildate, mailtime))
SCHREIB.close()
## END OF FILE

(für alle, bei denen der Quellcode nicht optimal dargestellt wird, gibt es alle Zeilen und Befehle in diesem Gist)

Dieses Script speichere ich unter dem Namen mailscanner.py an einen beliebigen Ort, und mache es ausführbar.
Aufgerufen wird das Script in einem Terminal mit folgender Notation:

/Pfad/zu/mailscanner.py MAILBOX LABEL

Hierbei muss MAILBOX durch den Pfad zur Thunderbird-Datei der gewünschten Box (siehe weiter unten), und LABEL durch einen Dateinamenszustz ersetzt werden.
Aber dazu später mehr…

Thunderbird Maildatei

In einem Terminal wechsel ich in mein Thunderbird-IMAP-Verzeichnis:

cd ~/thunderbird/PROFILNAME.default/ImapMail/imap.produnis.de

Hier interessiert mich die Datei “INBOX” (ohne Suffix!).
Ich rufe nun mein Python-Script auf:

/Pfad/zu/mailscanner.py INBOX inbox

Dies erzeugt mir im selben Verzeichnis eine Textdatei mit dem Namen MyMail-inbox.txt.
In dieser Datei wurden Datum und Uhrzeit aller Mails, die sich in INBOX befinden, übertragen, zB:

20120425 , 1445

Über diese Texttabelle kommt das Statistikprogramm R an unsere Maildaten.

Diesen Vorgang könnt ihr nun für alle IMAP-Ordner (z.B. Gesendet, Arbeit, Privat, oder was ihr halt so für Ordner habt) wiederholen.

R

Ihr startet R über ein Terminal, indem ihr dort “R” eingebt:

R

Jetzt werden die Texttabellen wie folgt in R eingelesen:

inbox <- read.table("/Pfad/zu/MyMail-inbox.txt", sep=",", colClasses = "character") # Tabelle einlesen
colnames(inbox) <- c("Datum","Uhrzeit") # Tabellenspalten benennen
inbox$Datum <- strptime(inbox$Datum,format="%Y%m%d") # Daten in DATUM
inbox$Uhrzeit <- strptime(inbox$Uhrzeit, format="%H%M%S") # Daten in UHRZEIT
plot(inbox$Datum, inbox$Uhrzeit) # Daten grafisch anzeigen

Weitere Mailordner könnt ihr wie folgt in das bestehende Plotfenster integrieren:

test <- read.table("/Pfad/zu/MyMail-outbox.txt", sep=",", colClasses = "character") # neue Tabelle einlesen
colnames(test) <- c("Datum","Uhrzeit")
test$Datum <- strptime(test$Datum,format="%Y%m%d")
test$Uhrzeit <- strptime(test$Uhrzeit, format="%H%M%S")
points(test$Datum, test$Uhrzeit) # weitere Daten dem Plot hinzufügen

Bei mir sieht das dann zB so aus:

Deutlich zu erkenne ist die “heiße Phase” unseres Forschungsprojekts, und dass es nach dessen Abschluss wieder ruhiger zugeht…
;)

Weiter hab ich noch nicht rumgewurschtelt, aber an sich ist das ne lustige Spielerei für nebenher.
Weiterer R-Code und Krams ist herzlich willkommen.
Ach, und wer möchte, kann mit meinen Beispieldaten spielen. Hierfür genügt in R der Befehl:

produnis <- read.table("http://www.produnis.de/nagut/GESAMTLISTE.TXT", sep=",", colClasses = "character") # Tabelle aus dem Internet laden

Hier noch ein R-Befehl, der jeweils die Gesamtzahl der Mails aus diesem Datensatz pro Tag anzeigt:

produnis <- read.table("http://www.produnis.de/nagut/GESAMTLISTE.TXT", sep=",") # Tabelle aus dem Internet laden
colnames(produnis) <- c("Datum","Uhrzeit")
produnis <- produnis[-19180,] # Ausreißer entfernen
plot(strptime(levels(as.factor(produnis$Datum)),format="%Y%m%d"),as.vector(table(as.factor(produnis$Datum))),type="l")

Das sieht dann so aus:

…..

Diese und weitere Codeschnipsel stelle ich auf https://gist.github.com/3004221 zusammen. Das Auslesen meiner Kalendertermine habe ich hier beschrieben.

This entry was posted in Ubuntu, ubuntuusers. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback.

9 Comments

  1. Micha
    Posted 27. Juni 2012 at 22:02 | Permalink

    Hallo,

    vielen Dank für den interessanten Artikel. Ich habe allerdings eine Frage. Warum nutzt du zur graphischen Darstellung R und nicht zum Beispiel matplotlib? So könnte man alles in einem python Skript erledigen.

  2. Posted 28. Juni 2012 at 06:26 | Permalink

    Hehe, ich benutze R in allen Lebenslagen, und ehrlichgesagt fühle ich mich daher in R viiiiiieel mehr zu hause als in Python… ;)

  3. Posted 28. Juni 2012 at 06:47 | Permalink

    viel mehr würde mich interessieren, wie ich mit Python alle meine IMAP-Ordner (gesendet, privat, uni, büro) automatisch auslesen kann. derzeit muss ich das script anstubsen und sagen “Da liegt die Mailboxdatei”…

  4. Posted 28. Juni 2012 at 08:39 | Permalink

    Hallo
    mal ein Sehr Spannendes Thema
    bin gespannt was bei mir raus kommt
    Gruß

    Mkuh

  5. Micha
    Posted 28. Juni 2012 at 09:51 | Permalink

    Mit Hilfe des folgenden Codeschnipsels könnte man sich alle Verzeichnisse innerhalb des Thunderbird Profils rekursiv durchsuchen:

    Quelle: http://code.activestate.com/lists/python-list/329176/

    def treewalker(dir):
    join = os.path.join
    for f in os.listdir(dir): # Fuer jedes Element im aktuellen Verzeichnis
    pathname = join(dir, f) # Fuege Pfadnamen zusammen
    if os.path.isdir(pathname): # Pruefen, ob aktueller Pfadname ein Verzeichnis ist
    print(pathname) # Verzeichnis ausgeben
    treewalker(pathname) # Funktion rekursiv aufrufen

    Jetzt könnte man noch prüfen, welche Verzeichnisse Mails enthalten.

  6. Posted 28. Juni 2012 at 19:52 | Permalink

    danke Micha, aber ich benötige nicht die Verzeichnisnamen, sondern die Mailboxdateinamen. Diese liegen in den Unterordnern, und man erkennt sie daran, dass sie keine Dateiendung haben (also zB nicht die .mfs-Dateien). Benötigt wird ein Script, was alle Unterverzeichnisse durchwühlt, und dort diejenigen Dateinamen rausfischt, die keine Dateiendung haben…

  7. Micha
    Posted 28. Juni 2012 at 23:18 | Permalink

    Ich habe das Skript nun erweitert. Wie kann ich dir das Skript am besten zukommen lassen, denn ich möchte es ungern hier als Kommentar posten.

  8. Posted 29. Juni 2012 at 07:56 | Permalink

    Micha, du könntest dir einen kostenlosen Account bei GitHub erstellen, dann dein Script als “Gist” dort ablegen, und hier darauf verlinken… zB https://gist.github.com/3004221

  9. Micha
    Posted 1. Juli 2012 at 11:11 | Permalink

    Ok, das habe ich gemacht.

    Das Skript ist nun unter https://gist.github.com/3027795 zu finden.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Your email address will never be published.