中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

在Python的Flask框架下收發(fā)電子郵件的教程
來源:易賢網(wǎng) 閱讀:6045 次 日期:2015-04-24 10:04:49
溫馨提示:易賢網(wǎng)小編為您整理了“在Python的Flask框架下收發(fā)電子郵件的教程”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了在Python的Flask框架下收發(fā)電子郵件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以參考下

簡述

在大多數(shù)此類教程中都會不遺余力的介紹如何使用數(shù)據(jù)庫。今天我們對數(shù)據(jù)庫暫且不表,而是來關(guān)注另一個在web應(yīng)用中很重要的特性:如何推送郵件給用戶。

在某個輕量級應(yīng)用中我們可能會添加一個如下的郵件服務(wù)功能:當用戶有了新的粉絲后,我們發(fā)送一封郵件通知用戶。有很多方法可以實現(xiàn)這個特性,而我們希望提供出一種可復(fù)用的通用框架來處理。

Flask-Mail介紹

對于我們來說是幸運的,現(xiàn)在已經(jīng)有很多外部插件來處理郵件,雖說不能百分百按照我們的想法去處理,但已經(jīng)相當接近了。

在虛擬環(huán)境中安裝 Flask-Mail是相當簡單的。Windows以外的用戶可以利用以下命令來安裝:

flask/bin/pip install flask-mail

Windows用戶的安裝稍有不同,因為Flask-Mail所使用的一些模塊不能再Windows系統(tǒng)上運行,你可以使用以下命令:

flask\Scripts\pip install --no-deps lamson chardet flask-mail

配置:

回想一下前文中單元測試部分的案例,我們通過添加配置支持了一個這樣的功能:當應(yīng)用的某個版本測試出錯時可以郵件通知我們。從這個例子就可以看出如何配置使用郵件支持。

再次提醒大家,我們需要設(shè)置兩個方面的內(nèi)容:

郵件服務(wù)器信息

用戶郵箱地址

如下正是前文中所用到的配置

# email server

MAIL_SERVER = 'your.mailserver.com'

MAIL_PORT = 25

MAIL_USE_TLS = False

MAIL_USE_SSL = False

MAIL_USERNAME = 'you'

MAIL_PASSWORD = 'your-password'

# administrator list

ADMINS = ['you@example.com']

其中并沒有設(shè)置切實可用的郵件服務(wù)器和郵箱?,F(xiàn)在我們通過一個例子來看如何使用gmail郵箱賬戶來發(fā)送郵件:

# email server

MAIL_SERVER = 'smtp.googlemail.com'

MAIL_PORT = 465

MAIL_USE_TLS = False

MAIL_USE_SSL = True

MAIL_USERNAME = 'your-gmail-username'

MAIL_PASSWORD = 'your-gmail-password'

# administrator list

ADMINS = ['your-gmail-username@gmail.com']

另外我們也可以初始化一個Mail對象來連接SMTP郵件服務(wù)器,發(fā)送郵件:

from flask.ext.mail import Mail

mail = Mail(app)

發(fā)個郵件試試!

為了了解flask-mail如何工作的,我們可以從命令行發(fā)一封郵件看看。進入python shell并執(zhí)行如下的腳本:

>>> from flask.ext.mail import Message

>>> from app import mail

>>> from config import ADMINS

>>> msg = Message('test subject', sender = ADMINS[0], recipients = ADMINS)

>>> msg.body = 'text body'

>>> msg.html = '<b>HTML</b> body'

>>> mail.send(msg)

上面這段代碼會根據(jù)inconfig.py中配置的郵箱地址列表,以首個郵箱作為發(fā)件人給所有郵箱發(fā)送一封郵件。郵件內(nèi)容會以文本和html兩種格式呈現(xiàn),而你能看到哪種格式取決于你的郵件客戶端。

多么簡單小巧!你完全可以現(xiàn)在就把它集成到你的應(yīng)用中。

郵件框架

我們現(xiàn)在可以編寫一個幫助函數(shù)來發(fā)送郵件。這是以上測試中一個通用版的測試。我們把這個函數(shù)放進一個新的原文件中用作郵件支持(fileapp/emails.py):

from flask.ext.mail import Message

from app import mail

def send_email(subject, sender, recipients, text_body, html_body):

msg = Message(subject, sender, recipients)

msg.body = text_body

msg.html = html_body

mail.send(msg)

Flask-Mail的郵件支持超出了我們目前的使用范圍,像密件抄送和附件的功能并不會在此應(yīng)用中得以使用。

Follower 提醒

現(xiàn)在,我們已經(jīng)有了發(fā)郵件的基本框架,我們可以寫發(fā)送follower提醒的函數(shù)了 (fileapp/emails.py):

from flask import render_template

from config import ADMINS

def follower_notification(followed, follower):

send_email("[microblog] %s is now following you!" % follower.nickname,

ADMINS[0],

[followed.email],

render_template("follower_email.txt",

user = followed, follower = follower),

render_template("follower_email.html",

user = followed, follower = follower))

你在這里找到任何驚喜了嗎?我們的老朋友render_template函數(shù)有一次出現(xiàn)了。

如果你還記得,我們使用這個函數(shù)在views渲染模版. 就像在views里寫html不好一樣,使用郵件模版是理想的選擇。我們要可能的將邏輯和表現(xiàn)分開,所以email模版也會和其它試圖模版一起放到在模版文件夾里.

所以,我們需要為follower提醒郵件寫純文本和網(wǎng)頁版的郵件模版,下面這個是純文本的版本 (fileapp/templates/follower_email.txt):

Dear {{user.nickname}},

{{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}'s profile page:

{{url_for("user", nickname = follower.nickname, _external = True)}}

Regards,

The microblog admin

下面這個是網(wǎng)頁版的郵件,效果會更好(fileapp/templates/follower_email.html):

<p>Dear {{user.nickname}},</p>

<p><a href="{{url_for("user", nickname = follower.nickname, _external = True)}}">{{follower.nickname}}</a> is now a follower.</p>

<table>

<tr valign="top">

<td><img src="{{follower.avatar(50)}}"></td>

<td>

<a href="{{url_for('user', nickname = follower.nickname, _external = True)}}">{{follower.nickname}}</a><br />

{{follower.about_me}}

</td>

</tr>

</table>

<p>Regards,</p>

<p>The <code>microblog</code> admin</p>

注解:模版中的url_for函數(shù)的 _external = True 參數(shù)的意義.默認情況下,url_for 函數(shù)生成url是相對我們的域名的。例如,url_for("index")函數(shù)返回值是/index, 但是,發(fā)郵件是我們想要這種url,email中是沒有域上下文的,所以,我們必須強制生成帶域名的url,_external argument就是干這個工作的。

最后一步是處理“follow”過程,即觸發(fā)郵件提醒時的視圖函數(shù),(fileapp/views.py):

from emails import follower_notification

@app.route('/follow/<nickname>')

@login_required

def follow(nickname):

user = User.query.filter_by(nickname = nickname).first()

# ...

follower_notification(user, g.user)

return redirect(url_for('user', nickname = nickname))

現(xiàn)在你可以創(chuàng)建兩個用戶(如果還沒有用戶的話)嘗試著用讓一個用戶follow另一個用戶,理解郵件提醒是怎樣工作的。

就是這樣嗎?我們做完了嗎?

我們可能心底里很興奮完成了這項工作并且把郵件提醒功能同未完成列表里刪除。

但是,如果你現(xiàn)在測試下應(yīng)用,你會發(fā)現(xiàn)當你單擊follow鏈接的時候,頁面會2到3秒才會響應(yīng),瀏覽器才會刷新,這在之前是沒有的。

發(fā)生了什么?

問題是,F(xiàn)lask-Mail 使用同步模式發(fā)送電子郵件。 從電子郵件發(fā)送開始,直到電子郵件交付后,給瀏覽器發(fā)回其響應(yīng),在整個過程中,Web服務(wù)器會一直阻塞。如果我們試圖發(fā)送電子郵件到一個服務(wù)器是緩慢的,甚至更糟糕的,暫時處于脫機狀態(tài),你能想象會發(fā)生什么嗎?很不好。

這是一個可怕的限制,發(fā)送電子郵件應(yīng)該是后臺任務(wù)且不會干擾Web服務(wù)器,讓我們看看我們?nèi)绾文軌蚪鉀Q這個問題。

Python中執(zhí)行異步調(diào)用

我們想send_email 函數(shù)發(fā)完郵件后立即返回,需要讓發(fā)郵件移動到后臺進程來異步執(zhí)行。

事實上python已經(jīng)對異步任務(wù)提供了支持,但實際上,還可以用其他的方式,比如線程和多進程模塊也可以實現(xiàn)異步任務(wù)。

每當我們需要發(fā)郵件的時候,啟動一個線程來處理,比啟動一個全新的進程節(jié)省資源。所以,讓我們將mail.send(msg)調(diào)用放到另一個線程中。(fileapp/emails.py):

from threading import Thread

def send_async_email(msg):

mail.send(msg)

def send_email(subject, sender, recipients, text_body, html_body):

msg = Message(subject, sender = sender, recipients = recipients)

msg.body = text_body

msg.html = html_body

thr = threading.Thread(target = send_async_email, args = [msg])

thr.start()

如果你測試‘follow‘函數(shù),現(xiàn)在你會發(fā)現(xiàn)瀏覽器在發(fā)送郵件之前會刷新。

所以,我們已經(jīng)實現(xiàn)了異步發(fā)送,但是,如果未來在別的需要異步功能的地方難道我們還需要在實現(xiàn)一遍嗎?

過程都是一樣的,這樣就會在每一種情況下都有重復(fù)代碼,這樣非常不好。

我們可以通過 decorator改進代碼。使用裝飾器的代碼是這樣的:

from decorators import async

@async

def send_async_email(msg):

mail.send(msg)

def send_email(subject, sender, recipients, text_body, html_body):

msg = Message(subject, sender = sender, recipients = recipients)

msg.body = text_body

msg.html = html_body

send_async_email(msg)

更好了,對不對?

實現(xiàn)這種方式的代碼實際上很簡單,創(chuàng)建一個新源文件(fileapp/decorators.py):

from threading import Thread

def async(f):

def wrapper(*args, **kwargs):

thr = Thread(target = f, args = args, kwargs = kwargs)

thr.start()

return wrapper

現(xiàn)在我們對異步任務(wù)創(chuàng)建了個有用的框架(framework), 我們可以說已經(jīng)完成了!

僅僅作為一個練習,讓我們思考一下為什么這個方法會看上去使用了進程而不是線程。我們并不想每當我們需要發(fā)送一封郵件時就有一個進程被啟動,所以我們能夠使用thePoolclass而不用themultiprocessingmodule。這個類會創(chuàng)建指定數(shù)量的進程(這些都是主進程的子進程),并且這些子進程會通過theapply_asyncmethod送到進程池,等待接受任務(wù)去工作。這可能對于一個繁忙的網(wǎng)站會是一個有趣的途徑,但是我們目前仍將維持現(xiàn)在線程的方式。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:在Python的Flask框架下收發(fā)電子郵件的教程

2026上岸·考公考編培訓(xùn)報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品成人一区二区三区夜夜夜 | 99精品国产一区二区青青牛奶| 中日韩美女免费视频网站在线观看| 亚洲影音先锋| 国产欧美一区二区视频| 久久久久久久尹人综合网亚洲| 国产欧美韩日| 欧美成人午夜| 亚洲新中文字幕| 一区二区三区国产在线观看| 国产精品videosex极品| 亚洲国产日韩欧美在线图片| 农村妇女精品| 欧美在线视屏| 亚洲精品日产精品乱码不卡| 国产精品二区在线| 久久久久久久波多野高潮日日| 在线观看视频一区二区| 欧美激情导航| 欧美专区日韩专区| 亚洲一区在线免费| 亚洲成色999久久网站| 欧美日韩在线三级| 免费精品99久久国产综合精品| 999亚洲国产精| 欧美亚洲在线观看| 久久精品在线视频| 欧美日一区二区在线观看 | 欧美成人精品在线| 免费永久网站黄欧美| 久久视频在线视频| 久久九九免费视频| 亚洲午夜精品福利| 欧美国产日韩一二三区| 国产综合自拍| 一区二区三区欧美在线| 亚洲欧美一级二级三级| 国产精品日韩精品欧美在线 | 在线观看欧美| 免费成人高清视频| 久久网站免费| 久久综合伊人77777| 欧美自拍丝袜亚洲| 久久国产手机看片| 欧美影院久久久| 亚洲综合社区| 欧美一级夜夜爽| 久久久久久一区二区| 久久另类ts人妖一区二区| 香港成人在线视频| 久久中文字幕导航| 久久性天堂网| 欧美性猛交99久久久久99按摩| 国产精品久久久久91| 国产日韩欧美高清| 亚洲午夜久久久| 久久久久久久激情视频| 欧美一区二区黄色| 欧美视频中文字幕在线| 国语自产在线不卡| 日韩午夜激情av| 男同欧美伦乱| 国产精品久久久久9999| 精品999成人| 亚洲香蕉成视频在线观看| 久久国产精彩视频| 国产日韩欧美成人| 国产精品午夜视频| 1000部精品久久久久久久久| 亚洲视频在线观看网站| 老妇喷水一区二区三区| 国产麻豆91精品| 亚洲欧美综合网| 国产精品你懂的在线欣赏| 在线观看的日韩av| 久久久激情视频| 国外成人在线视频| 午夜精品亚洲一区二区三区嫩草| 欧美成人资源| 国产综合网站| 欧美精品在线免费观看| 欧美一级二级三级蜜桃| 在线精品福利| 国产欧美日韩综合一区在线观看| 久久成人久久爱| 99视频精品在线| 亚洲高清资源综合久久精品| 欧美日韩三级| 久久综合色一综合色88| 久久精品国产精品亚洲综合| 一区二区欧美亚洲| 亚洲国产精品高清久久久| 国产精品专区第二| 国产精品视频yy9299一区| 欧美日韩精品免费观看| 欧美日本国产在线| 欧美精品高清视频| 欧美日本网站| 国产精品www994| 欧美日韩免费观看一区三区| 免费h精品视频在线播放| 免费观看在线综合| 欧美日本韩国一区二区三区| 欧美日韩亚洲一区二区三区在线观看| 久久美女性网| 老妇喷水一区二区三区| 欧美jizzhd精品欧美巨大免费| 欧美不卡一区| 国产精品久久| 国产主播一区| 一区二区动漫| 久久婷婷激情| 国产精品高潮呻吟久久av黑人| 国产精品理论片在线观看| 亚洲国产另类精品专区| 亚洲精品在线视频观看| 亚洲午夜在线观看| 老色批av在线精品| 欧美午夜剧场| 好看的日韩av电影| 亚洲免费中文| 欧美日本高清视频| 一区二区三区在线观看视频| 亚洲三级电影全部在线观看高清| 亚洲淫性视频| 欧美日韩一区在线观看视频| 国产伦精品一区二区三区高清版 | 欧美亚洲第一页| 亚洲国产一区在线观看| 午夜免费在线观看精品视频| 免费日韩av电影| 国产视频久久久久| 亚洲区第一页| 久久人人精品| 欧美区在线播放| 国产一区再线| 99国产成+人+综合+亚洲欧美| 欧美一区影院| 欧美色中文字幕| 在线观看日韩av先锋影音电影院| 亚洲国产日韩欧美在线99| 久久裸体视频| 欧美伊人久久久久久久久影院| 亚洲国产精品va在线看黑人| 香蕉乱码成人久久天堂爱免费| 欧美成年人视频| 国产午夜精品视频免费不卡69堂| 日韩亚洲欧美成人一区| 亚洲欧美日韩国产成人| 国产精品久久波多野结衣| 一区二区三区成人| 欧美日韩亚洲系列| 午夜视频在线观看一区二区| 欧美日韩中文另类| 亚洲欧美成人一区二区在线电影 | 久久精品一级爱片| 亚洲国产二区| 国产精品中文字幕欧美| 欧美亚洲在线播放| 红桃视频成人| 国产精品久久九九| 欧美日韩国产bt| 欧美精品在线一区二区| 欧美一级夜夜爽| 亚洲一区二区三区午夜| 红桃视频成人| 国内成人精品一区| 国产精品美女黄网| 欧美日韩成人在线视频| 欧美成人精品1314www| 久久精品欧美日韩| 亚洲特级片在线| 亚洲人成7777| 国产一级久久| 一区二区亚洲精品| 国产精品一区一区三区| 国产精品夜色7777狼人| 欧美三级在线视频| 欧美日韩国产不卡| 欧美精品网站| 欧美精品二区| 欧美精品在线一区二区| 欧美日韩精品综合| 国产精品午夜久久| **性色生活片久久毛片| 亚洲国产你懂的| 一级日韩一区在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 99re这里只有精品6| 亚洲一区在线看| 亚洲欧美另类综合偷拍| 欧美伊人久久大香线蕉综合69| 欧美激情网站在线观看| 精品二区视频| 亚洲永久视频| 欧美成人免费在线视频| 久久gogo国模裸体人体| 久久婷婷久久| 欧美色另类天堂2015| 国产日韩在线看片|