Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dax/jmc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/jmc
diff options
context:
space:
mode:
authorDavid Rousselie <dax@happycoders.org>2007-05-29 20:51:21 +0400
committerDavid Rousselie <dax@happycoders.org>2007-05-29 20:51:21 +0400
commit16de054616699bf1285a732202bd1d1ebbb9df5d (patch)
tree8fedd632d97e481dbec672ac68b87cd0875da712 /src/jmc
parent7446d401a5a6ef247e43b2128dbfc3db9b43eba9 (diff)
SendMail handlers implementation
darcs-hash:20070529165121-86b55-277ef5d430a1480519abd96fa81cf175b6036a4c.gz
Diffstat (limited to 'src/jmc')
-rw-r--r--src/jmc/jabber/component.py39
-rw-r--r--src/jmc/jabber/tests/component.py72
-rw-r--r--src/jmc/lang.py16
-rw-r--r--src/jmc/tests/lang.py9
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