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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM