Django 发送邮件

在settings.py中设置

 

EMAIL_USE_SSL = True

EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com

EMAIL_PORT = 465

EMAIL_HOST_USER = '763005825@qq.com' # 帐号

EMAIL_HOST_PASSWORD = 'jffbcdknmbzvbega'  # 密码

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

引入包

from django.core.mail import send_mail

 

发送邮件

send_mail('主题',"内容",'发送账号',['接收账号'], fail_silently=False)

 

 

 

 

selery发送邮件

 

 

celery

  • 官方网站
  • 中文文档
  • 示例一:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验
  • 示例二:网站每小时需要同步一次天气预报信息,但是http是请求触发的,难道要一小时请求一次吗?
  • 使用celery后,情况就不一样了
  • 示例一的解决:将耗时的程序放到celery中执行
  • 示例二的解决:使用celery定时执行

名词

  • 任务task:就是一个Python函数
  • 队列queue:将需要执行的任务加入到队列中
  • 工人worker:在一个新进程中,负责执行队列中的任务
  • 代理人broker:负责调度,在布置环境中使用redis

使用

  • 安装包

celery==3.1.25

celery-with-redis==3.0

django-celery==3.1.17

  • 配置settings

INSTALLED_APPS = (

  ...

  'djcelery',

}

 

...

 

import djcelery

djcelery.setup_loader()

BROKER_URL = 'redis://127.0.0.1:6379/0'

CELERY_IMPORTS = ('应用名称.task')

  • 在应用目录下创建task.py文件

from celery import task

from django.core.mail import send_mail

import time

 

@task

def sendmail():

    email='763005825@qq.com'

    send_mail('reigster',"欢迎登录天天生鲜",'763005825@qq.com',[email],fail_silently=False)

    time.sleep(10)

 

  • 迁移,生成celery需要的数据表

python manage.py migrate

  • 启动Redis

sudo redis-server /etc/redis/redis.conf

  • 启动worker

python manage.py celery worker --loglevel=info

  • 使用代码

#from task import *

 

def index(request):

    sendmail.delay()

 

 

    return HttpResponse("hello world")

 

 

 

# 专门进行验证
def validate_sql(data):
for k,val in data:
if re.match("['select' ,'update','delete']", val) != None:
return False
return True



# 注册
class Register(View):
def get(self,request):
return render(request,'index/register.html')
def post(self,request):
mes = {}
data=request.POST
# flag=validate_sql(data)
# if flag==False:
# mes['code'] = 10015
# mes['message'] = '输入不合法'
# return HttpResponse(json.dumps(mes))
username=data.get('user_name')
pwd=data.get('pwd')
cpwd=data.get('cpwd')
email=data.get('email')
allow=data.get('allow')
if not all([username,pwd,cpwd,email,allow]):
mes['code']=10010
mes['message']='都不能为空'
return HttpResponse(json.dumps(mes))
else:
# 用户名必须为8-12位字母
if re.match("\w{8,12}$",username)==None:
mes['code']=10011
mes['message']='用户名不合法'

# if re.match("['select' ,'update','delete']",username)!=None:
# mes['code']=10012

# 验证邮箱
if re.match("\w{8,12}@(163|126|qq).com$", email) == None:
mes['code'] = 10012
mes['message'] = '用户名不合法'
return HttpResponse(json.dumps(mes))

# 验证两次输入的密码是否一致
if pwd!=cpwd:
mes['code'] = 10013
mes['message'] = '两次输入的密码不一致'
return HttpResponse(json.dumps(mes))
# 注册
user=User(name=username,password=make_password(pwd),
token='23')
try:
user.save()
request.session['indexuser']=username
# 发送邮件
from mypro.settings import DEFAULT_FROM_EMAIL
send_mail('你好,欢迎注册',"欢迎你注册xx网站<a href='/authuser?"
"token=wertfgb>",DEFAULT_FROM_EMAIL,[email],fail_silently=False)
except:
mes['code'] = 10018
mes['message'] = '添加失败'
return HttpResponse(json.dumps(mes))
mes['code']=1200
mes['message']=''
return HttpResponse(json.dumps(mes))

 

posted on 2019-06-04 11:41 女己。 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wyf2019/p/10972625.html

### 在 Django 中实现发送邮件验证码的功能 要在 Django 项目中实现发送邮件验证码的功能,可以按照以下方法设计模型、视图以及配置电子邮件服务。 #### 数据库模型定义 为了存储生成的验证码及其相关信息,可以在 `models.py` 文件中定义一个名为 `Vaild_Code` 的数据表: ```python from django.db import models class Vaild_Code(models.Model): code_content = models.CharField(max_length=8, verbose_name="验证码") # 存储验证码内容 code_time = models.DateTimeField(auto_now=True, verbose_name="创建时间") # 自动生成当前时间 code_status = models.IntegerField(default=0, verbose_name="状态", help_text="1 表示已使用;0 表示未使用") # 定义验证码的状态 code_user = models.EmailField(verbose_name="邮箱") # 关联用户的邮箱地址 def __str__(self): return f"{self.code_user} - {self.code_content}" ``` 此部分的设计基于已有引用中的字段说明[^3]。 --- #### 配置邮件服务 在 Django 项目的 `settings.py` 文件中,需要设置用于发送邮件的相关参数。这些参数通常包括 SMTP 服务器地址、端口、用户名和密码等信息。 以下是典型的邮件配置代码片段: ```python EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.example.com' # 替换为实际使用的SMTP服务器域名 EMAIL_PORT = 587 # 常见的SMTP端口号 EMAIL_USE_TLS = True # 是否启用TLS加密传输 EMAIL_HOST_USER = 'your_email@example.com' # 发件人的邮箱账号 EMAIL_HOST_PASSWORD = 'password' # 对应发件人邮箱的授权码或密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 默认发件人显示名称 ``` 上述配置来源于关于 Django 设置邮件功能的内容描述[^2]。 --- #### 创建并发送验证码逻辑 接下来,在视图函数中完成验证码的生成与发送操作。可以通过 Python 的内置模块 `random` 来随机生成指定长度的字符串作为验证码,并通过 Django 提供的 `send_mail()` 方法将其发送至目标邮箱。 下面是一段完整的视图处理流程: ```python import random from django.core.mail import send_mail from .models import Vaild_Code from django.conf import settings def generate_code(): """生成6位数的随机验证码""" chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' length = len(chars) result = ''.join(random.choice(chars) for _ in range(6)) return result def send_verification_code(request): email = request.POST.get('email') # 获取前端提交的目标邮箱地址 if not email: return {"status": "error", "message": "请输入有效的电子邮箱"} try: is_registered = UserProfile.objects.filter(email=email).exists() # 判断该邮箱是否已经注册过账户[^4] if not is_registered: return {"status": "error", "message": "该邮箱尚未注册"} verification_code = generate_code() valid_record = Vaild_Code(code_content=verification_code, code_user=email) # 将新生成的验证码保存到数据库 valid_record.save() subject = "您的验证码" message = f"您好,您正在尝试登录/找回密码,请输入以下验证码:{verification_code}\n有效期为5分钟。" from_email = settings.DEFAULT_FROM_EMAIL recipient_list = [email] send_result = send_mail(subject, message, from_email, recipient_list) if send_result > 0: return {"status": "success", "message": "验证码已成功发送,请查收邮件"} else: return {"status": "error", "message": "验证码发送失败,请稍后再试"} except Exception as e: return {"status": "error", "message": str(e)} ``` 以上代码实现了从接收请求到生成验证码再到最终发送的过程[^1]。 --- #### 验证验证码的有效性 当用户收到邮件后返回填写验证码时,需验证其有效性。这一步骤同样应在视图层实现,具体做法是从数据库查询对应记录并与用户提供值对比。 示例代码如下所示: ```python from datetime import timedelta, timezone from django.utils.timezone import now def verify_code(request): input_code = request.POST.get('code') user_email = request.POST.get('email') current_time = now() five_minutes_ago = current_time - timedelta(minutes=5) record = Vaild_Code.objects.filter( code_user=user_email, code_content=input_code, code_status=0, code_time__gte=five_minutes_ago ).first() if record: record.code_status = 1 # 更新状态为已使用 record.save(update_fields=['code_status']) return {"status": "success", "message": "验证码校验通过"} else: return {"status": "error", "message": "验证码错误或者已失效"} ``` 这里的时间范围判断依据是确保验证码仅限于最近五分钟内有效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值