#!/usr/bin/env python3
###################################################################
# To the extent possible under law, the person who associated CC0 #
# with phlog_bot.py has waived all copyright and related or #
# neighboring rights to phlog_bot.py. #
# #
#
https://creativecommons.org/publicdomain/zero/1.0/ #
###################################################################
# NO WARRANTY!!!!
# PLEASE DON'T RUN THIS SCRIPT UNLESS YOU HAVE BACKUPS OF YOUR
# MAILFILE OR ANYTHING ELSE THIS SCRIPT TOUCHES PLEASE.
import mailbox
import json
import time
import datetime
import os
gopher_dir = "/sdf/arpa/gm/l/lro/test"
userdictionaryfile = "users.json"
mailboxf = "/mail/lro"
today = datetime.date.today()
today_fmt = today.strftime("%Y")+"-"+today.strftime("%m")+"-"+today.strftime("%d")
def get_unread_emails(mailboxfile):
unread = []
if not os.path.isfile(mailboxfile):
print("Mailboxfile doesn't exist: %s" % (mailboxfile))
return unread
mailboxfp = mailbox.mbox(mailboxfile)
ind = 0
for message in mailboxfp:
flags = message.get_flags()
if flags.find('R') == -1:
unread.append(message)
message.add_flag('R')
mailboxfp[ind] = message
ind = ind + 1
mailboxfp.lock()
mailboxfp.flush()
mailboxfp.unlock()
mailboxfp.close()
return unread
def load_dictionary(dictfile):
if not os.path.isfile(dictfile):
return []
usersfile = open(dictfile)
userdictionary = json.load(usersfile)
usersfile.close()
return userdictionary
def get_from_lower(message):
From = message.get_from()
return From.split(" ")[0].lower()
def user_in_dict(email, dictionary):
try:
return dictionary[email]
except KeyError:
return False
def phlog_post_contents(email):
return email.get_payload()
def write_phlog_post(filename, contents):
ind = 0
justfilenamenotpath = filename.split("/")[-1]
while os.path.isfile(filename):
if ind == 99:
break
filename = filename.split(".")[0].split("_")[0]+"_"+str(ind)+".txt"
justfilenamenotpath = filename.split("/")[-1]
with open(filename, "w") as phlogfile:
phlogfile.write(contents)
return justfilenamenotpath
def update_gophermap(gophermap, filename, description):
entry = "0%s %s" % (description, filename)
with open(gophermap, "r") as gfp:
buf = gfp.readlines()
with open(gophermap, "w") as gfp:
for line in buf:
if "==================================================" in line:
line = line+"\n"+entry+"\n"
gfp.write(line)
def new_phlog_entry(message):
email = get_from_lower(message)
username = user_in_dict(email, userdictionary)
if not username:
print("User: %s not in user dictionary" % (email))
return
phlog_title = message['subject']
phlog_filename = today_fmt + ".txt"
phlog_contents = phlog_post_contents(message)
phlog_dir = gopher_dir+"/"+username
phlog_gophermap = phlog_dir+"/gophermap"
phlog_filename = write_phlog_post(phlog_dir+"/"+phlog_filename, phlog_contents)
update_gophermap(phlog_gophermap, phlog_filename, phlog_title+" <"+today_fmt+">")
update_gophermap(gopher_dir+"/gophermap", username+"/"+phlog_filename, username+" - "+phlog_title+" <"+today_fmt+">")
print("Added phlog post for %s" % (username))
userdictionary = load_dictionary(userdictionaryfile)
for message in get_unread_emails(mailboxf):
new_phlog_entry(message)