Django-发送邮件
概述
Python中内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活i的发送邮件。所有的功能都在django.core.mail中,常用的免费服务器有:163、126、QQ等。
SSL和TLS
SSL:(Secure Socket Layer,安全套接字层)位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
TLS:(Transport LayerSecurity,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
我们通常所说的 HTTPS 协议,就是“HTTP 协议”和“SSL/TLS 协议”的组合。你可以把 HTTPS 大致理解为——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)。浏览器地址栏的那把锁指的就是SSL协议。
TLS和SSL的关系:并列关系
最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL 3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL 3.0不能互操作。
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS在SSL v3.0的基础上,提供了以下增加内容:
- 更安全的MAC算法
- 更严密的警报
- “灰色区域”规范的更明确的定义
配置
首先,我们需要一个本地SMTP服务器或者在项目setting.py中添加以下设置来配置一个外部SMTP服务器:
- EMAIL_HOST: SMTP服务器主机,默认为localhost。
- EMAIL_PORT: SMTP服务器端口,默认为25。
- EMAIL_HOST_USER: SMTP 服务器的用户名。
- EMAIL_HOST_PASSWORD: SMTP 服务器的密码。
- EMAIL_USE_TLS: 是否使用TLS安全连接,默认False。
- EMAIL_USE_SSL: 是否使用SSL安全连接,默认False。
如果没有本地SMTP服务器,可以使用e-mail提供者的SMTP服务器。下面的简单配置是通过QQ服务器发送e-mail的配置。
# SMTP后端是Django的默认配置,如果要明确指定,请在settings中输入以下内容 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = "smtp.qq.com" # SMTP服务器主机 EMAIL_PORT = 25 # 端口 EMAIL_HOST_USER = "695485***@qq.com" # 发送邮件的邮箱 EMAIL_HOST_PASSWORD = "*********" # #邮箱的授权密码 EMAIL_USE_SSL= True注意:
配置中,EMAIL_USE_TLS和EMAIL_USE_SSL都默认设置为False,需要配置其中一个为True,但是不能两个都设置为True。一般端口587对应TLS,端口465对应SSL。
阿里云默认禁用了25端口,使用465端口,EMAIL_USE_TLS=True
发送邮件
# 前面四个参数必须要写,后面的参数可以为空 def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None):
- subject:一个字符串,发送邮件的主题。
- message:一个字符串,邮件内容。
- from_email:一个字符串,收件人看到的发件人,可以自己设定。
- recipient_list:字符串列表,每个字符串都是电子邮件地址。每个成员可以在收件人字段中看到其他收件人。
# apps/utils/email_send.py from django.core.mail import send_mail def sendMail(request): from_email = 'ray<[email protected]>' msg = '<a href="http://127.0.0.1:8000/index/">点击激活</a>' send_mail("注册激活","",msg,from_email,recipient_list=['',]) return HttpResponse("邮件已发送")