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.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"""

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.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()

View File

@@ -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"

View File

@@ -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