这篇文章给大家分享的是有关如何使用Django发送邮件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
需要使用到模块
from django.core.mail import send_mail,send_mass_mail
SMTP为邮件服务器,每一种邮箱smtp服务器地址不一样,自行百度
如163邮箱为smtp.163.com
一、在settings中添加配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
#邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True #是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。
EMAIL_USE_SSL = False #是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.163.com' #发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱
EMAIL_PORT = 25 #发件箱的SMTP服务器端口
EMAIL_HOST_USER = '######@163.com' #发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = 'pwd'
DEFAULT_FROM_EMAIL = 'zjw <#####@163.com>'
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 如下选项,表示将session对象交给redis管理
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
在中urls添加配置
from django.contrib import admin
from django.conf.urls import include, url
urlpatterns = [
url('admin/', admin.site.urls),
url(r'Voting_items/', include('news.urls',namespace='voting')),
]
以上配置就可以实现使用#######@163.com邮箱发送邮件
二、如何发送
编写模板文件
from django.db import models
from django.contrib.auth.models import User
#Create your models here.
class MyUser(User):
#继承Django自带的USer模型类并重写
url = models.URLField(blank=True, null=True, default="http://www.baidu.com")
class Meta():
verbose_name = "用户"
verbose_name_plural = verbose_name
去admin中注册
from django.contrib import admin
from .models import *
#Register your models here.
admin.site.register(MyUser)
生成迁移文件并在数据库创建表
python manage.py makemigrations
python manage.py migrate
编写路由
from django.conf.urls import url
from . import views
app_name= 'voting'
urlpatterns = [
# 验证码
url(r'^verify/$', views.verify, name='verify'),
# 注册
url(r'^regist/$',views.regist,name='regist'),
# 发邮件
url(r'^active/(.*?)/$',views.active,name='active'),
]
编写视图
视图函数如下
1、安装 itsdangerous
pip install itsdangerous
2、序列化
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,SignatureExpired
#发邮件
from django.core.mail import send_mail, send_mass_mail, EmailMultiAlternatives
from django.conf import settings
import random,io
#引入序列化加密并且有效期信息
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,SignatureExpired
from django.shortcuts import render
from django.http import HttpResponse
from .models import MyUser
def regist(request):
if request.method == 'GET':
return render(request, 'Voting_items/regist.html')
if request.method == "POST":
username = request.POST.get("username_regi")
pwd = request.POST.get("password_regi")
pwd2 = request.POST.get("password_regi_2")
res = None
try:
MyUser.objects.get()
users = MyUser.objects.get_by_natural_key(username=username)
if username == str(users):
res = "该用户已注册"
return render(request, 'Voting_items/login.html', {"res": res})
except Exception as q:
print(q)
if pwd != pwd2:
res = "密码不一致"
return render(request, 'Voting_items/login.html', {"res": res})
else:
res = "注册成功,请在2个小时内激活。"
user = MyUser.objects.create_user(username= username, password=pwd, url = 'http://www.baidu.com')
print(user.id,user.username,user.is_active)
# 注册用户之后默认为非激活状态
user.is_active = False
user.save()
# 为了防止非人为激活,需要将激活地址加密
# 带有有效期的序列化
# 1 得到序列化工具
serutil = Serializer(settings.SECRET_KEY,expires_in=7200)
# 2 使用工具对字典对象序列化
result = serutil.dumps({"userid": user.id }).decode("utf-8")
# print(result, type(result))
mail = EmailMultiAlternatives("点击激活用户","请点击:<a href = 'http://127.0.0.1:8000/Voting_items/active/%s/'>点击激活</a>"%(result,),settings.DEFAULT_FROM_EMAIL,['zjw505104341@163.com'])
mail.content_subtype = "html"
mail.send()
return render(request, 'Voting_items/login.html', {"res": res})
#加密数据并存到serutive中
def active(request,info):
serutil = Serializer(settings.SECRET_KEY,expires_in=7200)
try:
obj = serutil.loads(info)
print(obj["userid"])
id = obj["userid"]
user = get_object_or_404(MyUser, pk=id)
user.is_active = True
user.save()
return redirect(reverse('voting:login'), {"res": "激活成功。"})
except SignatureExpired as e:
return HttpResponse("过期了")
#验证码
def verify(request):
# try:
#with open('1.png', 'wb') as f:
#return HttpResponse(f.readable())
#except Exception as e:
#print(e)
#return HttpResponse("出错了")
#每次请求验证码,需要使用pillow构造出图像,返回
#定义变量,用于画面的背景色、宽、高
bgcolor = (random.randrange(20, 100),
random.randrange(20, 100),
random.randrange(20, 100))
width = 100
heigth = 35
#创建画面对象
im = Image.new('RGB', (width, heigth), bgcolor)
#创建画笔对象
draw = ImageDraw.Draw(im)
#调用画笔的point()函数绘制噪点
for i in range(0, 100):
# 随机取得位置
xy = (random.randrange(0, width), random.randrange(0, heigth))
#随机取得颜色
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
#填充
draw.point(xy, fill=fill)
#定义验证码的备选值
str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0qwertyuiopasdfghjklzxcvbnm'
#随机选取4个值作为验证码
rand_str = ''
for i in range(0, 4):
rand_str += str1[random.randrange(0, len(str1))]
print(rand_str)
#构造字体对象
font = ImageFont.truetype('cambriab.ttf', 23)
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
#绘制4个字
draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
#释放画笔
del draw
request.session['verifycode'] = rand_str
f = io.BytesIO()
im.save(f, 'png')
#将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(f.getvalue(), 'image/png')
编写界面
我用到了模板继承 下面这是login界面
{% extends 'Base.html' %}
{% block title %}
登陆界面
{% endblock %}
{% block body %}
{% comment %}
<form action="{% url 'polls:login' %}" method="post">
{% csrf_token %}
{{lf}}
<input type="submit" value="登录">
</form>
<form action="#" method="post">
{% csrf_token %}
{{rf}}
<input type="submit" value="注册">
</form>
{% endcomment %}
<div class="container">
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">登陆</a>
</li>
<li role="presentation"><a href="#messages" aria-controls="messages" role="tab" data-toggle="tab">注册</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="home">
状态:{{ res }}
<div id="info"></div>
<br>
<form action="{% url 'voting:login' %}" method="POST" id="select">
{% csrf_token %}
<h5>登陆页面</h5>
<p>
<input name="account" id="username" autocomplete="off" type="text" placeholder="请输入账户/手机号">
</p>
<p>
<input name="pwd" type="password" placeholder="请输入密码">
</p>
<p>
<img id="Img" src="{% url 'voting:verify' %}" alt="验证码" />
<a href="#" onclick="reImg();">看不清,换一张</a>
</p>
<p>
<input name="verify" type="text" placeholder="请输入验证码">
</p>
<p>
<button type="submit" class="btn btn-primary" id="vote">登陆</button>
</p>
</form>
</div>
<div role="tabpanel" class="tab-pane" id="messages">
<p><a href="{% url 'voting:regist' %}" class="btn btn-info">注册</a></p>
</div>
<div role="tabpanel" class="tab-pane" id="settings">
</div>
</div>
</div>
<script>
<!--验证码刷新-->
function reImg(){
var img = document.getElementById("Img");
img.src = "{% url 'voting:verify' %}?rnd=" + Math.random();
}
</script>
{% endblock %}
下面这是regist界面
{% extends 'Base.html' %}
{% block title %}
注册界面
{% endblock %}
{% block body %}
<div class="container">
状态:{{ res }}
<br>
<form action="{% url 'voting:regist' %}" method="POST" id="select">
{% csrf_token %}
<h4>注册页面</h4>
<input type="text" class="form-control" name="username_regi" id="username_regi" placeholder="请输入用户名">
<input type="password" class="form-control" name="password_regi" id="password_regi" placeholder="请输入密码">
<input type="password" class="form-control" name="password_regi_2" id="password_regi_2" placeholder="请再次输入密码">
<button type="submit" class="btn btn-default">注册</button>
</form>
</div>
{% endblock %}
下面这是Base界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
基类
{% endblock %}
</title>
{% load static %}
<link rel="stylesheet" href="{% static 'js/lib/bootstrap-3.3.7-dist/css/bootstrap.css' %}">
<script src="{% static 'js/lib/jQuery/jquery-1.12.4.min.js' %}"></script>
<script src="{% static 'js/lib/bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
因为我用到了BootStrap插件,所以要引入
在项目的同级目录下创建文件夹
static文件夹 在下方创建js文件夹 然后创建lib文件夹 把BootStrap文件放进去 和 jQuery文件放进去
第一个参数为主题
第二个参数为正文
第三个参数为发件人
第四个参数为收件人列表
send_mass_mail为批量发邮件
第一个参数为元组类型
元组中每一个项目均为send_mail中四个参数
三、如何实现用户注册激活
1、用户注册时向数据库直接注册用户,并且设置is_active为false
并且向用户邮箱发送邮件
2、邮件内容怎么拼接
邮件内容为激活用户的路由 : Exp
<a href=’http://127.0.0.1:8000/polls/active/10/’> 点击激活</a>
3、编写激活路由
在激活路由中提取参数
将参数所对应的用户 的is_active设置为True
然后重定向登录页面
四、如何机密并且设置有效期
1、安装 itsdangerous
pip install itsdangerous
2、序列化
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,SignatureExpired
针对字典形式内容序列化
#1 得到序列化工具
serutil = Serializer(settings.SECRET_KEY)
#2 使用工具对字典对象序列化
result = serutil.dumps({"userid": user.id }).decode("utf-8")
3、反序列化
使用配置相同的序列化工具
serutil = Serializer(settings.SECRET_KEY)
#info 代表反序列化字符串
obj = serutil.loads(info)
print(obj["userid"])
感谢各位的阅读!关于“如何使用Django发送邮件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。