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: