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异步邮件
背景
使用模块:Celery + Redis / Celery + RabbitMQ
参考文档:
Celery:https://pypi.python.org/pypi/celery/
Redis:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis
RebbitMQ:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq
Celery工作原理:
- Celery分为三个角色:发送者,中间人,执行者。
- 发送者发送任务给中间人,而执行者一直监听着中间人的任务,如果有任务就去执行。
- django程序本身就是发送者,稍加修改后的代码就可以作为执行者使用,只是二者都需要单独运行项目。
- celery中的中间人是需要由第三方提供服务,可以使用Celery或者Redis。
- 发送者、中间人、执行者都可以在同一台电脑上运行,也可以在不同电脑上运行。
使用
安装环境(执行者端、发送者端的Python环境需要一致,否则会报错)
1
pip install celery redis pymysql django-tinymce
在项目目录下单独新建一个celery_tasks的包,当然这个名字随自己而定,然后在包中新建文件tasks
1
touch tasks.py
在发送者端(程序端)编写发送者内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21from 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
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)在执行者端编写执行者内容
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
31from 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
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)启动执行者命令
1
2
3
4
5该命令必须在django项目的根目录下执行
celery_tasks.tasks:是任务所在的模块名
-l info:标识执行者打印命令
worker:指出了他是一个执行者
celery -A celery_tasks.tasks worker -l info其中中间者命令
1
2就是启动一个redis-server就行了
sudo /usr/local/bin/redis-server /etc/redis/redis.conf修改发送邮件的部分,将其使用celery装饰过的方法运行
1
2
3经过celery的task装饰后,就可以调用delay方法,用户将任务发给中间人(redis)
原函数所有的参数都写在delay方法中
send_active_register_email.delay(new_user.username, email, token)