1.开启服务,获取授权码:
2.在settings.py文件中配置
# qq发送邮件
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 确保你使用的是smtp
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = '123456789@qq.com' # 你的 QQ 账号
EMAIL_HOST_PASSWORD = 'qlhevwlfvngmbehe' # 刚刚复制的授权码(不是你的 QQ 密码!!!)
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
EMAIL_FROM = '博客<123456789@qq.com>' # 收件人看到的发件人(<必须与上面的qq邮箱一致>)
3.views文件中的代码
from django.core.mail import send_mail
from app01 import models
from django.conf import settings
from itsdangerous import SignatureExpired # 超时异常处理
from itsdangerous import TimedJSONWebSignatureSerializer
def reg(request):
user = models.User.objects.filter(username=user_name).first()
# 加密用户的身份信息,生成激活token
# 记得先安装itsdangerous
serializer = Serializer(settings.SECRET_KEY,300) # 加密的秘钥,过期时间300秒
info = {'confirm':user.nid}
token = serializer.dumps(info).decode('utf8')
# 发邮件
subject = '博客欢迎信息'
message = ''
send = settings.EMAIL_FROM
recipient = [user.email] # 收件人邮箱,一次可以发送给多个邮箱
html_message = "<h2>%s,欢迎注册本博客,恭喜您成为本博客用户</h2>,请点击以下链接激活账号<a href='http://127.0.0.1:8000/user/active/%s'>http://127.0.0.1:8000/user/active/%s</a>"%(user.username,token,token)
# send_mail阻塞执行,等到邮件成功发送了,才能执行return,可以使用celery异步执行,
send_mail(subject, message, send, recipient_list=recipient,html_message=html_message)
ret["msg"] = "/article/index/"
return JsonResponse(ret)
若要使用celery发送邮件,如下所示
4.使用celery发送邮件
在项目目录下创建celery_tasks包,在celery_tasks包目录下创建tasks.py文件,即 项目目录/celery_tasks/tasks.py ,tasks.py中的代码如下
# !/user/bin/env python
# -*- coding:utf-8 -*-
from django.conf import settings
from django.core.mail import send_mail
import time
# 使用celery
from celery import Celery
# 在任务处理者一端加这几句(django初始化)
# import os
# import django
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blogtwo.settings")
# django.setup()
# broker系统里面启动redis 执行 ps aux | grep redis
app = Celery('celery_tasks.tasks',broker='redis://127.0.0.1:6379/8') # 使用功能redis作为中间人 8代表使用8号数据库
# 定义任务函数
@app.task
def send_register_active_email(user,token):
"""发送激活邮件"""
# 发邮件
subject = '博客欢迎信息'
message = ''
send = settings.EMAIL_FROM
recipient = [user.email] # 收件人邮箱,一次可以发送给多个邮箱
html_message = "<h2>%s,欢迎注册本博客,恭喜您成为本博客用户</h2>请点击以下链接激活账号<a href='http://127.0.0.1:8000/user/active/%s'>http://127.0.0.1:8000/user/active/%s</a>" % (
user.username, token, token)
# send_mail阻塞执行,等到邮件发送了,页面才能跳转到index,可以使用celery异步执行,
send_mail(subject, message, send, recipient_list=recipient, html_message=html_message)
time.sleep(1)
celery 分为任务发出者 、中间人、 任务处理者
任务发出者一端的代码如下
from celery_tasks.tasks import send_register_active_email
from django.conf import settings
from itsdangerous import TimedJSONWebSignatureSerializer
from django.shortcuts import redirects
from itsdangerous import SignatureExpired # 超时异常处理
def reg(request):
user = models.User.objects.filter(username=user_name).first()
# 加密用户的身份信息,生成激活token
# 记得先安装itsdangerous
serializer = Serializer(settings.SECRET_KEY,300) # 加密的秘钥,过期时间300秒
info = {'confirm':user.nid}
token = serializer.dumps(info).decode('utf8')
send_register_active_email(user,token)
return redirect("/index/")
tasks.py文件中的redis设置的哪个ip地址,就得把相应ip地址下的redis服务启动
任务处理者一端:
把整个项目复制一份到任务处理者服务器,把项目目录下的celery_tasks/tasks.py文件中的修改如下
# !/user/bin/env python
# -*- coding:utf-8 -*-
from django.conf import settings
from django.core.mail import send_mail
import time
# 使用celery
from celery import Celery
# 在任务处理者一端加这几句(django初始化)
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blogtwo.settings")
django.setup()
# broker系统里面启动redis 执行 ps aux | grep redis
app = Celery('celery_tasks.tasks',broker='redis://127.0.0.1:6379/8') # 使用功能redis作为中间人 8代表使用8号数据库
# 定义任务函数
@app.task
def send_register_active_email(user,token):
"""发送激活邮件"""
# 发邮件
subject = '博客欢迎信息'
message = ''
send = settings.EMAIL_FROM
recipient = [user.email] # 收件人邮箱,一次可以发送给多个邮箱
html_message = "<h2>%s,欢迎注册本博客,恭喜您成为本博客用户</h2>请点击以下链接激活账号<a href='http://127.0.0.1:8000/user/active/%s'>http://127.0.0.1:8000/user/active/%s</a>" % (
user.username, token, token)
# send_mail阻塞执行,等到邮件发送了,页面才能跳转到index,可以使用celery异步执行,
send_mail(subject, message, send, recipient_list=recipient, html_message=html_message)
time.sleep(1)
即相比较任务发出者一端,tasks.py文件中增加了10-13行之间的代码,接着创建虚拟环境,mkvirtualenv django_01,进入虚拟环境 workon django_01,在虚拟环境中切换到项目目录下,执行 pip install -r requirements.txt 安装依赖,执行celery -A celery_tasks.tasks worker -l info