Frequência de envio de emails

Post created Mon 12 Jul 2010 on July 12, 2010.

Preciso de horários mais humanos à frente do computador...

Gráfico que exibe a change deu enviar um email por hora

... o gráfico foi gerado agregando todos os emails que enviei nos últimos seis anos1 por hora e dividindo pelo total. Achei interessante que um bloco bem grande de horas tenha valores parecidos.

E o script para gerá-lo começa por pegar o campo Date de todos os emails, depois o divide em colunas separadas por ":" para se livrar do "Date:" inicial, remove as entradas inválidas, como emails em HTML2, emails com data não padrão (usando "/" para separação), emails com especificação de hora estranha (a remoção do "at")3. Depois disso, as datas são passadas para o comando date do unix, convertidas para UTC, pois queria todas as horas em UTC-3, e as horas são repassadas ao script de plotagem:

    SENT_MAIL=/caminho/para/emails/enviados
 
grep -r ^Date: ${SENT_MAIL} | \
cut --complement -d : -f 1-3 | \
grep -v <br> | grep -v \/ | grep -v 'at' | \
date -f /dev/stdin -u +%H | \
./plot.py

O script de plotagem recebe as horas, as soma e, por fim, as exibe:

    import numpy as np
from pylab import *
from math import sqrt
 
bins = {}
 
for line in sys.stdin:
hour = int(line.strip()) - 3
if hour < 0:
hour += 24
bins[hour] = bins.get(hour, 0) + 1
 
SAMPLES = len(bins)
width = 0.35 * 0.5
total = float(sum(bins.values()))
stuff = [i/total for i in bins.values()]
 
ind = np.arange(SAMPLES + 1)
ind = 0.5 * (ind[1:]+ind[:-1])
 
fdata = figure()
 
p = bar(ind, stuff)
xticks(ind + width/2 + 0.3, [i + 1 for i in range(SAMPLES + 1)])
 
title('Chance de eu enviar um email por hora')
xlabel('Hora do dia')
ylabel('"Probabilidade"')
 
defsize = fdata.get_size_inches()
golden = (sqrt(5) - 1)/2
fdata.set_size_inches(defsize[0], defsize[1] * golden)
 
grid()
 
fdata.savefig('mails.png')

Sentia falta de escrever esses scripts inúteis. Esses webmails da vida bem que poderiam exibir uns dados assim. Garanto que eles têm esse tipo de informação.

Bônus

Fiz um script em Python capaz de coletar as datas dos emails enviados do Gmail via IMAP. Obviamente, o acesso IMAP deve ser habilitado para que o script funcione. O script deve funcionar em qualquer Python da série 2.x na versão 2.4 ou superior.

    import getpass, imaplib
 
ssl = True
host = 'imap.gmail.com'
mbox = '[Gmail]/Sent Mail'
port = 993 if ssl else None
imapmethod = imaplib.IMAP4_SSL if ssl else imaplib.IMAP4
 
def main():
user = raw_input('Username: ')
conn = imapmethod(host, port)
conn.login(user, getpass.getpass())
conn.select(mailbox = mbox)
typ, data = conn.search(None, 'ALL')
for mnum in data[0].split():
_, tmp = conn.fetch(mnum, '(BODY[HEADER.FIELDS (DATE)])')
date = tmp[0][1].strip()
print date
conn.close()
conn.logout()
 
if __name__ == '__main__':
main()

Footnotes

  1. 6 * 365 dias, para ser exato. ↩
  2. Culpa da interface do gmail. :/ ↩
  3. Cerca de 120 mensagens foram descartadas nessa filtragem. Não é muito. ↩

Comments

blog comments powered by Disqus