(ns mailhead.parser (:require [clojure.string :as st] [clj-time.core :as time] [clj-time.coerce :as timec] [clojure-mail.core :refer :all] [clojure-mail.message :refer :all])) (defn received-headers [all-headers] (map #(first (vals %)) (filter (fn [header] (= "Received" (first (keys header)))) all-headers))) (defn parse-received-headers [received-header] (let [datetime (st/trim (last (st/split received-header #";"))) ;; Hacky hacky, but no time to make this proper ... cleaned-date (st/trim (st/replace datetime #"(\(.*\)| )" " "))] {:sender (nth (re-find #"\s*from ([^ ]+)" received-header) 1) :receiver (nth (re-find #"\s*by ([^ ]+)" received-header) 1) :time (timec/from-string cleaned-date)})) (defn parse-from-file [filename] (->> filename file->message read-message :headers received-headers (map parse-received-headers)))