summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2022-04-30 10:34:53 -0700
committerJesse Morgan <jesse@jesterpm.net>2022-04-30 10:34:53 -0700
commit04905ba6d973a57c9d37bb75ee376c896a47ac5d (patch)
treecb56c09e7c055c9656c6ea3d25f5ea8eb147072a
parente88bebbf326baabb26dff0b5a69cae3b91e925bd (diff)
Migrate to python3
-rwxr-xr-xbin/emailcanary19
-rw-r--r--emailcanary/canary.py7
-rw-r--r--emailcanary/email-digest-sender.py4
-rw-r--r--emailcanary/emailutils.py52
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()