使用redis+celery异步发送邮件

本文介绍了如何在CentOS7环境下,利用Django、Redis和Celery搭建异步发送邮件的系统。详细步骤包括安装相关库、配置Redis、创建tasks.py文件、设置Celery和Django的集成,以及启动Celery worker进行任务消费。参考了多个博客资源进行操作。

环境:centos7+django2+redis+celery

 

一、首先安装redis和celery.

pip install celery

pip intsall redis

 pip install django-redis
 

  • 启动service redis start | systemctl start redis
  • 编辑redis配置文件 vim /etc/redis.conf
  • 参看redis进程  ps -aux | grep redis
  • 密码修改方法:vim .etc/redis.conf 找到  #requirepass foobared 这句。后面添加    requirepass yoursecret#你的密码。重启rsystemctl restart redis。当然也可以不设置

更多redis配置,请通往官方文档学习。中文网址http://www.redis.cn/。英文官网https://redis.io/

二、在创建的appa目录文件下面创建一个tasks.py.【一定要是这个名字】。

from __future__ import absolute_import, unicode_literals
from celery import shared_task
from django.core.mail import send_mail
import logging

logger = logging.getLogger(__name__)


@shared_task
def celery_send_email(subject, message, from_email, recipient_list, **kwrags):
    try:
        # 使用celery并发处理邮件发送的任务
        logger.info("\n开始发送邮件")
        send_mail(subject, message, from_email, recipient_list, **kwrags)
        logger.info("邮件发送成功")
        return 'success!'
    except Exception as e:
        logger.error("邮件发送失败: {}".format(e))


注意:第一行最好是:from __future__ import absolute_import, unicode_literals.不然容易出错。

三、在setting.py同目录中添加celery.py文件。

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# 为celery程序设置DJANGO_SETTINGS_MODULE环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名字.settings')

app = Celery('project_name')

# 从Django的设置文件中导入CELERY设置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 从所有已注册的app中加载任务模块
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

四、找到setting.py同目录中的__init__.py文件

from __future__ import absolute_import, unicode_literals
# 这将保证celery app总能在django应用启动时启动
from .celery import app as celery_app


__all__ = ['celery_app']

五、打开setting.py文件添加

#扣扣邮箱验证
# 邮件配置
EMAIL_USE_SSL = True

EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = 'xxx@qq.com' # 你的 QQ 账号
EMAIL_HOST_PASSWORD = '' #你的授权密码。具体在设置--账号里面,一定要打开POP3服务。
# 默认邮件
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER



#celery配置
CELERY_BROKER_URL = 'redis://localhost:6379' #celery中间人 redis://redis服务所在的ip地址:端口/数据库号
CELERY_RESULT_BACKEND = 'redis://localhost:6379'#celery结果返回,可用于跟踪结果
#celery内容等消息的格式设置
#: Only add pickle to this list if your broker is secured
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
#celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = 'Asia/Shanghai'

六、在views.py文件里添加视图文件


from django.http import HttpResponse
from your_product import setting
from celery_test.tasks import celery_send_email<br><br>
def add_task_to_celery(request):
    email = ''#需要发送邮件的邮箱地址
    celery_send_email.delay(u'邮件主题', '邮箱内容', setting.DEFAULT_FROM_EMAIL, [email])
    return HttpResponse('hello world')

七、在url.py文件中添加发送邮箱的路由

from django.contrib import admin
from django.urls import path
from your_urls import views  #导入你的视图文件路径
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('send_email/', views.add_task_to_celery, name='send_email'),
]

八、在manage.py同级目录执行如下命令, 启动celery的worker进程(主要用于消费或执行任务)

celery -A your_projectName  worker --loglevel=info

参考博客:

https://www.cnblogs.com/wumingxiaoyao/p/8515075.html

https://blog.youkuaiyun.com/qq_32868151/article/details/78937719

https://blog.youkuaiyun.com/xiaohuoche175/article/details/81480576

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值