diff --git a/weboob/frontends/monboob/monboob.py b/weboob/frontends/monboob/monboob.py index 7771c949..844501bc 100644 --- a/weboob/frontends/monboob/monboob.py +++ b/weboob/frontends/monboob/monboob.py @@ -20,12 +20,16 @@ from email.mime.text import MIMEText from smtplib import SMTP from email.Header import Header, decode_header from email.Utils import parseaddr, formataddr, formatdate -from email import message_from_file +from email import message_from_file, message_from_string +from smtpd import SMTPServer import time import re import sys import logging +import asyncore +from weboob import Weboob +from weboob.scheduler import Scheduler from weboob.capabilities.messages import ICapMessages, ICapMessagesReply, Message from weboob.tools.application import ConsoleApplication from weboob.tools.misc import html2text, get_backtrace, utc2local @@ -33,6 +37,38 @@ from weboob.tools.misc import html2text, get_backtrace, utc2local __all__ = ['Monboob'] +class FakeSMTPD(SMTPServer): + def __init__(self, app, bindaddr, port): + SMTPServer.__init__(self, (bindaddr, port), None) + self.app = app + + def process_message(self, peer, mailfrom, rcpttos, data): + msg = message_from_string(data) + self.app.process_incoming_mail(msg) + +class MonboobScheduler(Scheduler): + def __init__(self, app): + Scheduler.__init__(self) + self.app = app + + def run(self): + if self.app.options.smtpd: + FakeSMTPD(self.app, '127.0.0.1', int(self.app.options.smtpd)) + + # XXX Fuck, we shouldn't copy this piece of code from + # weboob.scheduler.Scheduler.run(). + try: + while 1: + self.stop_event.wait(0.1) + if self.app.options.smtpd: + asyncore.loop(timeout=0.1, count=1) + except KeyboardInterrupt: + self._wait_to_stop() + raise + else: + self._wait_to_stop() + return True + class Monboob(ConsoleApplication): APPNAME = 'monboob' @@ -44,6 +80,14 @@ class Monboob(ConsoleApplication): 'smtp': 'localhost', 'html': 0} + def __init__(self, *args, **kwargs): + ConsoleApplication.__init__(self, *args, **kwargs) + + self._parser.add_option('-S', '--smtpd', help='run a fake smtpd server and set the port') + + def create_weboob(self): + return Weboob(scheduler=MonboobScheduler(self)) + def main(self, argv): self.load_config() self.load_backends(ICapMessages, storage=self.create_storage()) @@ -64,6 +108,9 @@ class Monboob(ConsoleApplication): @ConsoleApplication.command("pipe with a mail to post message") def command_post(self): msg = message_from_file(sys.stdin) + return self.process_incoming_mail(msg) + + def process_incoming_mail(self, msg): to = self.get_email_address_ident(msg, 'To') reply_to = self.get_email_address_ident(msg, 'In-Reply-To') if not reply_to: