Skip to content

Commit

Permalink
Merge 2dfe3c8 into a6a46fe
Browse files Browse the repository at this point in the history
  • Loading branch information
RyanBalfanz committed Mar 20, 2016
2 parents a6a46fe + 2dfe3c8 commit ad40293
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 0 deletions.
9 changes: 9 additions & 0 deletions example/settings.py
Expand Up @@ -119,6 +119,7 @@
SMS_BACKEND_CONSOLE = 'smsish.sms.backends.console.SMSBackend'
SMS_BACKEND_DUMMY = 'smsish.sms.backends.dummy.SMSBackend'
SMS_BACKEND_LOCMEM = 'smsish.sms.backends.locmem.SMSBackend'
SMS_BACKEND_MAILTRAP = 'smsish.sms.backends.mailtrap.SMSBackend'
SMS_BACKEND_RQ = 'smsish.sms.backends.rq.SMSBackend'
SMS_BACKEND_TWILIO = 'smsish.sms.backends.twilio.SMSBackend'
SMS_BACKEND = os.getenv("SMS_BACKEND", SMS_BACKEND_CONSOLE)
Expand All @@ -141,6 +142,14 @@
for queueConfig in RQ_QUEUES.values():
queueConfig['ASYNC'] = False

SMS_BACKEND = SMS_BACKEND_MAILTRAP
if SMS_BACKEND == SMS_BACKEND_RQ:
SMSISH_RQ_SMS_BACKEND = SMS_BACKEND_CONSOLE
SMSISH_RQ_SMS_BACKEND = os.getenv("SMSISH_RQ_SMS_BACKEND", SMS_BACKEND_CONSOLE)
elif SMS_BACKEND == SMS_BACKEND_MAILTRAP:
SMSISH_MAILTRAP_SMS_BACKEND_EMAIL_BACKEND = "smsish.mail.backends.mailtrap.EmailBackend"

MAILTRAP_EMAIL_HOST = os.getenv("MAILTRAP_EMAIL_HOST", "mailtrap.io")
MAILTRAP_EMAIL_HOST_USER = os.getenv("MAILTRAP_EMAIL_HOST_USER", None)
MAILTRAP_EMAIL_HOST_PASSWORD = os.getenv("MAILTRAP_EMAIL_HOST_PASSWORD", None)
MAILTRAP_EMAIL_HOST_PORT = os.getenv("MAILTRAP_EMAIL_HOST_PORT", "2525")
Empty file added smsish/mail/__init__.py
Empty file.
Empty file.
18 changes: 18 additions & 0 deletions smsish/mail/backends/mailtrap.py
@@ -0,0 +1,18 @@
"""Mailtrap (SMTP) email backend class."""
from django.conf import settings
from django.core.mail.backends.smtp import EmailBackend as SMTPBaseEmailBackend


class EmailBackend(SMTPBaseEmailBackend):
"""
A wrapper that manages the Mailtrap SMTP network connection.
"""
def __init__(self, host=None, port=None, username=None, password=None, fail_silently=False, **kwargs):
super().__init__(
host="mailtrap.io",
port=465,
username=settings.MAILTRAP_EMAIL_HOST_USER if username is None else username,
password=settings.MAILTRAP_EMAIL_HOST_PASSWORD if password is None else password,
use_tls=True,
fail_silently=fail_silently,
)
2 changes: 2 additions & 0 deletions smsish/mail/utils.py
@@ -0,0 +1,2 @@
def emailify_phone_number(phoneNumber):
return "{}@localhost".format(phoneNumber)
47 changes: 47 additions & 0 deletions smsish/sms/backends/mailtrap.py
@@ -0,0 +1,47 @@
from django.conf import settings

from .base import BaseSMSBackend

DEFAULT_SMS_OVER_EMAIL_BACKEND = "smsish.mail.backends.mailtrap.EmailBackend"


class SMSBackend(BaseSMSBackend):
def __init__(self, *args, **kwargs):
super(SMSBackend, self).__init__(*args, **kwargs)

def send_messages(self, sms_messages):
results = []
for message in sms_messages:
t = self.get_transform_function()
email_message = t(message)
result = email_message.send()
results.append(result)

return results

def get_transform_function(self):
return transform_sms_to_email_message


def transform_sms_to_email_message(sms_message):
from django.core.mail import get_connection
from django.core.mail.message import EmailMessage
from smsish.mail.utils import emailify_phone_number

backend = getattr(settings, "SMSISH_MAILTRAP_SMS_BACKEND_EMAIL_BACKEND", DEFAULT_SMS_OVER_EMAIL_BACKEND)
conn = get_connection(backend=backend)
email = EmailMessage(
subject="SMS over Email",
body=sms_message.body,
from_email=emailify_phone_number(sms_message.from_email),
to=[emailify_phone_number(r) for r in sms_message.to],
bcc=[emailify_phone_number(r) for r in sms_message.bcc] if sms_message.bcc else None,
connection=conn,
attachments=None,
headers=None,
cc=[emailify_phone_number(r) for r in sms_message.cc] if sms_message.cc else None,
reply_to=[emailify_phone_number(sms_message.reply_to) for r in sms_message.reply_to] if sms_message.reply_to else None,
)
email.attach("metadata.txt", "Content-Length: {}".format(len(sms_message.body)), "text/plain")

return email
39 changes: 39 additions & 0 deletions smsish/tests.py
Expand Up @@ -231,6 +231,45 @@ def test_send_mass_sms(self):
self.assertEqual(len(mail.outbox), 10)


@override_settings(
SMS_BACKEND='smsish.sms.backends.mailtrap.SMSBackend',
SMSISH_MAILTRAP_SMS_BACKEND_EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend")
class SendSMSUsingMailtrapTestCase(TestCase):
def setUp(self):
self.sms = SMSMessage(
"Body",
VALID_FROM_NUMBER,
[VALID_TO_NUMBER]
)
self.sms_no_recipients = SMSMessage("Body", VALID_TO_NUMBER, [])

def test_send(self):
sms = self.sms
numSent = sms.send()
self.assertEqual(numSent, [1])
self.assertEqual(len(mail.outbox), 1)

def test_send_sms(self):
results = send_sms("Body", VALID_FROM_NUMBER, [VALID_TO_NUMBER])
self.assertEqual(results, [1])
self.assertEqual(len(mail.outbox), 1)

def test_send_to_nobody(self):
sms = self.sms_no_recipients
results = sms.send()
self.assertEqual(results, 0)
self.assertEqual(len(mail.outbox), 0)

def test_send_mass_sms(self):
from django.conf import settings
from smsish.sms import get_sms_connection
with get_sms_connection(settings.SMS_BACKEND) as connection:
datatuple = (("Body", VALID_FROM_NUMBER, [VALID_TO_NUMBER]) for _ in range(10))
results = send_mass_sms(datatuple, connection=connection)
self.assertEqual(sum(results), 10)
self.assertEqual(len(mail.outbox), 10)


@override_settings(SMS_BACKEND='smsish.sms.backends.rq.SMSBackend')
@override_settings(SMSISH_RQ_SMS_BACKEND='smsish.sms.backends.locmem.SMSBackend')
@override_settings(TESTING=True)
Expand Down

0 comments on commit ad40293

Please sign in to comment.