fix check_email_thread to do proper threading, take delay as arg

This commit is contained in:
craigerl 2020-12-03 14:48:27 -08:00
parent f175f7e6e3
commit e171e16854
1 changed files with 61 additions and 60 deletions

View File

@ -232,75 +232,74 @@ def resend_email(count, fromcall):
# end resend_email() # end resend_email()
def check_email_thread(): def check_email_thread(check_email_delay):
# print "Email thread disabled."
# return
LOG.debug("Starting Email thread") while True:
# how do we skip first run? # threading.Timer(55, check_email_thread).start()
threading.Timer(55, check_email_thread).start()
shortcuts = CONFIG['shortcuts'] time.sleep(check_email_delay)
# swap key/value
shortcuts_inverted = dict([[v, k] for k, v in shortcuts.items()])
date = datetime.datetime.now() shortcuts = CONFIG['shortcuts']
month = date.strftime("%B")[:3] # Nov, Mar, Apr # swap key/value
day = date.day shortcuts_inverted = dict([[v, k] for k, v in shortcuts.items()])
year = date.year
today = "%s-%s-%s" % (day, month, year)
LOG.debug("Connect to IMAP host '%s' with user '%s'" % date = datetime.datetime.now()
(CONFIG['imap']['host'], month = date.strftime("%B")[:3] # Nov, Mar, Apr
CONFIG['imap']['login'])) day = date.day
year = date.year
today = "%s-%s-%s" % (day, month, year)
try: LOG.debug("Connect to IMAP host '%s' with user '%s'" %
server = IMAPClient(CONFIG['imap']['host'], use_uid=True, timeout=5) (CONFIG['imap']['host'],
server.login(CONFIG['imap']['login'], CONFIG['imap']['password']) CONFIG['imap']['login']))
except Exception:
LOG.exception("Failed to login with IMAP server")
return
# if 'gmail' in CONFIG['imap']['host'].lower(): try:
# server.select_folder('INBOX') server = IMAPClient(CONFIG['imap']['host'], use_uid=True, timeout=5)
server.select_folder('INBOX') server.login(CONFIG['imap']['login'], CONFIG['imap']['password'])
except Exception:
LOG.exception("Failed to login with IMAP server")
#return
continue
messages = server.search(['SINCE', today]) server.select_folder('INBOX')
LOG.debug("%d messages received today" % len(messages))
for msgid, data in server.fetch(messages, ['ENVELOPE']).items(): messages = server.search(['SINCE', today])
envelope = data[b'ENVELOPE'] LOG.debug("%d messages received today" % len(messages))
LOG.debug('ID:%d "%s" (%s)' %
(msgid, envelope.subject.decode(), envelope.date))
f = re.search('([[A-a][0-9]_-]+@[[A-a][0-9]_-\.]+)',
str(envelope.from_[0]))
if f is not None:
from_addr = f.group(1)
else:
from_addr = "noaddr"
if "APRS" not in server.get_flags(msgid)[msgid]: for msgid, data in server.fetch(messages, ['ENVELOPE']).items():
# if msg not flagged as sent via aprs envelope = data[b'ENVELOPE']
server.fetch([msgid], ['RFC822']) LOG.debug('ID:%d "%s" (%s)' %
(body, from_addr) = parse_email(msgid, data, server) (msgid, envelope.subject.decode(), envelope.date))
# unset seen flag, will stay bold in email client f = re.search('([[A-a][0-9]_-]+@[[A-a][0-9]_-\.]+)',
server.remove_flags(msgid, [SEEN]) str(envelope.from_[0]))
if f is not None:
from_addr = f.group(1)
else:
from_addr = "noaddr"
if from_addr in shortcuts_inverted: if "APRS" not in server.get_flags(msgid)[msgid]:
# reverse lookup of a shortcut # if msg not flagged as sent via aprs
from_addr = shortcuts_inverted[from_addr] server.fetch([msgid], ['RFC822'])
(body, from_addr) = parse_email(msgid, data, server)
# unset seen flag, will stay bold in email client
server.remove_flags(msgid, [SEEN])
reply = "-" + from_addr + " " + body if from_addr in shortcuts_inverted:
# print "Sending message via aprs: " + reply # reverse lookup of a shortcut
# radio from_addr = shortcuts_inverted[from_addr]
send_message(CONFIG['ham']['callsign'], reply)
# flag message as sent via aprs
server.add_flags(msgid, ['APRS'])
# unset seen flag, will stay bold in email client
server.remove_flags(msgid, [SEEN])
server.logout() reply = "-" + from_addr + " " + body
# end check_email() # print "Sending message via aprs: " + reply
# radio
send_message(CONFIG['ham']['callsign'], reply)
# flag message as sent via aprs
server.add_flags(msgid, ['APRS'])
# unset seen flag, will stay bold in email client
server.remove_flags(msgid, [SEEN])
server.logout()
# end check_email()
def send_ack_thread(tocall, ack, retry_count): def send_ack_thread(tocall, ack, retry_count):
@ -498,7 +497,9 @@ def main(args=args):
time.sleep(2) time.sleep(2)
check_email_thread() # start email reader thread check_email_delay = 60 # initial email check interval
checkemailthread = threading.Thread(target=check_email_thread, args=(check_email_delay, )) # args must be tuple
checkemailthread.start()
LOG.info("Start main loop") LOG.info("Start main loop")
while True: while True: