# Flask實作_ext_10_Flask-Mail_利用模板渲染 ###### tags: `flask` `flask_ext` `python` `mail` ## 說明 看完[Flask實作_ext_09_Flask-Mail_郵件發送](https://hackmd.io/s/BytvGKs4M)之後對`flask-mail`都有初步的認識,現在我們就來實作如何透過模板渲染郵件內容。 ## 範例 ### 建置send_mail function 實做之前先將郵件派送的功能調整為function,方便專案內部調用,如下調整: ```python= # file name:test_flask-mail.py from flask import Flask from flask_mail import Mail from flask_mail import Message # 加入threating from threading import Thread app = Flask(__name__) app.config.update( # hotmail的設置 MAIL_SERVER='smtp.live.com', MAIL_PROT=587, MAIL_USE_TLS=True, MAIL_USERNAME='Your Hotmail Count', MAIL_PASSWORD='Your Hotmail Password' ) # 記得先設置參數再做實作mail mail = Mail(app) @app.route("/message") def message(): # 主旨 msg_title = 'Hello It is Flask-Mail' # 寄件者,若參數有設置就不需再另外設置 msg_sender = 'Send Mail' # 收件者,格式為list,否則報錯 msg_recipients = ['recipient Mail'] # 郵件內容 msg_body = 'Hey, I am mail body!' send_mail(sender=msg_sender, recipients=msg_recipients, subject=msg_title, context=msg_body) return 'You Send Message By Flask-Mail' def send_async_email(app, msg): """ 利用多執行緒來處理郵件寄送 :param app: 實作Flask的app :param msg: 實作Message的msg :return: """ with app.app_context(): mail.send(msg) def send_mail(sender, recipients, subject, context, **kwargs): """ sender:的部份可以考慮透過設置default recipients:記得要list格式 subject:是郵件主旨 context:郵件內容 **kwargs:參數 """ msg = Message(subject, sender=sender, recipients=recipients) msg.body = context # 使用多線程 thr = Thread(target=send_async_email, args=[app, msg]) thr.start() return thr if __name__ == "__main__": app.debug = True app.run() ``` ### 利用模板渲染 在`templates`資料夾內新增一個Html檔案命名為`sendmailtest.html`,內容中利用`jinja2`語法放入參數`user_name`,如下: ```htmlmixed= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Sender Mail Test</title> </head> <body> <h1>Flask Mail Send By templates</h1> <h2>Thanks Your Test {{ user_name }} !!</h2> </body> </html> ``` 第9行:加入參數`user_name` 調整Python文件,如下: ```python= # 調整route @app.route("/message") def message(): # 主旨 msg_title = 'Hello It is Flask-Mail' # 寄件者,若參數有設置就不需再另外設置 msg_sender = 'sender mail' # 收件者,格式為list,否則報錯 msg_recipients = ['recipients mail'] # 郵件內容 # msg_body = 'Hey, I am mail body!' send_mail(sender=msg_sender, recipients=msg_recipients, subject=msg_title, template='sendmailtest', user_name='Shaoe') return 'You Send Message By Flask-Mail' # 調整一下send_mail,將內容調整為樣板名稱template def send_mail(sender, recipients, subject, template, **kwargs): """ sender:的部份可以考慮透過設置default recipients:記得要list格式 subject:是郵件主旨 template:樣板名稱 **kwargs:參數 """ msg = Message(subject, sender=sender, recipients=recipients) msg.html = render_template(template + '.html', **kwargs) # 使用多線程 thr = Thread(target=send_async_email, args=[app, msg]) thr.start() return thr ``` 第17行:給一個參數username='Shaoe' 第22行:取消參數context,加入template 測試執行專案,輸入網址`http://127.0.0.1:5000/message`,如下圖: ![](https://i.imgur.com/dwIeP6y.png) ## 總結 有`jinja2`的加持讓`flask-mail`的實用度高了不少,渲染文件不限於Html,txt也可以,記得自己手動測試一下。 **Flask-Mail_郵件發送:**[Flask實作_ext_09_Flask-Mail_郵件發送](https://hackmd.io/s/BytvGKs4M)