summaryrefslogtreecommitdiff
path: root/emailcanary/canary.py
blob: 49972db975c125a807a4ad9dabdc478517713f16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import uuid, datetime, time
import email, emailutils
import re

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()

		self.send(listAddress, now, chirpUUID)
		for dest in self.db.get_recipients_for_list(listAddress):
			self.db.ping(dest, now, chirpUUID)

	def check(self, listAddress):
		for (listAddress, address, imapserver, password) in self.db.get_accounts(listAddress):
			mail = emailutils.get_imap(imapserver, address, password)
			these_subjects = []
			for uid in emailutils.get_mail_uids(mail):
				message = emailutils.get_message(mail, uid)
				if self.processMessage(address, message):
					emailutils.delete_message(mail, uid)
			emailutils.close(mail)

	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())