diff --git a/opentech/apply/activity/messaging.py b/opentech/apply/activity/messaging.py index 1d973043d39e8ea6971d83616d6dab685c90e9da..5e2dfa13d96298e7722781f68e48eb1c35cba8c2 100644 --- a/opentech/apply/activity/messaging.py +++ b/opentech/apply/activity/messaging.py @@ -6,7 +6,7 @@ from django.conf import settings from django.contrib import messages from django.template.loader import render_to_string -from .tasks import send_mail, update_message_status +from .tasks import send_mail def link_to(target, request): @@ -253,14 +253,12 @@ class EmailAdapter(AdapterBase): def send_message(self, message, submission, subject, recipient, **kwargs): try: - emails_sent = send_mail.apply_async( - ( - subject, - message, - submission.page.specific.from_address, - [recipient], - ), - link=update_message_status.s(kwargs['message_log'].id), + emails_sent = send_mail( + subject, + message, + submission.page.specific.from_address, + [recipient], + log=kwargs['message_log'] ) except Exception as e: return 'Error: ' + str(e) diff --git a/opentech/apply/activity/tasks.py b/opentech/apply/activity/tasks.py index 53a16f845d12d775132b063ebb4bd3c5b2879f42..937af737c8cb6e49230d2b1c5cd0066241725646 100644 --- a/opentech/apply/activity/tasks.py +++ b/opentech/apply/activity/tasks.py @@ -2,27 +2,47 @@ from celery import Celery from django.conf import settings from django.core.mail import send_mail as dj_send_mail +from django.core.mail import EmailMessage app = Celery('tasks') app.config_from_object(settings, namespace='CELERY', force=True) +def send_mail(subject, message, from_address, recipients, log=None): + # Convenience method to wrap the tasks and handle the callback + send_mail_task.apply_async( + kwargs={ + 'subject': subject, + 'body': message, + 'from_email': from_address, + 'to': recipients, + }, + link=update_message_status.s(log.id), + ) + + @app.task -def send_mail(*args, **kwargs): +def send_mail_task(**kwargs): + response = {'status': '', 'id': None} + email = EmailMessage(**kwargs) try: - emails_sent = dj_send_mail( - *args, - fail_silently=False, - **kwargs, - ) + email.send() except Exception as e: - return 'Error: ' + str(e) + response['status'] = 'Error: ' + str(e) + else: + try: + return { + 'status': email.anymail_status.status.pop(), + 'id': email.anymail_status.message_id, + } + except AttributeError: + response['status'] = 'sent' - return 'Emails sent: ' + str(emails_sent) + return response @app.task -def update_message_status(status, message): +def update_message_status(response, message): from .models import Message - Message.objects.get(id=message).update_status(status) + Message.objects.get(id=message).update_status(response['status']) diff --git a/opentech/apply/activity/tests/test_messaging.py b/opentech/apply/activity/tests/test_messaging.py index a94e3d19bf770d1c96f05111d49781c9b9f06663..1ad90558185d1ac7ae395867bc82546ea9b997c6 100644 --- a/opentech/apply/activity/tests/test_messaging.py +++ b/opentech/apply/activity/tests/test_messaging.py @@ -346,3 +346,26 @@ class TestEmailAdapter(AdapterMixin, TestCase): self.assertEqual(Message.objects.count(), 1) sent_message = Message.objects.first() self.assertEqual(sent_message.status, 'Error: An error occurred') + + +@override_settings( + SEND_MESSAGES=True, + EMAIL_BACKEND='anymail.backends.test.EmailBackend', +) +class TestAnyMailBehaviour(AdapterMixin, TestCase): + adapter = EmailAdapter() + + def test_email_new_submission(self): + submission = ApplicationSubmissionFactory() + self.adapter_process(MESSAGES.NEW_SUBMISSION, submission=submission) + + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].to, [submission.user.email]) + self.assertEqual(Message.objects.first().status, 'sent') + + def test_email_new_submission(self): + submission = ApplicationSubmissionFactory() + self.adapter_process(MESSAGES.NEW_SUBMISSION, submission=submission) + + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].to, [submission.user.email]) diff --git a/opentech/settings/base.py b/opentech/settings/base.py index 6d4b5579fe4f8396baa34b8e2abfc1d5775d8e29..1ce8e0ef44f3195dd50a2c6bb8c2a5ea0c2fc0a6 100644 --- a/opentech/settings/base.py +++ b/opentech/settings/base.py @@ -55,6 +55,7 @@ INSTALLED_APPS = [ 'wagtail.admin', 'wagtail.core', + 'anymail', 'modelcluster', 'taggit', 'django_extensions', @@ -358,7 +359,12 @@ SLACK_DESTINATION_URL = env.get('SLACK_DESTINATION_URL', None) SLACK_DESTINATION_ROOM = env.get('SLACK_DESTINATION_ROOM', None) -# Celery config +# Eamil and Celery config +EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend' + +if 'MAILGUN_API_KEY' in env: + MAILGUN_API_KEY = env.get('MAILGUN_API_KEY') + if 'REDIS_URL' in env: CELERY_BROKER_URL = env.get('REDIS_URL') else: