成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flask插件系列 - Flask-Mail

開發 后端
給用戶發送郵件是 Web 應用中最常見的任務之一,比如用戶注冊,找回密碼等。Python 內置了一個 smtplib 的模塊,可以用來發送郵件,這里我們使用 Flask-Mail,是因為它可以和 Flask 集成,讓我們更方便地實現此功能。

簡介

給用戶發送郵件是 Web 應用中最常見的任務之一,比如用戶注冊,找回密碼等。Python 內置了一個 smtplib 的模塊,可以用來發送郵件,這里我們使用 Flask-Mail,是因為它可以和 Flask 集成,讓我們更方便地實現此功能。

安裝

使用 pip 安裝:

  1. $ pip install Flask-Mail 

或下載源碼安裝:

  1. $ git clone https://github.com/mattupstate/flask-mail.git 
  2. $ cd flask-mail 
  3. $ python setup.py install  

發送郵件

Flask-Mail 連接到簡單郵件傳輸協議 (Simple Mail Transfer Protocol, SMTP) 服務器,并把郵件交給這個服務器發送。這里以 QQ 郵箱為例,介紹如何簡單地發送郵件。在此之前,我們需要知道 QQ 郵箱的服務器地址和端口是什么,點此查看。

  1. # -*- coding: utf-8 -*- 
  2.  
  3. from flask import Flask 
  4. from flask_mail import Mail, Message 
  5. import os 
  6.  
  7. app = Flask(__name__) 
  8.  
  9. app.config['MAIL_SERVER'] = 'smtp.qq.com'  # 郵件服務器地址 
  10. app.config['MAIL_PORT'] = 25               # 郵件服務器端口 
  11. app.config['MAIL_USE_TLS'] = True          # 啟用 TLS 
  12. app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME'or 'me@example.com' 
  13. app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD'or '123456' 
  14.  
  15. mail = Mail(app) 
  16.  
  17. @app.route('/'
  18. def index(): 
  19.     msg = Message('Hi', sender='me@example.com', recipients=['he@example.com']) 
  20.     msg.html = '<b>Hello Web</b>' 
  21.     # msg.body = 'The first email!' 
  22.     mail.send(msg) 
  23.     return '<h1>OK!</h1>' 
  24.  
  25. if __name__ == '__main__'
  26.     app.run(host='127.0.0.1', debug=True 

在發送前,需要先設置用戶名和密碼,當然你也可以直接寫在文件里,如果是從環境變量讀取,可以這么做:

  1. $ export MAIL_USERNAME='me@example.com' 
  2. $ export MAIL_PASSWORD='123456'  

將上面的 sender 和 recipients 改一下,就可以進行測試了。

從上面的代碼,我們可以知道,使用 Flask-Mail 發送郵件主要有以下幾個步驟:

  • 配置 app 對象的郵件服務器地址,端口,用戶名和密碼等
  • 創建一個 Mail 的實例:mail = Mail(app)
  • 創建一個 Message 消息實例,有三個參數:郵件標題、發送者和接收者
  • 創建郵件內容,如果是 HTML 格式,則使用 msg.html,如果是純文本格式,則使用 msg.body
  • 最后調用 mail.send(msg) 發送消息

Flask-Mail 配置項

Flask-Mail 使用標準的 Flask 配置 API 進行配置,下面是一些常用的配置項:

配置項 說明
MAIL_SERVER 郵件服務器地址,默認為 localhost
MAIL_PORT 郵件服務器端口,默認為 25
MAIL_USE_TLS 是否啟用傳輸層安全 (Transport Layer Security, TLS)協議,默認為 False
MAIL_USE_SSL 是否啟用安全套接層 (Secure Sockets Layer, SSL)協議,默認為 False
MAIL_DEBUG 是否開啟 DEBUG,默認為 app.debug
MAIL_USERNAME 郵件服務器用戶名,默認為 None
MAIL_PASSWORD 郵件服務器密碼,默認為 None
MAIL_DEFAULT_SENDER 郵件發件人,默認為 None,也可在 Message 對象里指定
MAIL_MAX_EMAILS 郵件批量發送個數上限,默認為 None
MAIL_SUPPRESS_SEND 默認為 app.testing,如果為 True,則不會真的發送郵件,供測試用

異步發送郵件

使用上面的方式發送郵件,會發現頁面卡頓了幾秒才出現消息,這是因為我們使用了同步的方式。為了避免發送郵件過程中出現的延遲,我們把發送郵件的任務移到后臺線程中,代碼如下:

  1. # -*- coding: utf-8 -*- 
  2.  
  3. from flask import Flask 
  4. from flask_mail import Mail, Message 
  5. from threading import Thread 
  6. import os 
  7.  
  8. app = Flask(__name__) 
  9.  
  10. app.config['MAIL_SERVER'] = 'smtp.qq.com' 
  11. app.config['MAIL_PORT'] = 25 
  12. app.config['MAIL_USE_TLS'] = True 
  13. app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME'or 'smtp.example.com' 
  14. app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD'or '123456' 
  15.  
  16. mail = Mail(app) 
  17.  
  18. def send_async_email(app, msg): 
  19.     with app.app_context(): 
  20.         mail.send(msg) 
  21.  
  22. @app.route('/sync'
  23. def send_email(): 
  24.     msg = Message('Hi', sender='me@example.com', recipients=['he@example.com']) 
  25.     msg.html = '<b>send email asynchronously</b>' 
  26.  
  27.     thr = Thread(target=send_async_email, args=[app, msg]) 
  28.     thr.start() 
  29.     return 'send successfully' 
  30.  
  31. if __name__ == '__main__'
  32.     app.run(host='127.0.0.1', debug=True 

在上面,我們創建了一個線程,執行的任務是send_async_email,該任務的實現涉及一個問題1:

很多 Flask 擴展都假設已經存在激活的程序上下文和請求上下文。Flask-Mail 中的 send() 函數使用 current_app,因此必須激活程序上下文。不過,在不同線程中執行 mail.send() 函數時,程序上下文要使用 app.app_context()人工創建。

帶附件的郵件

有時候,我們發郵件的時候需要添加附件,比如文檔和圖片等,這也很簡單,代碼如下:

  1. # -*- coding: utf-8 -*- 
  2.  
  3. from flask import Flask 
  4. from flask_mail import Mail, Message 
  5. import os 
  6.  
  7. app = Flask(__name__) 
  8.  
  9. app.config['MAIL_SERVER'] = 'smtp.qq.com'  # 郵件服務器地址 
  10. app.config['MAIL_PORT'] = 25               # 郵件服務器端口 
  11. app.config['MAIL_USE_TLS'] = True          # 啟用 TLS 
  12. app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME'or 'me@example.com' 
  13. app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD'or '123456' 
  14.  
  15. mail = Mail(app) 
  16.  
  17. @app.route('/attach'
  18. def add_attchments(): 
  19.     msg = Message('Hi', sender='me@example.com', recipients=['other@example.com']) 
  20.     msg.html = '<b>Hello Web</b>' 
  21.  
  22.     with app.open_resource("/Users/Admin/Documents/pixel-example.jpg"as fp: 
  23.         msg.attach("photo.jpg""image/jpeg", fp.read()) 
  24.  
  25.     mail.send(msg) 
  26.     return '<h1>OK!</h1>' 
  27.  
  28. if __name__ == '__main__'
  29.     app.run(host='127.0.0.1', debug=True 

上面的代碼中,我們通過 app.open_resource(path_of_attachment) 打開了本機的某張圖片,然后通過msg.attach() 方法將附件內容添加到 Message 對象。msg.attach() 方法的第一個參數是附件的文件名,第二個參數是文件內容的 MIME (Multipurpose Internet Mail Extensions) 類型,第三個參數是文件內容。

如果你不知道附件的 MIME 類型是什么,可以查看 MIME 參考手冊。

批量發送

在某些情況下,我們需要批量發送郵件,比如給網站的所有注冊用戶發送改密碼的郵件,這時為了避免每次發郵件時都要創建和關閉跟服務器的連接,我們的代碼需要做一些調整,類似如下:

  1. with mail.connect() as conn: 
  2.     for user in users: 
  3.         subject = "hello, %s" % user.name 
  4.         msg = Message(recipients=[user.email], body='...', subject=subject) 
  5.         conn.send(msg)  

上面的工作方式,使得應用與電子郵件服務器保持連接,一直到所有郵件已經發送完畢。某些郵件服務器會限制一次連接中的發送郵件的上限,這樣的話,你可以配置 MAIL_MAX_EMAILS。

需要注意的是,更好的發送大量電子郵件的方式是用專門的作業系統,比如用 Celery 任務隊列等。

本文完整的代碼在這里

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-08-19 07:25:02

數據庫Flask插件

2019-05-14 13:59:52

Flask服務器部署

2022-03-16 00:15:56

Flask擴展插件

2022-08-31 15:09:03

PythonOthers

2020-12-29 10:16:24

接口測試flaskmock

2021-11-26 22:51:31

FlaskBlueprintsViews

2021-04-28 07:03:28

DjangoFlaskFastAPI

2020-06-03 09:37:42

人臉識別人工智能開源

2019-12-23 10:00:52

PythonFlaskPython Web

2021-07-28 06:51:08

FlaskPythonWeb

2022-02-16 07:47:48

flask分頁SQLAlchemy

2022-05-26 15:02:35

Docker容器云原生

2022-06-23 08:01:36

FlaskSocketIOSwift

2023-06-07 08:18:25

2023-03-27 15:07:27

PythonWeb 開發編程語言

2022-01-03 18:15:35

FlaskTepHttpRunner

2023-09-01 08:19:21

Flask

2023-12-27 10:47:45

Flask數據可視化開發

2019-10-23 08:00:00

Flask機器學習人工智能

2021-03-27 22:21:48

HTTPPython數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区三区中文字幕 | 成人视屏在线观看 | 91视频网址 | 亚洲va中文字幕 | 精品二区 | 免费在线观看av | 四虎影视 | 亚洲第一天堂无码专区 | 亚洲狠狠丁香婷婷综合久久久 | 国产日韩精品一区二区 | 亚洲精品在线视频 | 欧美在线精品一区 | 国产精品a久久久久 | 国产在线视频一区 | 国产精品久久久久久久久久三级 | 成人做爰9片免费看网站 | 欧美一区免费 | 午夜精品一区二区三区在线观看 | 日日夜夜91 | 一区二区在线 | 久久精品亚洲精品 | 亚洲免费在线 | 天天艹逼网| 久久久久久久久淑女av国产精品 | 国产精品久久久久无码av | 久久久久久99 | 色狠狠桃花综合 | 精品亚洲一区二区三区 | 日韩在线中文字幕 | 久热久草 | 高清人人天天夜夜曰狠狠狠狠 | 国产精品123区 | 成人一区二区三区 | 伊人伊人 | 亚洲精品免费视频 | av毛片在线播放 | 日日干夜夜操 | 99精品久久久久久中文字幕 | 日韩中文在线视频 | www,黄色,com| 午夜免费网站 |