Django中如何发送有样式的邮件(HTML邮件)
Django中利用EmailMultiAlternatives发送有样式的邮件(html邮件)
·
前言:
上一篇文章中我们讲到了Django内置模块中的send_mail方法发送邮件,这种方法的好处是语法简单,只需要设置几个简单的值就可以发送一封简单的邮件,但是这种方法发送的邮件没有样式,看起来非常单一,有样式之后担心兼容性问题?,EmailMultiAlternatives帮我们解决了这个问题
一、方法讲解
- EmailMultiAlternatives
- render_to_string
- strip_tags
这是我们这里会用到的方法
1、EmailMultiAlternatives
这是Django内置的一个发送邮件的模块,他可以发送html邮件,同时如果用户的浏览器不兼容html邮件,则发送的纯文本的邮件
语法讲解:
# 创建一个邮件对象
email_object = EmailMultiAlternatives(
subject="您的邮箱验证码",
body=text_content, # 去除html标签的邮件(也就是纯文本邮件)
from_email='填写收到邮件显示的发件方名称 <发件邮箱>',
to=[], # 发给哪些人
# reply_to=[] 回复地址,通常不需要
)
email_object.attach_alternative(html_content,"text/html") # html邮件
result = email_object.send() # 发送邮件
2、render_to_string
render大家都知道
在render中的context中设置参数时会自动填充到html模板
例如:
html模板中example.html
<h1>{{ msg }}</h1>
视图函数:
render(request,'example.html',{"msg":"你好世界"})
此时example.html就是
<h1>你好世界</h1>
render_to_string就是做的替换的这一步
html_content = render_to_string('example.html',{"msg":"你好世界"})
返回一个替换好的html
3、strip_tags
在上一步中我们得到了一个html文件
怎么让他变成纯文本文件呢?
text_content = strip_tags(html_content)
这样就会去除他的html标签变成纯文本
二、使用示例
1、在邮箱设置中开启服务(这里以QQ邮箱为例)

开启后经过验证后会得到一个授权码,记住这个授权码
2、在settings.py中配置(此处以QQ邮箱示例)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' # 或其他邮件服务商
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'xxxxxx@qq.com' # 发件人邮箱
EMAIL_HOST_PASSWORD = '' # 邮箱授权码,不是密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
3、编写测试视图函数
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags
def send_email_test(request):
email = '目标邮箱' # 目标邮箱,根据使用场景自行获取
content = {
"email_code":random.randint(1000,9999)
}
html_content = render_to_string('email.html',content)
text_content = strip_tags(html_content)
email_object = EmailMultiAlternatives(
subject="您的邮箱验证码",
body=text_content,
from_email=f'淘宝网 <{settings.DEFAULT_FROM_EMAIL}>',
to=[email],
# reply_to=[] 回复地址,通常不需要
)
email_object.attach_alternative(html_content,"text/html")
result = email_object.send()
if result>0:
return HttpResponse("发送成功")
return HttpResponse("发送失败")
4、效果

三、补充
如果要添加附件
在二、3的基础上
email_object.attach_file() # 填写文件路径(相对或绝对)
更多推荐



所有评论(0)