千家信息网

如何使用Django发送邮件

发表于:2024-10-25 作者:千家信息网编辑
千家信息网最后更新 2024年10月25日,这篇文章给大家分享的是有关如何使用Django发送邮件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Django发送邮件需要使用到模块from django.core.ma
千家信息网最后更新 2024年10月25日如何使用Django发送邮件

这篇文章给大家分享的是有关如何使用Django发送邮件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Django发送邮件

需要使用到模块from django.core.mail import send_mail,send_mass_mailSMTP为邮件服务器,每一种邮箱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 adminfrom django.conf.urls import include, urlurlpatterns = [    url('admin/', admin.site.urls),    url(r'Voting_items/', include('news.urls',namespace='voting')),]
    以上配置就可以实现使用#######@163.com邮箱发送邮件

二、如何发送

编写模板文件

from django.db import modelsfrom 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 urlfrom . import viewsapp_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, EmailMultiAlternativesfrom django.conf import settingsimport random,io#引入序列化加密并且有效期信息from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,SignatureExpiredfrom django.shortcuts import renderfrom django.http import HttpResponsefrom .models import MyUserdef 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 %}
{% csrf_token %} {{lf}}
{% csrf_token %} {{rf}}
{% endcomment %}
状态:{{ res }}

{% csrf_token %}
登陆页面

验证码 看不清,换一张

{% endblock %}

下面这是regist界面
{% extends 'Base.html' %}

{% block title %}
注册界面

{% endblock %}{% block body %}    
状态:{{ res }}
{% csrf_token %}

注册页面

{% 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发送邮件"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

邮件 序列 激活 用户 参数 文件 邮箱 对象 界面 内容 工具 数据 配置 验证 文件夹 服务器 路由 加密 服务 登陆 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 590mbps云服务器 汽车通信模组网络安全 yuzu体感配置服务器 湖南分众互联网科技有限公司 苏州阿里云服务器兼容性 sql数据库查看连接主机 网络安全保障工作的情况报告 数据库fetch显示错误 哈利路亚互联网科技有限公司 ctf网络安全攻防平台 如何统计单元格重复的数据库 北京联想服务器续保维护 手游方舟怎样建服务器 阿里软件开发工具是正版吗 小型服务器ups选择 保护服务器的安全 千端网络技术 二手手机无法连接到服务器 泰坦陨落2北极星服务器xbox 基因在细胞系中表达情况的数据库 net编程软件开发 岳阳口碑好的软件开发服务 南沙软件开发哪家正规 jsp中对数据库操作的语句 哪里有重庆电信服务器托管云空间 港服ps5原神无法连接服务器 服务器低价租用 服务器坏了用什么软件修复 虚拟机服务器关机后如何开机 湖北省中学生网络安全和家庭教育
0