flask入門與發送郵件與QQ郵箱


前言: 快兩個月沒寫博客了, 原因是懶了, 沒有最初寫博客那種看到閱讀量上漲, 別人給自己文章點贊后的開心. 心態也發生了不少變化. 有機會再來寫寫. 前兩個月我去廈門某公司實習, 本着去廈門玩一玩還有先了解下公司情況, 11月底就去廈門了. 這兩個月最大的變化是我自己變得更會玩了, 蠻開心的. 公司2月13號才放假員工過春節, 我就先請假回家了, 2月9號就到家了. 這幾天在家除了吃和睡, 也隨便看看flask, 感覺flask真的是很簡單呀. 我看的是下面這本書, 我才看一兩天, 書寫得很好, 當然有一很坑. 接下來我會寫一些文章來總結我學flask的過程, 因為我已經大致學過django了, flask與django大致是一樣的, 所以我只挑我感得有意思有坑的寫, 建議小白還是看書學比較系統.

 

一、功能講解

因為是初學flask, 講一下我現在的小項目的功能.當你訪問網址時(請忽略192.168.90.63:30102), 這是我用公司內部鏡像暴露端口出來給我訪問的. 你沒有VPN, 也是訪問不了的. 你訪問這個界面時, 你被當成了陌生人, 被要求輸入名字. 

OK, 接下來我輸入zcl, 點擊提交按鈕后, 出現如下圖. 顯示(Happy to see you again), 這是因為點擊提交按鈕后會把你的名字存到數據庫, zcl用戶之前已經存到數據庫了, 當你再次輸入zcl時, 出顯示Happy to see you again.

那如果我輸入一個數據庫中不存在的用戶, 會發生什么情況呢? 比如我輸入big SB

下面是代碼, 看不懂也沒關系. 我來講, 當你輸入big SB, 再點擊提交, 后台會根據用戶名big SB去數據庫查這個用戶. 很顯然, 查不到, 所以下面的第5行代碼user為None。既然數據庫中沒有big SB這個用戶, 那就來創建這個用戶, 再保存到數據庫中唄. 

但我還不滿足, 我還想實現一個發郵件的功能. 比如項目的管理員用戶是:zcl, 當有新用戶產生(類似big SB用戶)時, 會必送一個郵件給zcl用戶. 在這實踐過程中, 發現這功能有坑, 故下面詳細講下flask發郵件這個功能

@app.route('/', methods=['GET', 'POST']) def index(): form = NameForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.name.data).first() if user is None: user = User(username=form.name.data) db.session.add(user) db.session.commit() session['known'] = False if app.config['FLASKY_ADMIN']: send_email(app.config['FLASKY_ADMIN'], 'New User', 'mail/new_user', user=user) else: session['known'] = True session['name'] = form.name.data return redirect(url_for('index')) return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))

 

二、發送郵件效果

先來看效果, 我實現自己給自己的郵箱帳號發送一份郵件, 來說明增加的是哪個新用戶.

 

三、具體實現

1、導入第三方庫

from flask_mail import Mail, Message

Flask-Mail 連接到簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)服務器,並把郵件交給這個服務器發送。如果不進行配置,Flask-Mail 會連接 localhost 上的端口 25,無需驗證即可發送電子郵件。表 6-1 列出了可用來設置 SMTP 服務器的配置。

在開發過程中,如果連接到外部 SMTP 服務器,則可能更方便.

 

2、寫配置文件

你可能看不懂這此配置文件, 沒關系, 我下面會講.

具體實現時, app.config['FLASKY_MAIL_SENDER'] = '1274828542@qq.com'會發送郵件給管理員app.config['FLASKY_ADMIN'] = '1274828542@qq.com'

第9行與發送郵件主題相關. 既然發送者要發送郵件, 那他肯定需要登錄郵箱呀! 所以就必然需要密碼.故app.config['MAIL_PASSWORD'] = 'kjhymbxowmey****'是密碼(為了避免我的密碼泄露, 不顯示后面4位數).

1~3行為什么是465, smtp.qq.com, True, 下面會講. 

1 app.config['MAIL_SERVER'] = 'smtp.qq.com'  # this is email server
2 app.config['MAIL_PORT'] = 465  # this is the port of email server
3 app.config['MAIL_USE_SSL'] = True 4 app.config['MAIL_USERNAME'] = '1274828542@qq.com'
5 # app.config['MAIL_PASSWORD'] = 'abcdefg' # 為了避免我的密碼泄露, 這不是我郵箱的真正密碼
6 app.config['MAIL_PASSWORD'] = 'kjhymbxowmey****'  # this is email password(這是什么?下面會講)
7 app.config['FLASKY_MAIL_SENDER'] = '1274828542@qq.com'  # this is sender
8 app.config['FLASKY_ADMIN'] = '1274828542@qq.com'  # this is the email of admin
9 app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'  # this is subject of email we will send

如上, 我想發郵件到我的QQ郵箱. 便調用以下方法.

def send_email(to, subject, template, **kwargs): msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject, sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to]) msg.body = render_template(template + '.txt', **kwargs) msg.html = render_template(template + '.html', **kwargs) mail.send(msg)

3、發送郵件

            if app.config['FLASKY_ADMIN']: send_email(app.config['FLASKY_ADMIN'], 'New User', 'mail/new_user', user=user)

 

四、坑總結與配置講解

1、郵箱沒有開啟SMTP服務

最開始我的郵件是發不出去的. app.config['MAIL_PORT'] = 465也是按書上來的, 我只知道是一個端口. 郵件發不出去, 怎么辦. 看了網上一些文章, 發現我的QQ郵箱可能沒有開啟SMTP服務. 哇擦,這也太坑了吧. 登入QQ郵箱, 設置->帳戶.

如果, 我沒有開啟, 下圖是我開啟后的截圖, 我之前是沒有開啟的. 

 開啟時還需要發短信才給通過驗證, 通過后就可以開啟了.通過后會顯示如下授權碼, 請務必把你QQ郵箱的授權碼記下來!!!

 

 

2、配置講解

密碼錯誤也是一個坑. 在講這個坑之前, 先來講下郵箱配置的1~3行為什么是465, smtp.qq.com, True.

進入下圖紅色方框內的鏈接:

重點來了:

1 app.config['MAIL_SERVER'] = 'smtp.qq.com'  # this is email server
2 app.config['MAIL_PORT'] = 465  # this is the port of email server
3 app.config['MAIL_USE_SSL'] = True

使用SSL, 所以第3行為True; 發送郵件的服務器是smtp.qq.com, 所以第一行也是smtp.qq.com; 當然第二行你寫587我想也是可以的(沒試過)

 

3、密碼錯誤

因為我的郵箱密碼是abcdefg; 所以最開始是這樣寫的, 但是依舊發不出郵件. 太TM傷心了.

app.config['MAIL_PASSWORD'] = 'abcdefg'

出現了一個錯誤:

關於發郵件報錯535 Error:authentication failed

這時讓我不得不懷疑, 這密碼是不是錯誤了, 但不可能呀, 我密碼就是abcdefg. 這就陷入死胡同了

直到看到這篇文章: http://blog.csdn.net/huochen1994/article/details/51282093

調用163郵箱服務器來發送郵件,我們需要開啟POP3/SMTP服務,這時163郵件會讓我們設置客戶端授權碼,這個授權碼替代上面代碼部分的passwd即可成功發送郵件

於是這將密碼更改如下(開啟SMTP服務時, 我已經讓你記下授權碼了!!):

app.config['MAIL_PASSWORD'] = 'kjhymbxowmey****'  # this is email password

 

收到郵件的那一刻, 開心是真的.

最近感覺, 在一個城市工作兩三個月, 然后再換一個城市工作兩三個月. 會很好玩.

轉發請注明出處: http://www.cnblogs.com/0zcl/p/8443544.html , 不然我也拿你沒辦法~_~


免責聲明!

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



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