#!/usr/bin/python # # email_destinations.py # # Emails sent to specified domains as a function of time. # # Copyright (C) 2015 George C. Privon # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import mailbox import datetime import matplotlib.pyplot as plt import matplotlib.dates as mdates import argparse import re import numpy as np import cubehelix parser = argparse.ArgumentParser() parser.add_argument('mbox', help='Mailbox to analyze.') parser.add_argument('--plotfile', '-p', default=False, action='store', help='Name of output plotting file.') parser.add_argument('--title', '-t', default='Email Destinations', action='store', help='Plot title.') args = parser.parse_args() plt.figure() plt.ylabel('Emails sent to Domain') plt.xlabel('Year-Month') plt.minorticks_on() plt.title(args.title) a = mailbox.mbox(args.mbox) scolor = cubehelix.cmap(startHue=240, endHue=-300, minSat=1, maxSat=2.5, minLight=.3, maxLight=.8, gamma=.9) domains = ['gmail', 'hotmail', 'aol'] senders = {} for msg in a: cid = None label = None if msg['date'] is not None: try: z = datetime.datetime.strptime(msg['date'], '%a, %d %b %Y %H:%M:%S %z') except ValueError: try: z = datetime.datetime.strptime(msg['date'], '%a, %d %b %Y %H:%M:%S %Z') except ValueError: print("Skipping message from " + msg['date']) continue dateID = "{0:1d}-{1:2d}".format(z.year, z.month) if not(dateID in senders.keys()): senders[dateID] = np.zeros(len(domains) + 1) dmatch = False for i, domain in enumerate(domains): if not(msg['To'] is None) and re.search(domain, msg['To']): senders[dateID][i+1] += 1 dmatch = True if not(dmatch): senders[dateID][0] += 1 months = list(senders.keys()) months.sort() for j in range(len(domains) + 1): domainlist = [] if j == 0: label = 'Other' else: label = domains[j - 1] for month in months: domainlist.append(senders[month][j]) plt.plot(np.arange(len(months)), domainlist, label=label) plt.legend(frameon=False, loc='best') plt.xticks(np.arange(len(months)), months, rotation=90) plt.setp(plt.axes().get_xticklabels(), visible=False) plt.setp(plt.axes().get_xticklabels()[::6], visible=True) if args.plotfile: plt.savefig(args.plotfile, bbox_inches='tight') else: plt.savefig('email_destinations.png', bbox_inches='tight')