Как отправить HTML-письмо с django с динамическим контентом в нем? - PullRequest
30 голосов
/ 09 июня 2010

Может кто-нибудь, пожалуйста, помогите мне отправить HTML письмо с динамическим содержимым. Одним из способов является копирование всего HTML-кода в переменную и заполнение динамического кода в нем в представлениях Django, но это не очень хорошая идея, так как это очень большой HTML-файл.

Буду признателен за любые предложения.

Спасибо.

Ответы [ 5 ]

45 голосов
/ 02 мая 2013

Пример:

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()

Ссылки

http://www.djangofoo.com/250/sending-html-email/comment-page-1#comment-11401

37 голосов
/ 18 апреля 2018

Django включает метод django.core.mail.send_mail в наши дни (2018), нет необходимости использовать класс EmailMultiAlternatives напрямую.Сделайте это вместо этого:

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)

При этом будет отправлено электронное письмо, видимое в обоих браузерах с поддержкой html, и будет отображаться простой текст в поврежденных средствах просмотра электронной почты.

9 голосов
/ 09 июня 2010

Это должно делать то, что вы хотите:

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()

Подробнее см. Почтовые документы Django .

5 голосов
/ 15 июля 2015

Попробуйте это ::::

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

пример кода ссылки

# 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')
1 голос
/ 26 июля 2018

Если вам нужны динамические шаблоны электронной почты для вашей почты, сохраните содержимое электронной почты в таблицах базы данных.Это то, что я сохранил как HTML-код в базе данных =

<p>Hello.. {{ first_name }} {{ last_name }}.  <br> This is an <strong>important</strong> {{ message }}
<br> <b> By Admin.</b>

 <p style='color:red'> Good Day </p>

По вашему мнению:

from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template

def dynamic_email(request):
    application_obj = AppDetails.objects.get(id=1)
    subject = 'First Interview Call'
    email = request.user.email
    to_email = application_obj.email
    message = application_obj.message

    text_content = 'This is an important message.'
    d = {'first_name': application_obj.first_name,'message':message}
    htmly = FirstInterviewCall.objects.get(id=1).html_content #this is what i have saved previously in database which i have to send as Email template as mentioned above HTML code

    open("partner/templates/first_interview.html", "w").close() # this is the path of my file partner is the app, Here i am clearing the file content. If file not found it will create one on given path.
    text_file = open("partner/templates/first_interview.html", "w") # opening my file
    text_file.write(htmly) #putting HTML content in file which i saved in DB
    text_file.close() #file close

    htmly = get_template('first_interview.html')
    html_content = htmly.render(d)  
    msg = EmailMultiAlternatives(subject, text_content, email, [to_email])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

Это отправит динамический шаблон HTML, который вы сохранили в Db.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...