From 04905ba6d973a57c9d37bb75ee376c896a47ac5d Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Sat, 30 Apr 2022 10:34:53 -0700 Subject: Migrate to python3 --- bin/emailcanary | 19 +++++++++----- emailcanary/canary.py | 7 ++--- emailcanary/email-digest-sender.py | 4 +-- emailcanary/emailutils.py | 52 ++++++++++++++++++++++++++------------ 4 files changed, 54 insertions(+), 28 deletions(-) diff --git a/bin/emailcanary b/bin/emailcanary index 48b09c8..2ad1d44 100755 --- a/bin/emailcanary +++ b/bin/emailcanary @@ -1,8 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import argparse import sys import smtplib +import traceback from emailcanary import canarydb from emailcanary import canary @@ -39,10 +40,10 @@ def list(db): if len(accounts) == 0: print('No accounts configured.') return SUCCESS - print "%-25s %-25s %-25s" % ('List Address', 'Recepient', 'IMAP Server') - print "-" * 80 + print("%-25s %-25s %-25s" % ('List Address', 'Recepient', 'IMAP Server')) + print("-" * 80) for account in accounts: - print "%-25s %-25s %-25s" % (account[0], account[1], account[2]) + print("%-25s %-25s %-25s" % (account[0], account[1], account[2])) return SUCCESS def add(db, listAddress, recepient, imapserver, password): @@ -58,11 +59,14 @@ def remove(db, listAddress, recepients): def check(db, birdie, listAddress): missing = birdie.check(listAddress) + missing = [x for x in missing if x[3].total_seconds() < 86400] + missing = [x for x in missing if x[3].total_seconds() > 3600] if len(missing) == 0: return SUCCESS - print "list recepient uuid time" + print("list recepient uuid time") for chirp in missing: - print "%s %s %s %d" % (chirp[0], chirp[1], chirp[2], chirp[3].total_seconds()) + # Only Print chirps which were missing for more than 15 minutes. + print("%s %s %s %d" % (chirp[0], chirp[1], chirp[2], chirp[3].total_seconds())) return FAILURE def main(): @@ -92,8 +96,9 @@ def main(): else: raise Exception('Unknown action') - except Exception, e: + except Exception as e: sys.stderr.write("Error: %s\n" % (str(e))) + traceback.print_exc() return FAILURE finally: if smtp: diff --git a/emailcanary/canary.py b/emailcanary/canary.py index aac6418..cfac01b 100644 --- a/emailcanary/canary.py +++ b/emailcanary/canary.py @@ -1,6 +1,7 @@ import uuid, datetime, time -import email.message, emailutils +import email.message import re +from . import emailutils class Canary: def __init__(self, db, smtp, fromaddress): @@ -30,13 +31,13 @@ class Canary: these_subjects = [] for uid in emailutils.get_mail_uids(mail): message = emailutils.get_message(mail, uid) - if self.processMessage(address, message): + if message is not None and self.processMessage(address, message): emailutils.delete_message(mail, uid) emailutils.close(mail) return self.db.get_missing_pongs(listAddress) def processMessage(self, receipient, msg): - match = re.match('.*Canary Email (.+)', msg['Subject']) + match = re.match('.*Canary Email (.+)', str(msg['Subject'])) if match: chirpUUID = match.group(1) now = datetime.datetime.now() diff --git a/emailcanary/email-digest-sender.py b/emailcanary/email-digest-sender.py index a7ff79f..fa4fcb0 100644 --- a/emailcanary/email-digest-sender.py +++ b/emailcanary/email-digest-sender.py @@ -1,6 +1,6 @@ -import emailutils import smtplib from email import message +from . import emailutils PASSWORD="secret" ACCOUNTS = [('mail.example.com', 'email@example.com', PASSWORD)] @@ -35,4 +35,4 @@ if youve_got_mail: s = smtplib.SMTP_SSL('localhost', 2465) s.sendmail(DESTINATION, DESTINATION, digest_message.as_string()) - s.quit() \ No newline at end of file + s.quit() diff --git a/emailcanary/emailutils.py b/emailcanary/emailutils.py index 83c2f46..54323a1 100644 --- a/emailcanary/emailutils.py +++ b/emailcanary/emailutils.py @@ -1,27 +1,47 @@ +import sys import imaplib, email def get_imap(server, username, password): - '''Connect and login via IMAP''' - mail = imaplib.IMAP4_SSL(server) - mail.login(username, password) - return mail + '''Connect and login via IMAP''' + try: + mail = imaplib.IMAP4_SSL(server) + mail.login(username, password) + return mail + except Exception as e: + sys.stderr.write("Error connecting to %s@%s: %s\n\n" % (username, server, str(e))) + return None def get_mail_uids(mail): - '''Return a list of message UIDs in the inbox''' - mail.select("inbox") # connect to inbox. - result, data = mail.uid('search', None, "ALL") # search and return uids instead - return data[0].split() + '''Return a list of message UIDs in the inbox''' + if mail is None: + return [] + mail.select("inbox") # connect to inbox. + result, data = mail.uid('search', None, "ALL") # search and return uids instead + return data[0].split() def get_message(mail, uid): - '''Get a single email message object by UID''' - result, data = mail.uid('fetch', uid, '(RFC822)') - raw_email = data[0][1] - return email.message_from_string(raw_email) + '''Get a single email message object by UID''' + if mail is None: + return None + result, data = mail.uid('fetch', uid, '(RFC822)') + if result == 'OK': + dat0 = data[0] + if dat0 is None: + return None + else: + raw_email = str(dat0[1]) + return email.message_from_string(raw_email) + else: + raise Exception("Bad response from server: %s" % (result)) def delete_message(mail, uid): - result = mail.uid('store', uid, '+FLAGS', '(\Deleted)') + if mail is None: + return + result = mail.uid('store', uid, '+FLAGS', '(\Deleted)') def close(mail): - mail.expunge() - mail.close() - mail.logout() + if mail is None: + return + mail.expunge() + mail.close() + mail.logout() -- cgit v1.2.3