flask項(xiàng)目下,郵件的異步發(fā)送

web項(xiàng)目郵件的發(fā)送必不可少掂器,這里推薦兩種在flask下的郵件的異步發(fā)送亚皂。

1:使用thread模塊:

優(yōu)點(diǎn):配置方便,代碼簡(jiǎn)單国瓮。
缺點(diǎn):flask項(xiàng)目部署在uswgi下的時(shí)候灭必,因?yàn)閜ythongil的原因會(huì)失效,造成郵件無(wú)法發(fā)送乃摹。
email.py禁漓,主要用于定義郵件

#文件:email.py
from flask_mail import Message, Mail
from flask import render_template
from exts import mail
from flask import current_app
from threading import Thread

#to 接收方
#sender 發(fā)送方
#subject 主題
#template 內(nèi)容
def send_async_mail(to,subject,template,**kwargs):#發(fā)送郵件
    msg = Message(current_app.config["FLASKY_MAIL_SUBJECT_PREFIX"] + subject,sender = current_app.config['FLASKY_MAIL_SENDER'],recipients=[to])
    # msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    mail.send(msg)

def send_async_email(app,msg):
    with app.app_context():
        for i in range(0,5):
            try:
                mail.send(msg)
                return True
            except Exception as e:
                i =+ 1
                print("err is {} .index is {}\n".format(e,i))
    return False

def send_email(to,subject,template,**kwargs):#發(fā)送郵件
    try:
        msg = Message(current_app.config["FLASKY_MAIL_SUBJECT_PREFIX"] + subject,sender = current_app.config['FLASKY_MAIL_SENDER'],recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        app = current_app._get_current_object()    #這一句非常重要,因?yàn)閒lask的上下文特性孵睬,如果沒(méi)有這一句會(huì)造成郵件無(wú)法發(fā)送
        thr = Thread(target=send_async_email,args= [app,msg])
        thr.start()
        return thr
    except Exception as e:
        print(e)

2:使用celery:

優(yōu)點(diǎn):flask項(xiàng)目部署在uswgi下的時(shí)候播歼,郵件仍可發(fā)送,代碼簡(jiǎn)單掰读。秘狞。
缺點(diǎn):配置相對(duì)復(fù)雜,

一.python層面工作

tasks.py磷支,主要用于定義郵件

#tasks.py
from celery import Celery
from flask_mail import Message,Mail
from flask import Flask,render_template
import config

mail = Mail()
app = Flask(__name__)
app.config.from_object(config)
mail.init_app(app)

# 運(yùn)行本文件:
# 在windows操作系統(tǒng)上:
# celery -A tasks.celery worker --pool=solo --loglevel=info
# 在類*nix操作系統(tǒng)上:
# celery -A tasks.celery worker --loglevel=info

def make_celery(app):
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],
                    broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task
    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery

celery = make_celery(app)

@celery.task
def send_email(to,subject,template,**kwargs):#發(fā)送郵件
    msg = Message(app.config["FLASKY_MAIL_SUBJECT_PREFIX"] + subject,sender = app.config['FLASKY_MAIL_SENDER'],recipients=[to])
    msg.html = render_template(template + '.html', **kwargs)
    mail.send(msg)

view層的調(diào)用

#view.py
......
from tasks import send_email
......
send_email.delay(email,"請(qǐng)查收您的驗(yàn)證碼","auth/email/confirm",email = email,captcha = captcha)
......
二.服務(wù)器配置

安裝redis

sudo apt-get install redis-server   #安裝
sudo apt-get purge --auto-remove redis-server #完全卸載
ps aux|grep redis  #啟動(dòng):redis安裝后谒撼,默認(rèn)會(huì)自動(dòng)啟動(dòng),可以通過(guò)以下命令查看:
sudo service redis-server start # 如果想自己手動(dòng)啟動(dòng)雾狈,可以通過(guò)以下命令進(jìn)行啟動(dòng):
sudo service redis-server stop # 停止

安裝celery

pip install celery #安裝
celery -A tasks.celery worker --loglevel=info    #啟動(dòng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廓潜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子善榛,更是在濱河造成了極大的恐慌辩蛋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移盆,死亡現(xiàn)場(chǎng)離奇詭異悼院,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)咒循,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門据途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人叙甸,你說(shuō)我怎么就攤上這事颖医。” “怎么了裆蒸?”我有些...
    開(kāi)封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熔萧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佛致,這世上最難降的妖魔是什么贮缕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮俺榆,結(jié)果婚禮上感昼,老公的妹妹穿的比我還像新娘。我一直安慰自己肋演,他們只是感情好抑诸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爹殊,像睡著了一般蜕乡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗夸,一...
    開(kāi)封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天层玲,我揣著相機(jī)與錄音,去河邊找鬼反症。 笑死辛块,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铅碍。 我是一名探鬼主播润绵,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胞谈!你這毒婦竟也來(lái)了尘盼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烦绳,失蹤者是張志新(化名)和其女友劉穎卿捎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體径密,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡午阵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了享扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底桂。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惧眠,靈堂內(nèi)的尸體忽然破棺而出戚啥,到底是詐尸還是另有隱情,我是刑警寧澤锉试,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響呆盖,放射性物質(zhì)發(fā)生泄漏拖云。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一应又、第九天 我趴在偏房一處隱蔽的房頂上張望宙项。 院中可真熱鬧,春花似錦株扛、人聲如沸尤筐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盆繁。三九已至,卻和暖如春旬蟋,著一層夾襖步出監(jiān)牢的瞬間油昂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工倾贰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冕碟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓匆浙,卻偏偏與公主長(zhǎng)得像安寺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子首尼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容