Django实现异步邮件发送

邮件发送

背景

  • 使用模块:django自带的send_mail()方法

使用

  • 项目的setting中添加配置文件

    1
    2
    3
    4
    5
    6
    7
    # 配置django自带的邮件发送系统
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.163.com'
    EMAIL_PORT = 465
    EMAIL_HOST_USER = '88888888@163.com'
    EMAIL_HOST_PASSWORD = '88888888'
    EMAIL_FROM = '888<8888888@163.com>'
  • 使用send_mail方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 给用户发送邮件
    subject = '用户激活邮件'
    # 如果只是发送文字类邮件,则直接填在message中
    message = ''
    sender = '888<88888@163.com>'
    # 收件人必须是一个列表
    recevier = [email]
    # 如果邮件内容是富文本,则将内容填写在html_message中
    html_msg = '<h1>{0},请点击如下链接,以便于激活你的账户</h1>: <br/><div>' \
    '<a href="https://127.0.0.1:8000/user/active/{1}">' \
    'https://127.0.0.1:8000/user/active/{2}</a></div>'.format(new_user.username, token, token)
    send_mail(subject=subject, message=message, from_email=sender, recipient_list=recevier, html_message=html_msg)

Celery异步邮件

背景

使用

  1. 安装环境(执行者端、发送者端的Python环境需要一致,否则会报错)

    1
    pip install celery redis pymysql django-tinymce
  2. 在项目目录下单独新建一个celery_tasks的包,当然这个名字随自己而定,然后在包中新建文件tasks

    1
    touch tasks.py
  3. 在发送者端(程序端)编写发送者内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from celery import Celery
    from django.core.mail import send_mail

    # 创建celery对象,用于装饰任内务
    # 第一个参数是这个celery对象的名称,一般写该任务所在模块的路径
    # broker参数标识中间人(redis)所在的服务器和数据库,格式:redis://IP:port/数据库ID
    app = Celery('celery_tasks.tasks', broker='redis://192.168.85.128:6379/1')

    # 定义任务函数,必须要Celery的task方法进行装饰
    # 切记是task方法,不是tasks
    @app.task
    def send_active_register_email(username, to_email, token):
    '''发送激活邮件的任务'''
    subject = '用户激活邮件'
    message = ''
    sender = '888<888@163.com>'
    recevier = [to_email]
    html_msg = '<h1>{0},请点击如下链接,以便于激活你的账户</h1>: <br/><div>' \
    '<a href="https://127.0.0.1:8000/user/active/{1}">' \
    'https://127.0.0.1:8000/user/active/{2}</a></div>'.format(username, token, token)
    send_mail(subject=subject, message=message, from_email=sender, recipient_list=recevier, html_message=html_msg)
  4. 在执行者端编写执行者内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from celery import Celery
    from django.core.mail import send_mail

    # 执行者不需要重新运行一整个项目,但是它运行的时候依赖于django中的一些配置文件,所以需要初始化django
    # django的配置文件信息在项目文件:wsgi.py文件中
    # 与执行者端内容相比,只多了django环境初始化的部分
    import os
    import django
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Tian.settings')
    # django中初始化方法:setup()
    django.setup()


    # 创建celery对象,用于装饰任内务
    # 第一个参数是这个celery对象的名称,一般写该任务所在模块的路径
    # broker参数标识中间人(redis)所在的服务器和数据库,格式:redis://IP:port/数据库ID
    app = Celery('celery_tasks.tasks', broker='redis://192.168.85.128:6379/1')

    # 定义任务函数,必须要Celery的task方法进行装饰
    # 切记是task方法,不是tasks
    @app.task
    def send_active_register_email(username, to_email, token):
    '''发送激活邮件的任务'''
    subject = '用户激活邮件'
    message = ''
    sender = '888<888@163.com>'
    recevier = [to_email]
    html_msg = '<h1>{0},请点击如下链接,以便于激活你的账户</h1>: <br/><div>' \
    '<a href="https://127.0.0.1:8000/user/active/{1}">' \
    'https://127.0.0.1:8000/user/active/{2}</a></div>'.format(username, token, token)
    send_mail(subject=subject, message=message, from_email=sender, recipient_list=recevier, html_message=html_msg)
  5. 启动执行者命令

    1
    2
    3
    4
    5
    # 该命令必须在django项目的根目录下执行
    # celery_tasks.tasks:是任务所在的模块名
    # -l info:标识执行者打印命令
    # worker:指出了他是一个执行者
    celery -A celery_tasks.tasks worker -l info
  6. 其中中间者命令

    1
    2
    # 就是启动一个redis-server就行了
    sudo /usr/local/bin/redis-server /etc/redis/redis.conf
  7. 修改发送邮件的部分,将其使用celery装饰过的方法运行

    1
    2
    3
    # 经过celery的task装饰后,就可以调用delay方法,用户将任务发给中间人(redis)
    # 原函数所有的参数都写在delay方法中
    send_active_register_email.delay(new_user.username, email, token)