如何发送带有 django 动态内容的 html 电子邮件?

有人能帮我发送带有动态内容的 html 电子邮件吗。一种方法是将整个 html 代码复制到一个变量中,并在 Django 视图中填充其中的动态代码,但这似乎不是一个好主意,因为它是一个非常大的 html 文件。

如果有任何建议,我将不胜感激。

谢谢。

88659 次浏览

这应该可以达到你想要的效果:

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 邮件文件

例如:

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

试试这个:

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

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-able 浏览器,并将显示纯文本在受损的电子邮件查看器。

如果需要为邮件设置动态电子邮件模板,请将电子邮件内容保存在数据库表中。 这是我在 database = 中保存为 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>

In your views:

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

这将发送您在 Db 中保存的动态 HTML 模板。

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

对于那些在2020年使用 django v3.x 的人来说(我不知道这是什么时候引入的,所以它可能适用于早期版本。

注意: 我只想包含一个没有纯文本版本的 html 版本。我的 django 视图:

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>

这里有更多详细信息: 从 django docs发送替代内容类型