diff options
author | David Rousselie <dax@happycoders.org> | 2007-05-29 20:51:21 +0400 |
---|---|---|
committer | David Rousselie <dax@happycoders.org> | 2007-05-29 20:51:21 +0400 |
commit | 16de054616699bf1285a732202bd1d1ebbb9df5d (patch) | |
tree | 8fedd632d97e481dbec672ac68b87cd0875da712 /src/jmc | |
parent | 7446d401a5a6ef247e43b2128dbfc3db9b43eba9 (diff) |
SendMail handlers implementation
darcs-hash:20070529165121-86b55-277ef5d430a1480519abd96fa81cf175b6036a4c.gz
Diffstat (limited to 'src/jmc')
-rw-r--r-- | src/jmc/jabber/component.py | 39 | ||||
-rw-r--r-- | src/jmc/jabber/tests/component.py | 72 | ||||
-rw-r--r-- | src/jmc/lang.py | 16 | ||||
-rw-r--r-- | src/jmc/tests/lang.py | 9 |
4 files changed, 124 insertions, 12 deletions
diff --git a/src/jmc/jabber/component.py b/src/jmc/jabber/component.py index 504abdd..3284ae9 100644 --- a/src/jmc/jabber/component.py +++ b/src/jmc/jabber/component.py @@ -59,10 +59,6 @@ class MailComponent(FeederComponent): self.feeder = MailFeeder(self) self.sender = MailSender(self) self.account_manager.account_classes = (IMAPAccount, POP3Account, SMTPAccount) - - def authenticated(self): - """Register message handlers""" - FeederComponent.authenticated(self) self.msg_handlers += [SendMailMessageHandler(), RootSendMailMessageHandler()] self.subscribe_handlers += [MailSubscribeHandler()] self.unsubscribe_handlers += [MailUnsubscribeHandler()] @@ -201,13 +197,22 @@ class SendMailMessageHandler(MailHandler): MailHandler.__init__(self) 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): - 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()) + return self.send_mail_result(message, lang, to_email) class RootSendMailMessageHandler(SendMailMessageHandler): def __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") def filter(self, message): @@ -221,9 +226,27 @@ class RootSendMailMessageHandler(SendMailMessageHandler): return accounts def handle(self, message, lang, accounts): - # TODO : parse "headers", or advanced addressing - to_email = "" - accounts[0].send_email(to_email, message.get_subject(), message.get_body()) + to_email = None + lines = message.get_body().split('\n') + 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): """Use DefaultSubscribeHandler handle method and MailHandler filter""" diff --git a/src/jmc/jabber/tests/component.py b/src/jmc/jabber/tests/component.py index d435c2f..f2ad14d 100644 --- a/src/jmc/jabber/tests/component.py +++ b/src/jmc/jabber/tests/component.py @@ -37,7 +37,7 @@ from jcl.jabber.tests.component import DefaultSubscribeHandler_TestCase, Default from jmc.model.account import MailAccount, IMAPAccount, POP3Account, SMTPAccount from jmc.jabber.component import MailComponent, SendMailMessageHandler, RootSendMailMessageHandler, MailHandler, MailSubscribeHandler, MailUnsubscribeHandler - +from jmc.lang import Lang if sys.platform == "win32": DB_PATH = "/c|/temp/jmc_test.db" @@ -515,8 +515,28 @@ class SendMailMessageHandler_TestCase(unittest.TestCase): self.handler = SendMailMessageHandler() def test_handle(self): - # TODO - pass + message = Message(from_jid="user1@test.com", + 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): def setUp(self): @@ -586,6 +606,52 @@ class RootSendMailMessageHandler_TestCase(unittest.TestCase): self.assertEquals(accounts.count(), 0) 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): def setUp(self): self.handler = MailHandler() diff --git a/src/jmc/lang.py b/src/jmc/lang.py index 4be0908..bf1b831 100644 --- a/src/jmc/lang.py +++ b/src/jmc/lang.py @@ -61,6 +61,13 @@ class Lang(jcl.lang.Lang): type_imap_name = u"IMAP 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): component_name = u"Jabber Mail Component" 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_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): # 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" diff --git a/src/jmc/tests/lang.py b/src/jmc/tests/lang.py index f9eef33..8fe8f2e 100644 --- a/src/jmc/tests/lang.py +++ b/src/jmc/tests/lang.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: utf-8 -*- ## ## test_lang.py ## 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_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): def setUp(self): self.lang_class = Lang.fr |