SendMail handlers implementation

darcs-hash:20070529165121-86b55-277ef5d430a1480519abd96fa81cf175b6036a4c.gz
This commit is contained in:
David Rousselie
2007-05-29 18:51:21 +02:00
parent 7446d401a5
commit 16de054616
4 changed files with 124 additions and 12 deletions

View File

@@ -59,10 +59,6 @@ class MailComponent(FeederComponent):
self.feeder = MailFeeder(self) self.feeder = MailFeeder(self)
self.sender = MailSender(self) self.sender = MailSender(self)
self.account_manager.account_classes = (IMAPAccount, POP3Account, SMTPAccount) self.account_manager.account_classes = (IMAPAccount, POP3Account, SMTPAccount)
def authenticated(self):
"""Register message handlers"""
FeederComponent.authenticated(self)
self.msg_handlers += [SendMailMessageHandler(), RootSendMailMessageHandler()] self.msg_handlers += [SendMailMessageHandler(), RootSendMailMessageHandler()]
self.subscribe_handlers += [MailSubscribeHandler()] self.subscribe_handlers += [MailSubscribeHandler()]
self.unsubscribe_handlers += [MailUnsubscribeHandler()] self.unsubscribe_handlers += [MailUnsubscribeHandler()]
@@ -201,13 +197,22 @@ class SendMailMessageHandler(MailHandler):
MailHandler.__init__(self) MailHandler.__init__(self)
self.__logger = logging.getLogger("jmc.jabber.component.SendMailMessageHandler") self.__logger = logging.getLogger("jmc.jabber.component.SendMailMessageHandler")
def send_mail_result(self, message, lang, to_email):
return [Message(from_jid=message.get_to(),
to_jid=message.get_from(),
subject=lang.send_mail_ok_subject,
body=lang.send_mail_ok_body % (to_email))]
def handle(self, message, lang, accounts): def handle(self, message, lang, accounts):
to_email = replace(message.get_to().node, '%', '@', 1) to_node = message.get_to().node
to_email = to_node.replace('%', '@', 1)
accounts[0].send_email(to_email, message.get_subject(), message.get_body()) accounts[0].send_email(to_email, message.get_subject(), message.get_body())
return self.send_mail_result(message, lang, to_email)
class RootSendMailMessageHandler(SendMailMessageHandler): class RootSendMailMessageHandler(SendMailMessageHandler):
def __init__(self): def __init__(self):
SendMailMessageHandler.__init__(self) SendMailMessageHandler.__init__(self)
self.to_regexp = re.compile("^\s*(to|TO)\s*:\s*(?P<to_email>.*)")
self.__logger = logging.getLogger("jmc.jabber.component.RootSendMailMessageHandler") self.__logger = logging.getLogger("jmc.jabber.component.RootSendMailMessageHandler")
def filter(self, message): def filter(self, message):
@@ -221,9 +226,27 @@ class RootSendMailMessageHandler(SendMailMessageHandler):
return accounts return accounts
def handle(self, message, lang, accounts): def handle(self, message, lang, accounts):
# TODO : parse "headers", or advanced addressing to_email = None
to_email = "" lines = message.get_body().split('\n')
accounts[0].send_email(to_email, message.get_subject(), message.get_body()) message_body = []
while to_email is None \
and lines:
line = lines.pop(0)
match = self.to_regexp.match(line)
if match:
to_email = match.group("to_email")
else:
message_body.append(line)
message_body.extend(lines)
if to_email is not None:
accounts[0].send_email(to_email, message.get_subject(), "".join(message_body))
return self.send_mail_result(message, lang, to_email)
else:
return [Message(from_jid=message.get_to(),
to_jid=message.get_from(),
stanza_type="error",
subject=lang.send_mail_error_no_to_header_subject,
body=lang.send_mail_error_no_to_header_body)]
class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler): class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler):
"""Use DefaultSubscribeHandler handle method and MailHandler filter""" """Use DefaultSubscribeHandler handle method and MailHandler filter"""

View File

@@ -37,7 +37,7 @@ from jcl.jabber.tests.component import DefaultSubscribeHandler_TestCase, Default
from jmc.model.account import MailAccount, IMAPAccount, POP3Account, SMTPAccount from jmc.model.account import MailAccount, IMAPAccount, POP3Account, SMTPAccount
from jmc.jabber.component import MailComponent, SendMailMessageHandler, RootSendMailMessageHandler, MailHandler, MailSubscribeHandler, MailUnsubscribeHandler from jmc.jabber.component import MailComponent, SendMailMessageHandler, RootSendMailMessageHandler, MailHandler, MailSubscribeHandler, MailUnsubscribeHandler
from jmc.lang import Lang
if sys.platform == "win32": if sys.platform == "win32":
DB_PATH = "/c|/temp/jmc_test.db" DB_PATH = "/c|/temp/jmc_test.db"
@@ -515,8 +515,28 @@ class SendMailMessageHandler_TestCase(unittest.TestCase):
self.handler = SendMailMessageHandler() self.handler = SendMailMessageHandler()
def test_handle(self): def test_handle(self):
# TODO message = Message(from_jid="user1@test.com",
pass to_jid="user%test.com@jcl.test.com",
subject="message subject",
body="message body")
class MockSMTPAccount(object):
def send_email(self, to_email, subject, body):
self.to_email = to_email
self.subject = subject
self.body = body
accounts = [MockSMTPAccount()]
result = self.handler.handle(message, Lang.en, accounts)
self.assertEquals(accounts[0].to_email, "user@test.com")
self.assertEquals(accounts[0].subject, "message subject")
self.assertEquals(accounts[0].body, "message body")
self.assertEquals(len(result), 1)
self.assertEquals(result[0].stanza_type, "message")
self.assertEquals(result[0].get_from(), "user%test.com@jcl.test.com")
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_subject(),
Lang.en.send_mail_ok_subject)
self.assertEquals(result[0].get_body(),
Lang.en.send_mail_ok_body % ("user@test.com"))
class RootSendMailMessageHandler_TestCase(unittest.TestCase): class RootSendMailMessageHandler_TestCase(unittest.TestCase):
def setUp(self): def setUp(self):
@@ -586,6 +606,52 @@ class RootSendMailMessageHandler_TestCase(unittest.TestCase):
self.assertEquals(accounts.count(), 0) self.assertEquals(accounts.count(), 0)
del account.hub.threadConnection del account.hub.threadConnection
def test_handle_email_found_in_header(self):
message = Message(from_jid="user1@test.com",
to_jid="jcl.test.com",
subject="message subject",
body="to: user@test.com\n" \
"message body")
class MockSMTPAccount(object):
def send_email(self, to_email, subject, body):
self.to_email = to_email
self.subject = subject
self.body = body
accounts = [MockSMTPAccount()]
result = self.handler.handle(message, Lang.en, accounts)
self.assertEquals(accounts[0].to_email, "user@test.com")
self.assertEquals(accounts[0].subject, "message subject")
self.assertEquals(accounts[0].body, "message body")
self.assertEquals(len(result), 1)
self.assertEquals(result[0].get_type(), None)
self.assertEquals(result[0].get_from(), "jcl.test.com")
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_subject(),
Lang.en.send_mail_ok_subject)
self.assertEquals(result[0].get_body(),
Lang.en.send_mail_ok_body % ("user@test.com"))
def test_handle_email_not_found_in_header(self):
message = Message(from_jid="user1@test.com",
to_jid="jcl.test.com",
subject="message subject",
body="message body")
class MockSMTPAccount(object):
def send_email(self, to_email, subject, body):
self.to_email = to_email
self.subject = subject
self.body = body
accounts = [MockSMTPAccount()]
result = self.handler.handle(message, Lang.en, accounts)
self.assertEquals(len(result), 1)
self.assertEquals(result[0].get_type(), "error")
self.assertEquals(result[0].get_from(), "jcl.test.com")
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_subject(),
Lang.en.send_mail_error_no_to_header_subject)
self.assertEquals(result[0].get_body(),
Lang.en.send_mail_error_no_to_header_body)
class MailHandler_TestCase(unittest.TestCase): class MailHandler_TestCase(unittest.TestCase):
def setUp(self): def setUp(self):
self.handler = MailHandler() self.handler = MailHandler()

View File

@@ -61,6 +61,13 @@ class Lang(jcl.lang.Lang):
type_imap_name = u"IMAP accounts" type_imap_name = u"IMAP accounts"
type_pop3_name = u"POP3 accounts" type_pop3_name = u"POP3 accounts"
send_mail_error_no_to_header_subject = u"No header \"TO\" found"
send_mail_error_no_to_header_body = u"No header \"TO\" found in receive message.\n" \
u"Please use following syntax to specify destination email address:\n" \
u"TO: user@test.com\n"
send_mail_ok_subject = u"Email sent"
send_mail_ok_body = u"Your email was sent to %s."
class fr(jcl.lang.Lang.fr): class fr(jcl.lang.Lang.fr):
component_name = u"Jabber Mail Component" component_name = u"Jabber Mail Component"
register_title = u"Enregistrement d'une nouvelle connexion à un " \ register_title = u"Enregistrement d'une nouvelle connexion à un " \
@@ -99,6 +106,15 @@ class Lang(jcl.lang.Lang):
type_imap_name = u"comptes IMAP" type_imap_name = u"comptes IMAP"
type_pop3_name = u"comptes POP3" type_pop3_name = u"comptes POP3"
send_mail_error_no_to_header_subject = u"L'en-tête \"TO\" n'a pas été "\
u"trouvé"
send_mail_error_no_to_header_body = u"L'en-tête \"TO\" n'a pas été " \
u"trouvé dans le message envoyé.\n" \
u"Utiliser la syntax suivante pour spécifier l'adresse email du " \
u"destinataire :\nTO: user@test.com\n"
send_mail_ok_subject = u"Email envoyé"
send_mail_ok_body = u"Votre email a été envoyé à %s."
class nl(jcl.lang.Lang.nl): class nl(jcl.lang.Lang.nl):
# TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_nl_TestCase, 'test') line # TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_nl_TestCase, 'test') line
register_title = u"Registratie van verbindingen voor Jabber Mail" register_title = u"Registratie van verbindingen voor Jabber Mail"

View File

@@ -1,4 +1,4 @@
# -*- coding: UTF-8 -*- # -*- coding: utf-8 -*-
## ##
## test_lang.py ## test_lang.py
## Login : David Rousselie <david.rousselie@happycoders.org> ## Login : David Rousselie <david.rousselie@happycoders.org>
@@ -105,6 +105,13 @@ class Language_TestCase(jcl.tests.lang.Language_TestCase):
self.assertNotEquals(self.lang_class.new_mail_subject, None) self.assertNotEquals(self.lang_class.new_mail_subject, None)
self.assertNotEquals(self.lang_class.new_digest_subject, None) self.assertNotEquals(self.lang_class.new_digest_subject, None)
self.assertNotEquals(self.lang_class.send_mail_error_no_to_header_subject,
None)
self.assertNotEquals(self.lang_class.send_mail_error_no_to_header_body,
None)
self.assertNotEquals(self.lang_class.send_mail_ok_subject, None)
self.assertNotEquals(self.lang_class.send_mail_ok_body, None)
class Language_fr_TestCase(Language_TestCase): class Language_fr_TestCase(Language_TestCase):
def setUp(self): def setUp(self):
self.lang_class = Lang.fr self.lang_class = Lang.fr