From eb2463efc093103a6ded46212f4b27ba1b0e8ae2 Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Sat, 30 Apr 2022 21:13:24 -0700 Subject: Fix email parsing after python3 upgrade --- emailcanary/canary.py | 98 +++++++++++++++++++++++------------------------ emailcanary/emailutils.py | 5 ++- 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/emailcanary/canary.py b/emailcanary/canary.py index cfac01b..93e9d42 100644 --- a/emailcanary/canary.py +++ b/emailcanary/canary.py @@ -4,52 +4,52 @@ import re from . import emailutils class Canary: - def __init__(self, db, smtp, fromaddress): - self.db = db - self.smtp = smtp - self.fromaddress = fromaddress - - def chirp(self, listAddress): - chirpUUID = str(uuid.uuid4()) - now = datetime.datetime.now() - - receipients = self.db.get_recipients_for_list(listAddress) - if len(receipients) == 0: - raise Exception("No receipients for listAddress '%s'", (listAddress,)) - - self.send(listAddress, now, chirpUUID) - for dest in receipients: - self.db.ping(listAddress, dest, now, chirpUUID) - - def check(self, listAddress): - '''Check for messages from listAddress and return a list of missing chirps''' - accounts = self.db.get_accounts(listAddress) - if len(accounts) == 0: - raise Exception("No receipients for listAddress '%s'", (listAddress,)) - for (listAddress, address, imapserver, password) in accounts: - mail = emailutils.get_imap(imapserver, address, password) - these_subjects = [] - for uid in emailutils.get_mail_uids(mail): - message = emailutils.get_message(mail, uid) - 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 (.+)', str(msg['Subject'])) - if match: - chirpUUID = match.group(1) - now = datetime.datetime.now() - self.db.pong(receipient, now, chirpUUID) - return True - return False - - def send(self, dest, date, chirpUUID): - msg = email.message.Message() - msg['From'] = self.fromaddress - msg['To'] = dest - msg['Subject'] = "Canary Email " + chirpUUID - msg['Date'] = email.utils.formatdate(time.mktime(date.timetuple())) - - self.smtp.sendmail(self.fromaddress, dest, msg.as_string()) + def __init__(self, db, smtp, fromaddress): + self.db = db + self.smtp = smtp + self.fromaddress = fromaddress + + def chirp(self, listAddress): + chirpUUID = str(uuid.uuid4()) + now = datetime.datetime.now() + + receipients = self.db.get_recipients_for_list(listAddress) + if len(receipients) == 0: + raise Exception("No receipients for listAddress '%s'", (listAddress,)) + + self.send(listAddress, now, chirpUUID) + for dest in receipients: + self.db.ping(listAddress, dest, now, chirpUUID) + + def check(self, listAddress): + '''Check for messages from listAddress and return a list of missing chirps''' + accounts = self.db.get_accounts(listAddress) + if len(accounts) == 0: + raise Exception("No receipients for listAddress '%s'", (listAddress,)) + for (listAddress, address, imapserver, password) in accounts: + mail = emailutils.get_imap(imapserver, address, password) + these_subjects = [] + for uid in emailutils.get_mail_uids(mail): + message = emailutils.get_message(mail, uid) + 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']) + if match: + chirpUUID = match.group(1) + now = datetime.datetime.now() + self.db.pong(receipient, now, chirpUUID) + return True + return False + + def send(self, dest, date, chirpUUID): + msg = email.message.Message() + msg['From'] = self.fromaddress + msg['To'] = dest + msg['Subject'] = "Canary Email " + chirpUUID + msg['Date'] = email.utils.formatdate(time.mktime(date.timetuple())) + + self.smtp.sendmail(self.fromaddress, dest, msg.as_string()) diff --git a/emailcanary/emailutils.py b/emailcanary/emailutils.py index 54323a1..2358a3a 100644 --- a/emailcanary/emailutils.py +++ b/emailcanary/emailutils.py @@ -1,6 +1,7 @@ import sys import imaplib, email + def get_imap(server, username, password): '''Connect and login via IMAP''' try: @@ -29,8 +30,8 @@ def get_message(mail, uid): if dat0 is None: return None else: - raw_email = str(dat0[1]) - return email.message_from_string(raw_email) + raw_email = dat0[1] + return email.message_from_bytes(raw_email) else: raise Exception("Bad response from server: %s" % (result)) -- cgit v1.2.3