0

This code is from django_messages application.Even though template is supposed to be html, i still get raw html code in email body.What needs to be done in this case to send both text version and properly working HTML version?

{% load i18n %}
{% load url from future %}

{% blocktrans with recipient=message.recipient sender=message.sender %}Hello {{ recipient }},

you received a private message from {{ sender }} with
the following contents:{% endblocktrans %}

{{ message.body|safe }}

--
{% blocktrans %}Sent from {{ site_url }}{% endblocktrans %}

Above is new_message.html file

Below is actual code for sending email

def new_message_email(sender, instance, signal, 
    subject_prefix=_(u'New Message: %(subject)s'),
    template_name="messages/new_message.html",
    default_protocol=None,
    *args, **kwargs):
"""
This function sends an email and is called via Django's signal framework.
Optional arguments:
    ``template_name``: the template to use
    ``subject_prefix``: prefix for the email subject.
    ``default_protocol``: default protocol in site URL passed to template
"""
if default_protocol is None:
    default_protocol = getattr(settings, 'DEFAULT_HTTP_PROTOCOL', 'http')

if 'created' in kwargs and kwargs['created']:
    try:
        current_domain = Site.objects.get_current().domain
        subject = subject_prefix % {'subject': instance.subject}
        message = render_to_string(template_name, {
            'site_url': '%s://%s' % (default_protocol, current_domain),
            'message': instance,
        })

        if instance.recipient.email != "":
            send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
                [instance.recipient.email,])
    except Exception as e:
        #print e
        pass #fail silently

if 'created' in kwargs and kwargs['created']:
    try:
        current_domain = Site.objects.get_current().domain
        subject = subject_prefix % {'subject': instance.subject}
        message = render_to_string(template_name, {
            'site_url': '%s://%s' % (default_protocol, current_domain),
            'message': instance,
        })

        if instance.recipient.email != "":
            send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
                [instance.recipient.email,])
    except Exception as e:
        #print e
        pass #fail silently

This is new code i tried by following example but it is not working.

if 'created' in kwargs and kwargs['created']:
    try:
        current_domain = Site.objects.get_current().domain
        subject = subject_prefix % {'subject': instance.subject}
        html_content = render_to_string(template_name, {
            'site_url': '%s://%s' % (default_protocol, current_domain),
            'message': instance,
        })

        if instance.recipient.email != "":
            text_content = strip_tags(html_content)
            msg = EmailMultiAlternatives(subject, text_content, settings.DEFAULT_FROM_EMAIL,
                [instance.recipient.email,])
            msg.attach_alternative(html_content, "text/html")
            send_mail(msg)
    except Exception as e:
        #print e
        pass #fail silently
user3760940
  • 115
  • 1
  • 3
  • 11
  • I had the same problem but solved it. I posted my result here: https://stackoverflow.com/a/62582892/4202997 – alkadelik Jun 25 '20 at 19:29

1 Answers1

3

In Django 1.7+, you can specify html_message when using send_mail. The message parameter is still required for clients that do not support html emails.

For Django 1.6 and earlier, see the instructions for sending alternative content types. Instead of calling send_mail, you construct an email message, set the html content, then send it.

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
Alasdair
  • 298,606
  • 55
  • 578
  • 516