From 5c98aa767745e8f4e21d24dd693928093c28070f Mon Sep 17 00:00:00 2001 From: b3yond Date: Fri, 5 Jan 2018 14:16:24 +0100 Subject: [PATCH] started an IMAP listener to implement a 3rd bot: the Mailbot. #11 --- config.toml.example | 2 + mailbot.py | 99 +++++++++++++++++++++++++++++++++++++++++++++ retweetbot.py | 2 +- sendmail.py | 4 +- 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 mailbot.py diff --git a/config.toml.example b/config.toml.example index 35328ee..6257146 100644 --- a/config.toml.example +++ b/config.toml.example @@ -27,6 +27,8 @@ passphrase = "sup3rs3cur3" # If you want to receive crash reports (so you can restart the bot # when it breaks down), you should specify a contact email address: #contact = "your_mail@riseup.net" +# Mailing list where you want to send warnings to +#list = "nbg_ticketfrei@lists.links-tech.org" [logging] # The directory where logs should be stored. diff --git a/mailbot.py b/mailbot.py new file mode 100644 index 0000000..ec81b17 --- /dev/null +++ b/mailbot.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 + +import sendmail +import datetime +import email +import logger +import pytoml as toml +import imaplib +import sys + +class Mailbot(object): + """ + Bot which sends Mails if mentioned via twitter/mastodon, and tells + other bots that it received mails. + """ + + def __init__(self, config, logger): + """ + Creates a Bot who listens to mails and forwards them to other + bots. + + :param config: (dictionary) config.toml as a dictionary of dictionaries + """ + self.config = config + self.logger = logger + + try: + self.mailinglist = self.config["mail"]["list"] + except KeyError: + self.mailinglist = None + + self.mailbox = imaplib.IMAP4_SSL(self.config["mail"]["imapserver"]) + # context = ssl.create_default_context() + # print(self.mailbox.starttls(ssl_context=context)) # print is a debug + try: + rv, data = self.mailbox.login(self.config["mail"]["user"], + self.config["mail"]["passphrase"]) + except imaplib.IMAP4.error: + logmsg = "Login to mail server failed." + logmsg = logmsg + logger.generate_tb(sys.exc_info()) + logger.log(logmsg) + logger.shutdown(logmsg) + + def listen(self): + """ + listen for mails which contain goodwords but no badwords. + :return: + """ + rv, data = self.mailbox.select("Inbox") + if rv == 'OK': + rv, data = self.mailbox.search(None, "ALL") + print(data) + rv, data = self.mailbox.search(None, "ALL") + if rv != 'OK': + print("No messages found!") + return + + for num in data[0].split(): + rv, data = self.mailbox.fetch(num, '(RFC822)') + if rv != 'OK': + print("ERROR getting message", num) + return + msg = email.message_from_bytes(data[0][1]) + hdr = email.header.make_header(email.header.decode_header(msg['Subject'])) + subject = str(hdr) + print('Message %s: %s' % (num, subject)) + print('Raw Date:', msg['Date']) + # Now convert to local date-time + date_tuple = email.utils.parsedate_tz(msg['Date']) + if date_tuple: + local_date = datetime.datetime.fromtimestamp( + email.utils.mktime_tz(date_tuple)) + print ("Local Date:", local_date.strftime("%a, %d %b %Y %H:%M:%S")) + #print(msg.as_string()) + author = msg.get("From") # get mail author from email header + text = msg.get_payload() + print(author) + print(text) + # :todo check if they match trigger + # :todo return a nice list of warning messages + + def send_warning(self, statuses): + """ + sends warnings by twitter & mastodon to a mailing list. + """ + for status in statuses: + mailer = sendmail.Mailer(self.config) + mailer.send(status, self.mailinglist, "Warnung: Kontrolleure gesehen") + +if __name__ == "__main__": + # read config in TOML format (https://github.com/toml-lang/toml#toml) + with open('config.toml') as configfile: + config = toml.load(configfile) + + logger = logger.Logger(config) + + m = Mailbot(config, logger) + m.listen() + diff --git a/retweetbot.py b/retweetbot.py index 6d97974..85a4e68 100755 --- a/retweetbot.py +++ b/retweetbot.py @@ -27,7 +27,7 @@ class RetweetBot(object): Initializes the bot and loads all the necessary data. :param trigger: object of the trigger - :param config: object of the config + :param config: (dictionary) config.toml as a dictionary of dictionaries :param logger: object of the logger :param historypath: Path to the file with ID of the last retweeted Tweet diff --git a/sendmail.py b/sendmail.py index 0486bfd..2b06afe 100755 --- a/sendmail.py +++ b/sendmail.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import smtplib +import ssl import pytoml as toml from email.mime.text import MIMEText from email.mime.application import MIMEApplication @@ -27,7 +28,8 @@ class Mailer(object): # starts a client session with the SMTP server self.s = smtplib.SMTP(config["mail"]["mailserver"]) - self.s.starttls() + context = ssl.create_default_context() + self.s.starttls(context=context) self.s.login(config["mail"]["user"], config["mail"]["passphrase"]) def send(self, text, recipient, subject, attachment=None):