隐藏页面特效

django中使用celery异步发送邮件

1|0申请163网易发送邮件权限




2|0在django中settings配置文件


#配置邮件服务器 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 指定邮件后端 EMAIL_HOST = 'smtp.163.com' # 发邮件主机 EMAIL_PORT = 25 # 发邮件端口 EMAIL_HOST_USER = '填你自己的邮箱' # 授权的邮箱 EMAIL_HOST_PASSWORD = '授权时候获得的那个密码' # 邮箱授权时获得的密码,非注册登录密码 EMAIL_FROM = '随便填一点<填你的邮箱>' # 发件人抬头 EMAIL_USE_TLS = False # 是否使用安全协议传输

3|0创建celery异步任务


  • 在celery_tasks/main.py主入口
#Celery的入口 from celery import Celery # 把celery和django进行组合,必须让celery能识别和加载django的配置文件以及django的类库 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings.dev') # 对django框架执行初始化 import django django.setup() #创建Celery实例 生产者 celery_app = Celery('meiduo') #加载配置 celery_app.config_from_object('celery_tasks.config') # 注册任务 celery_app.autodiscover_tasks(['celery_tasks.email']) #有多个任务可写多个
  • 在celery_tasks/config.py配置文件中
# Celery配置文件 # 指定中间人、消息队列、任务队列、容器,使用redis broker_url = "redis://192.168.204.128/10" # 结果队列的链接地址 celery_result_backend = 'redis://127.0.0.1:6379/14'
  • 在celery_tasks/email/tasks.py
from django.core.mail import send_mail from django.conf import settings from celery_tasks.main import celery_app @celery_app.task(name='send_verify_email', base=Mytask) #name 起别名 #base的值为监听的那个类 def send_verify_email(to_email,verify_url): """定义发送邮件的任务""" # send_mail('标题','普通邮件的正文','发件人','收件人列表','富文本邮件正文') subject = '填主题' #message = '普通文本' #html_message是发送带html样式信息 html_message = '<p>尊敬的用户您好!</p>' \ '<p>感谢您使用xxxx。</p>' \ '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \ '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url) send_mail(subject,'',settings.EMAIL_FROM,[to_email],html_message=html_message)

4|0celery异步执行任务不全都是成功的,所以我们需要监听任务


  • 在celery_tasks/email/tasks.py 加上下面的代码
from celery.task import Task # 监听整个任务的钩子 class Mytask(Task): def on_success(self, retval, task_id, args, kwargs): print('task success 11111') return super(Mytask, self).on_success(retval, task_id, args, kwargs) def on_failure(self, exc, task_id, args, kwargs, einfo): print('task failed') # 可以记录到程序中或者任务队列中,让celery尝试重新执行 return super(Mytask, self).on_failure(exc, task_id, args, kwargs, einfo) def after_return(self, status, retval, task_id, args, kwargs, einfo): print('this is after return') return super(Mytask, self).after_return(status, retval, task_id, args, kwargs, einfo) def on_retry(self, exc, task_id, args, kwargs, einfo): print('this is retry') return super(Mytask,self).on_retry(exc, task_id, args, kwargs, einfo)
  • 在django视图views文件中调用
#创建日志输出器 logger = logging.getLogger('django') class EmailView(LoginRequiredJSONMixin,View): """添加邮箱""" def put(self,request): #接收参数 json_str = request.body.decode() json_dict = json.loads(json_str) email = json_dict.get('email') #校验参数 if not email: return HttpResponseForbidden('缺少email参数') if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email): return HttpResponseForbidden('参数email有误') # 将用户传入的邮箱保存到用户数据库的email字段中 try: request.user.email = email request.user.save() except Exception as e: logger.error(e) return JsonResponse({'code':RETCODE.DBERR,'errmsg':'添加邮箱失败'}) #发送邮箱验证邮件 这里是调用邮件的 verify_url = 'www.baidu.com' send_verify_email.delay(email,verify_url) #一定要加delay!!!! return JsonResponse({'code':RETCODE.OK,'errmsg':'OK'})
  • 启动
终端输入命令启动celerycelery -A celery_tasks.main worker -l info -P eventlet
  • 发送邮件
网页中点击你发送邮件的那个按钮,测试,看后台输出
  • 遇到的问题
1.仔细看send_mail(subject,'',settings.EMAIL_FROM,[to_email],html_message=html_message)这边的传参位置,原码中send_mail接收的参数html_message在最后一个,如果你这边调用的时候,不是关键字传参的话,发送出去的短信对方接收到将不会展现文本内容! 2.启动celery后可能会报错,这边可以看我博客另外一篇讲celery启动后发送邮件报错的解决办法。目前照上面我的代码调用的话,是可以正常成功的接发收邮件的。 3.视图中调用邮件函数的时候,一定记得要加delay!一定!一定!一定!

__EOF__

本文作者404 Not Found
本文链接https://www.cnblogs.com/weiweivip666/p/13583561.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
posted @   我在路上回头看  阅读(586)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示