千家信息网

如何使用Django发送邮件

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章给大家分享的是有关如何使用Django发送邮件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Django发送邮件需要使用到模块from django.core.ma
千家信息网最后更新 2024年11月23日如何使用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发送邮件"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0