如何使用Django发送邮件-创新互联
这篇文章给大家分享的是有关如何使用Django发送邮件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联2013年至今,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元秦都做网站,已为上家服务,为秦都各地企业和个人服务,联系电话:028-86922220Django发送邮件
需要使用到模块 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("点击激活用户","请点击:点击激活"%(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 %}{% endcomment %} {% endblock %}
下面这是regist界面
{% extends 'Base.html' %}
{% block title %}
注册界面
{% endblock %} {% block body %}状态:{{ res }}{% endblock %}
下面这是Base界面
{% block title %} 基类 {% endblock %} {% load static %} {% block body %} {% endblock %}
因为我用到了BootStrap插件,所以要引入
在项目的同级目录下创建文件夹 static文件夹 在下方创建js文件夹 然后创建lib文件夹 把BootStrap文件放进去 和 jQuery文件放进去
第一个参数为主题
第二个参数为正文
第三个参数为发件人
第四个参数为收件人列表
send_mass_mail为批量发邮件
第一个参数为元组类型
元组中每一个项目均为send_mail中四个参数
三、如何实现用户注册激活
1、用户注册时向数据库直接注册用户,并且设置is_active为false
并且向用户邮箱发送邮件
2、邮件内容怎么拼接
邮件内容为激活用户的路由 : Exp
点击激活
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发送邮件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站标题:如何使用Django发送邮件-创新互联
链接URL:http://pwwzsj.com/article/cdcojj.html