一、写这篇博客的目的
主要记录如何通过django来实现这个功能:发送满足【邮件正文值为一个html页面】的单个邮件;
发送满足【邮件正文值为一个html页面】的单个邮件,可以使用该函数:send_mail();
完整操作流程可以看接下来的内容;
二、完整操作流程
1、第一步:在【settings.py】里新增邮箱配置信息
# 下面的代码都是我个人新增的,不是djano框架默认生成的;
# 配置qq邮箱信息
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 值必须为这个
EMAIL_USE_SSL = True # SSL加密方式,值必须为True
EMAIL_HOST = 'smtp.qq.com' # 发送邮件的qq邮箱的SMTP服务器
EMAIL_PORT = 465 # QQ邮箱对应的SMTP服务器端口
EMAIL_HOST_USER = '[email protected]' # 发件人
EMAIL_HOST_PASSWORD = 'xolnfbqgdybxji11' # qq授权码(不能使用qq密码只能使用qq授权码)
EMAIL_FROM = 'Rainbow<[email protected]>' # 邮件显示的发件人
2、第二步:在【helloworld/hello/views.py】里新增视图函数
from django.core.mail import send_mail, send_mass_mail
import time
# 发送邮件正文值为一个html页面的单个邮件
def send_email_003(request):
html_content = '''
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>带图片的邮件</title>
</head>
<body>
这是第一张图片,点击图片后可跳转到我的博客首页<br>
<a href="https://blog.csdn.net/LYX_WIN" target="_blank">
<p>
<img src="https://img-blog.csdnimg.cn/20210311134514969.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xZWF9XSU4=,size_16,color_FFFFFF,t_70" height="400" width="300" />
</p>
</a>
<p>
这是第二张图片,点击后不会触发任何跳转效果<br>
<img src="http://www.w3school.com.cn/i/eg_chinarose.jpg" height=200 width=400 />
</p>
</body>
</html>
'''
send_mail(subject="这是小可爱给你发的邮件标题(邮件正文值为一个html页面)",
message="这是邮件的正文!(当入参html_message的值不为None,那入参message的值就不会生效)",
from_email="[email protected]",
recipient_list=["[email protected]"], # 收件人邮箱可以是任意邮箱
# recipient_list=["[email protected]","朋友1的[email protected]","朋友2的[email protected]","朋友3 的@qq.com"]
html_message=html_content
)
now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
return HttpResponse("邮件正文值为一个html页面的邮件发送成功!发送时间为:%s" % now_time)
3、第三步:在【helloworld/helloworld/urls.py】里新增url匹配规则
url(r"^send_email_003/$",views.send_email_003),
4、第四步:重启服务
5、第五步:任一浏览器上输入url地址【http://0.0.0.0:8000/send_email_003/】进行访问后,查看结果
三、相关知识点
1、send_mail()函数的源码简单分析
def send_mail(subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None, html_message=None):
"""
Easy wrapper for sending a single message to a recipient list. All members
of the recipient list will see the other recipients in the 'To' field.
If from_email is None, use the DEFAULT_FROM_EMAIL setting.
If auth_user is None, use the EMAIL_HOST_USER setting.
If auth_password is None, use the EMAIL_HOST_PASSWORD setting.
Note: The API for this method is frozen. New code wanting to extend the
functionality should use the EmailMessage class directly.
"""
connection = connection or get_connection(
username=auth_user,
password=auth_password,
fail_silently=fail_silently,
)
mail = EmailMultiAlternatives(subject, message, from_email, recipient_list, connection=connection)
if html_message:
mail.attach_alternative(html_message, 'text/html')
return mail.send()
截取这部分源码:
mail = EmailMultiAlternatives(subject, message, from_email, recipient_list, connection=connection)
if html_message:
mail.attach_alternative(html_message, 'text/html')
return mail.send()
从这部分源码可以简单看出来:当入参html_message值不为空,会调用【EmailMultiAlternatives】类提供的【attach_alternative】方法,从而实现最终发送邮件正文为一个html页面的邮件的功能;
入参message值和入参html_message值的组合,主要有这两个场景:
- 当函数send_mail()的入参message的值不为空,入参html_message的值也不为空,那么:入参message的值不生效,入参htm_message的值生效;
- 当函数send_mail()的入参message的值不为空,入参html_message的值为默认值None,那么:入参message的值生效,入参htm_message的值不生效;