- Author:
- andres_torres_marroquin
- Posted:
- February 28, 2011
- Language:
- Python
- Version:
- 1.2
- Score:
- 3 (after 3 ratings)
This will take your Django template and will search for images in <table> and <img> tags, and will replace it with attached files in the email to send. You can use it without a template param.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # Based on http://djangosnippets.org/snippets/285/
# Sending html emails with images attached in Django
# download and install BeautifulSoup from http://www.crummy.com/software/BeautifulSoup/
from BeautifulSoup import BeautifulSoup
from django.conf import settings
from django.template import loader, Context
from django.core.mail import EmailMultiAlternatives
from email.MIMEImage import MIMEImage
import email.Charset
CHARSET = 'utf-8'
email.Charset.add_charset(CHARSET, email.Charset.SHORTEST, None, None)
named = lambda email, name: ('%s <%s>' % email, name) if name else email
def image_finder(tag):
return (tag.name == u'img' or
tag.name == u'table' and tag.has_key('background'))
def render(context, template):
if template:
t = loader.get_template(template)
return t.render(Context(context))
return context
def send_html_mail(subject, recipient, message, template='',
recipient_name='', sender_name='', sender=None,
CHARSET=CHARSET):
"""
If you want to use Django template system:
use `message` and define `template`.
If you want to use images in html message, no problem,
it will attach automatically found files in html template.
(image paths are relative to PROJECT_PATH)
"""
html = render(message, template)
# Image processing, replace the current image urls with attached images.
soup = BeautifulSoup(html)
images = []
added_images = []
for index, tag in enumerate(soup.findAll(image_finder)):
if tag.name == u'img':
name = 'src'
elif tag.name == u'table':
name = 'background'
# If the image was already added, skip it.
if tag[name] in added_images:
continue
added_images.append(tag[name])
images.append((tag[name], 'img%d' % index))
tag[name] = 'cid:img%d' % index
html = str(soup)
msg = EmailMultiAlternatives(
subject=subject,
body=html,
to=[named(recipient, recipient_name)],
from_email=named(sender, sender_name),
)
for filename, file_id in images:
image_file = open(settings.PROJECT_PATH + filename, 'rb')
msg_image = MIMEImage(image_file.read())
image_file.close()
msg_image.add_header('Content-ID', '<%s>' % file_id)
msg.attach(msg_image)
msg.content_subtype = "html"
msg.send()
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 3 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Please login first before commenting.