Python-Flask框架(二),flask_mail模塊的應用

前言

flask_mail 是一個可以跨平臺發送郵件的模塊,是一個十分優秀輕便的模塊,但是如果不認真看文檔的話,這簡單優秀的模塊可能會變的十分“笨”(到底誰笨呢),這篇就講一下如何食用以及剛開始容易遇到的坑吧

官方文檔

  1. 英文文檔
  2. 中文文檔

再言一句,官方文檔很重要

如何應用

配置

在這裏插入圖片描述
注意:

  1. SSL/TLS 加密
    MAIL_USE_SSL = True
    MAIL_PORT = 465

  2. STARTTLS 加密
    MAIL_USE_TLS = True
    MAIL_PORT = 587

  3. 163郵箱的服務器不支持STARSSLS加密

  4. qq郵箱的MAIL_PASSWORD並不是qq密碼而是授權碼
    打開qq郵箱->設置->帳號->下面就是 如何獲得授權碼自己百度一下啊!!!

初始化

方法一

from flask import Flask 
from flask_mail import Mail

app = Flask(__name__)
mail = Mail(app)

方法二
flask_mail 也有init_app的方法

from flask import Flask
from flask_mail import Mail

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

初始化完成

發送郵件

在這裏插入圖片描述
更多的細節,翻官方文檔啊
現在的情況是,我打算用qq郵箱給自己發個hello world郵件(授權碼自己配置哦)

from flask import Flask
from flask_mail import Mail, Message
from threading import Thread

app = Flask(__name__)

app.config.update(dict(
    DEBUG=True,
    MAIL_SERVER='smtp.qq.com',
    # MAIL_PORT=587,
    # MAIL_USE_TLS=True,
	# qq郵箱並沒有限制加密方式
    MAIL_PORT=465,
    MAIL_USE_SSL=True,
    MAIL_USERNAME="[email protected]",
    MAIL_PASSWORD="qq郵箱授權碼",
))

mail = Mail(app)


def send_async_email(app, message):
    with app.app_context():
        mail.send(message)


@app.route('/')
@app.route('/mail')
def index():
    try:
        message = Message(subject='hello, world!',
                              sender=('99Kies',app.config["MAIL_USERNAME"]),
                              recipients=['[email protected]'],
                              body='Hello World')
        thread = Thread(target=send_async_email, args=[app, message])
        # 使用多線程
        thread.start()
        return '發送成功!!!'
    except:
        return 'Error!!!'

if __name__ == '__main__':
    app.run()
    
# # 手動,添加到app上下文中
# with app.app_context():
#     message = Message(subject='hello, world!',
#                       sender=('99Kies',app.config["MAIL_USERNAME"]),
#                       recipients=['[email protected]'],
#                       body='Hello World')
#     #
#     thread = Thread(target=send_async_email, args=[app, message])
#     # 使用多線程
#     thread.start()

在這裏插入圖片描述
發送成功!!!需要注意的是 需要將發送郵件和多線程配合使用,這樣主要是爲了當發送郵件時可以進行其他的操作。

配合.env實現

啥概念呢,就是.env裏的內容是可以當成全局變量使用,通過os.getenv()獲得其內容,再將其內容寫入app的配置中即可。
首先安裝python-dotenv庫

pip install python-dotenv

配置文件 .env 內容:

MAIL_SERVER=smtp.qq.com
MAIL_USERNAME="[email protected]"
MAIL_PASSWORD="qq郵箱授權碼"

配置文件需要和代碼文件放在同一級目錄下
在這裏插入圖片描述

from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
import os


app = Flask(__name__)


app.config.update(dict(
    DEBUG=True,
    MAIL_SERVER=os.getenv('MAIL_SERVER'),
    # MAIL_PORT=587,
    # MAIL_USE_TLS=True,

    MAIL_PORT=465,
    MAIL_USE_SSL=True,
    MAIL_USERNAME=os.getenv('MAIL_USERNAME'),
    MAIL_PASSWORD=os.getenv('MAIL_PASSWORD'),
))

mail = Mail(app)


def send_async_email(app, message):
    with app.app_context():
        mail.send(message)


@app.route('/')
@app.route('/mail')
def index():
    try:
        message = Message(subject='hello, world!',
                              sender=('99Kies',app.config["MAIL_USERNAME"]),
                              recipients=['[email protected]'],
                              body='Hello World')
        thread = Thread(target=send_async_email, args=[app, message])
        # 使用多線程
        thread.start()
        return '發送成功!!!'
    except:
        return 'Error!!!'

if __name__ == '__main__':
    app.run()

# # 手動,添加到app上下文中
# with app.app_context():
#     message = Message(subject='hello, world!',
#                       sender=('99Kies',app.config["MAIL_USERNAME"]),
#                       recipients=['[email protected]'],
#                       body='Hello World')
#     #
#     thread = Thread(target=send_async_email, args=[app, message])
#     # 使用多線程
#     thread.start()

利用flask_mail庫製作 “郵箱轟炸機”

爲了快速提醒一個同學起牀打代碼,我們就需要多進程來幫助我們發送郵件。

from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
import os

from multiprocessing.pool import Pool

app = Flask(__name__)


app.config.update(dict(
    DEBUG=True,
    MAIL_SERVER=os.getenv('MAIL_SERVER'),
    # MAIL_PORT=587,
    # MAIL_USE_TLS=True,

    MAIL_PORT=465,
    MAIL_USE_SSL=True,
    MAIL_USERNAME=os.getenv('MAIL_USERNAME'),
    MAIL_PASSWORD=os.getenv('MAIL_PASSWORD'),
))

mail = Mail(app)


def send_async_email(app, message):
    with app.app_context():
        mail.send(message)



def main(i):
    with app.app_context():
        message = Message(subject='hello, world!',
                          sender=('99Kies',app.config["MAIL_USERNAME"]),
                          recipients=['[email protected]'],
                          body='Hello World')
        #
        thread = Thread(target=send_async_email, args=[app, message])
        # 使用多線程
        thread.start()
        print(i)

@app.route('/')
def index():
    pool = Pool()
    group = [i for i in range(50)]
    print(group)
    pool.map(main, group)
    pool.close()
    pool.join()
    return 'hello'


if __name__ == '__main__':
    app.run(debug=True)

需要注意的是 qq郵箱是有防護措施的,如果發送過多的郵件。。。
在這裏插入圖片描述


在使用.env時容易遇到的問題(大坑必看)

所謂坑就是 別人和你的代碼一模一樣 別人可以跑,你就有bug
下面是可能會遇到的錯誤

在這裏插入圖片描述
在這裏插入圖片描述

兩種報錯,一個原因,就是因爲沒有安裝python-dotenv庫,如果沒有安裝python-dotenv那麼os.getenv()的內容就是None
解決方法就是安裝python-dotenv庫了,但是又有一個問題,當安裝python-dotenv之後,就無法使用flask shell, flask command 等相關命令了,所以這反人類的設計,有點讓人抓狂,還好我們有強大的ide可以通過ctrl+shift+f10實現flask run

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章