How to send html email with django with dynamic content in it?

后端 未结 7 1131
一向
一向 2020-12-04 11:09

Can anyone please help me sending html email with dynamic contents. One way is to copy the entire html code into a variable and populate the dynamic code within it in Django

相关标签:
7条回答
  • 2020-12-04 11:15

    Example:

    from django.core.mail import EmailMultiAlternatives
    from django.template.loader import render_to_string
    from django.utils.html import strip_tags
    
    subject, from_email, to = 'Subject', 'from@xxx.com', 'to@xxx.com'
    
    html_content = render_to_string('mail_template.html', {'varname':'value'}) # render with dynamic value
    text_content = strip_tags(html_content) # Strip the html tag. So people can see the pure text at least.
    
    # create the email, and attach the HTML version as well.
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()
    
    0 讨论(0)
  • 2020-12-04 11:24

    Django includes the django.core.mail.send_mail method these days (2018), no need to use EmailMultiAlternatives class directly. Do this instead:

    from django.core import mail
    from django.template.loader import render_to_string
    from django.utils.html import strip_tags
    
    subject = 'Subject'
    html_message = render_to_string('mail_template.html', {'context': 'values'})
    plain_message = strip_tags(html_message)
    from_email = 'From <from@example.com>'
    to = 'to@example.com'
    
    mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
    

    This will send an email which is visible in both html-capable browsers and will show plain text in crippled email viewers.

    0 讨论(0)
  • 2020-12-04 11:26

    Try this::::

    https://godjango.com/19-using-templates-for-sending-emails/

    sample code link

    # views.py
    
    from django.http import HttpResponse
    from django.template import Context
    from django.template.loader import render_to_string, get_template
    from django.core.mail import EmailMessage
    
    def email_one(request):
        subject = "I am a text email"
        to = ['buddy@buddylindsey.com']
        from_email = 'test@example.com'
    
        ctx = {
            'user': 'buddy',
            'purchase': 'Books'
        }
    
        message = render_to_string('main/email/email.txt', ctx)
    
        EmailMessage(subject, message, to=to, from_email=from_email).send()
    
        return HttpResponse('email_one')
    
    def email_two(request):
        subject = "I am an HTML email"
        to = ['buddy@buddylindsey.com']
        from_email = 'test@example.com'
    
        ctx = {
            'user': 'buddy',
            'purchase': 'Books'
        }
    
        message = get_template('main/email/email.html').render(Context(ctx))
        msg = EmailMessage(subject, message, to=to, from_email=from_email)
        msg.content_subtype = 'html'
        msg.send()
    
        return HttpResponse('email_two')
    
    0 讨论(0)
  • 2020-12-04 11:28

    For anyone looking at this in 2020 and using django v3.x (I don't know when this was introduced so it might work for earlier versions.

    Note: I only wanted to include an html version without a plain text version. My django view:

    from django.template.loader import render_to_string 
    from django.core.mail import EmailMessage
    
    # import html message.html file
    html_template = 'path/to/message.html'
    
    html_message = render_to_string(html_template, { 'context': context, })
    
    message = EmailMessage(subject, html_message, from_email, [to_email])
    message.content_subtype = 'html' # this is required because there is no plain text email message
    message.send()
    

    My html file (message.html) looked like this:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Order received</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>
    <body style="margin: 0; padding: 0;">
      <table align="center" border="0" cellpadding="0" cellspacing="0" width="320" style="border: none; border-collapse: collapse; font-family:  Arial, sans-serif; font-size: 14px; line-height: 1.5;">
    ...
    content
    ...
    </table>
    </body>
    </html>
    

    More details here: Send alternative content types from django docs

    0 讨论(0)
  • 2020-12-04 11:32

    This should do what you want:

    from django.core.mail import EmailMessage
    from django.template import Context
    from django.template.loader import get_template
    
    
    template = get_template('myapp/email.html')
    context = Context({'user': user, 'other_info': info})
    content = template.render(context)
    if not user.email:
        raise BadHeaderError('No email address given for {0}'.format(user))
    msg = EmailMessage(subject, content, from, to=[user.email,])
    msg.send()
    

    See the django mail docs for more.

    0 讨论(0)
  • 2020-12-04 11:35
    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()
    
    0 讨论(0)
提交回复
热议问题