zoukankan      html  css  js  c++  java
  • Django+celery+rabbitmq实现邮件发送

    一.环境

    1.pip包

    amqp==2.4.2

    anyjson==0.3.3

    billiard==3.6.0.0

    celery==4.3.0

    Django==2.2

    dnspython==1.16.0

    eventlet==0.24.1

    greenlet==0.4.15

    kombu==4.5.0

    monotonic==1.5

    pytz==2019.1

    redis==3.2.1

    six==1.12.0

    sqlparse==0.3.0

    vine==5.0.0a1

    2.rabbmitMQ

    下载地址 https://www.rabbitmq.com/install-windows.html

     
    图1.1

    如图1.1,安装rabbitmq之前需要安装Erlang,需要确认你选的rabbitmq 所支持的Erlang版本,

     
    图1.2

    根据图1.2 选择安装的支持的Erlang,

    下载地址 如图1.3  http://www.erlang.org/downloads

     
    图1.3

    安装直接点下一步------

    Rabbmq安装好后,点击图1.3 红色框的内容

     
    图1.4

    出现黑色框框 图1.5

     
    图1.5

    可视化插件方式启动rabbitmq

    命令:rabbitmq-plugins enable rabbitmq_management

    如下图1.6

     
    图1.6

    启动成功标志:

    浏览器打开 http://127.0.0.1:15672

    账户密码默认都是guest

    如图1.7

     
    图1.7

    能打开就行

    二.Django配置celery

    如图2.1

     
    图2.1

    红色部分为要添加和修改的内容

    __init__.py

    ---------------------------------------------------------------------#这个是我加的分隔符,里面才是代码

    from __future__import absolute_import, unicode_literals
    
    # This will make sure the app is always imported when
    
    # Django starts so that shared_task will use this app.
    
    from Celery_pro.celeryimport appas celery_app
    
    __all__ = ('celery_app',)

    ---------------------------------------------------------------------

    celery.py

    ---------------------------------------------------------------------

    from __future__import absolute_import, unicode_literals
    
    import os
    
    from celery import Celery
    
    #注意下面的  Celery_pro.settings 是我的项目名称.settings,你的项目名称就写你的
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Celery_pro.settings')
    
    #这下面的也是
    
    app = Celery('Celery_pro',backend="celery.backends.amqp:AMQPBackend") 
    app.config_from_object('django.conf:settings',namespace='CELERY') app.autodiscover_tasks( lambda: [n.name for n in apps.get_app_configs()] ) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))

    ---------------------------------------------------------------------

    在settings.py中 添加设置如下内容

    ---------------------------------------------------------------------

    #存储任务队列执行后的结果的BACKEND
    
    CELERY_RESULT_BACKEND ='redis://*.*.*.*' #我的服务器IP不能暴露,你也可以写本地的redis,或者amqp://ip
    
    #充当任务队列的中介者的地址也就是--->rabbmq
    
    CELERY_BROKER_URL ='amqp://127.0.0.1//'
    
    #放回结果的格式
    
    CELERY_RESULT_SERIALIZER ='json'

    ---------------------------------------------------------------------

    2.2 写相关的视图函数,测试

    创建一个app名称为app01,在app01目录下创建tasks.py

    ----------------------------------------------------------------------

    from __future__import absolute_import, unicode_literals
    
    from celeryimport shared_task
    
    from django.core.mailimport send_mail
    
    from Celery_proimport settings
    
    #反转字符串
    
    @shared_task
    
    def reverse(string):
    
      return string[::-1]
    
    #异步实现发邮件
    
    @shared_task
    
    def SendEmail(sub,msg,to_email):
    
      try:
    
        send_mail(
    
           sub,
    
                msg,
    
                settings.EMAIL_HOST_USER,
    
                to_email,
    
                fail_silently=False
    
            )
    
    except Exception :
    
    return False
    
        return True

    ----------------------------------------------------------------------

    在视图函数中代码如下

    ----------------------------------------------------------------------

    from django.httpimport JsonResponse
    
    from django.shortcutsimport render
    
    from Celery_proimport settings
    
    from .tasksimport *
    
    # Create your views here.
    
    def index(request):
    
    res=reverse.delay('hello world')
    
    print(res.get())
    
    return JsonResponse({"status:":"sccessful","task_id":res.task_id})
    
    def sms(request):
    
    res=SendEmail.delay('Hello world','give you msg',['求个妹子(填写你要发送给谁)@qq.com'])
    
    res=res.get()
    
    print(res)
    
    if res:
    
    return JsonResponse({"status":"success"})
    
    else:
    
    return JsonResponse({"status":"Flase"})

    ----------------------------------------------------------------------

    邮件配置

    我的使用QQ邮箱测试的,如图

     
    图2.3
     
    图2.4

    赋值授权码后,记录好

    在settings.py文件添加如下

    ----------------------------------------------------------------------

    STATIC_URL='/static/'
    
    EMAIL_BACKEND ='django.core.mail.backends.smtp.EmailBackend' #固定写法
    
    EMAIL_HOST ='smtp.qq.com' #SMTP地址
    
    EMAIL_PORT =25 #SMTP端口
    
    EMAIL_HOST_USER ='给你看了,你又不做我女盆友' #发送邮件的邮箱
    
    EMAIL_HOST_PASSWORD ='我的授权码不能给你看'  # 授权码
    
    EMAIL_SUBJECT_PREFIX ='[我想要个女票] ' #为邮件Subject-line前缀,默认是'[django]'
    
    EMAIL_USE_TLS =True  # 与SMTP服务器通信时,是否启动TLS链接(安全链接)默认false

    ----------------------------------------------------------------------

    好了,基本准备完毕

    先启动celery

    celery -A Celery_pro worker -l info -P eventlet

     
    图2.5
     
    图2.6

    启动django,注意,只能在命令行启动,点pycharm的启动键会报错,这是bug我还没解决

    python manage.py runserver

     
    图2.7

    看下路由

     
    图2.8

    我直接访问http://127.0.0.1:8000 就是反转视图函数的字符串,hello world

    OK,搞起

     
    图2.9
     
    图2.10

    好的,sms的视图搞起

     
    图2.11
     
    图2.12
     
    图2.13

    注意对比图2.12 和2.13的时间,表示 劳资没有骗你们 ,成功实现发邮件




    参考:https://jingyan.baidu.com/article/f3e34a12a356c9f5ea653545.html

    转自:https://www.jianshu.com/p/c1515248e585

  • 相关阅读:
    C#项目完成PDF文件增加印章操作可指定印章位置
    webBrowser1加载本地文件
    转义示例
    动态调用WebService服务
    C#调用WSDL接口
    VS 控件命名规范
    正则判断是否是数字
    怎么让 arcgis 4 弹出窗 漂亮 支持多个弹出窗 支持vue或者react
    关于arcgis 会主动添加https头的问题
    arcgis 4 整合 d3 实现动画
  • 原文地址:https://www.cnblogs.com/fclbky/p/11177327.html
Copyright © 2011-2022 走看看