| 1 |
# Example email backend implementation for App Engine. |
|---|
| 2 |
# Most of this code is taken from here: |
|---|
| 3 |
# http://code.google.com/p/google-app-engine-django/source/browse/trunk/appengine_django/mail.py |
|---|
| 4 |
|
|---|
| 5 |
import logging |
|---|
| 6 |
|
|---|
| 7 |
from django.core.mail.backends.base import BaseEmailBackend |
|---|
| 8 |
from django.core.mail import EmailMultiAlternatives |
|---|
| 9 |
from django.core.exceptions import ImproperlyConfigured |
|---|
| 10 |
|
|---|
| 11 |
try: |
|---|
| 12 |
from google.appengine.api import mail as gaemail |
|---|
| 13 |
except ImportError, err: |
|---|
| 14 |
raise ImproperlyConfigured(('Failed to import App Engine libraries: %s' |
|---|
| 15 |
% err)) |
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
class AppEngineEmailBackend(BaseEmailBackend): |
|---|
| 19 |
|
|---|
| 20 |
def send_messages(self, email_messages): |
|---|
| 21 |
num_sent = 0 |
|---|
| 22 |
for message in email_messages: |
|---|
| 23 |
if self._send(message): |
|---|
| 24 |
num_sent += 1 |
|---|
| 25 |
return num_sent |
|---|
| 26 |
|
|---|
| 27 |
def _copy_message(self, message): |
|---|
| 28 |
"""Create and return App Engine EmailMessage class from message.""" |
|---|
| 29 |
gmsg = gaemail.EmailMessage(sender=message.from_email, |
|---|
| 30 |
to=message.to, |
|---|
| 31 |
subject=message.subject, |
|---|
| 32 |
body=message.body) |
|---|
| 33 |
if message.extra_headers.get('Reply-To', None): |
|---|
| 34 |
gmsg.reply_to = message.extra_headers['Reply-To'] |
|---|
| 35 |
if message.bcc: |
|---|
| 36 |
gmsg.bcc = list(message.bcc) |
|---|
| 37 |
if message.attachments: |
|---|
| 38 |
gmsg.attachments = [(a[0], a[1]) for a in message.attachments] |
|---|
| 39 |
if isinstance(message, EmailMultiAlternatives): # look for HTML |
|---|
| 40 |
for content, mimetype in message.alternatives: |
|---|
| 41 |
if mimetype == 'text/html': |
|---|
| 42 |
gmsg.html = content |
|---|
| 43 |
break |
|---|
| 44 |
return gmsg |
|---|
| 45 |
|
|---|
| 46 |
def _send(self, message): |
|---|
| 47 |
try: |
|---|
| 48 |
msg = self._copy_message(message) |
|---|
| 49 |
except (ValueError, AttributeError, gaemail.Error): |
|---|
| 50 |
# e.g. a empty body raises ValueError |
|---|
| 51 |
if not self.fail_silently: |
|---|
| 52 |
raise |
|---|
| 53 |
return False |
|---|
| 54 |
try: |
|---|
| 55 |
msg.send() |
|---|
| 56 |
except gaemail.Error: |
|---|
| 57 |
if not self.fail_silently: |
|---|
| 58 |
raise |
|---|
| 59 |
return False |
|---|
| 60 |
return True |
|---|