# 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`,如下圖:

## 總結
有`jinja2`的加持讓`flask-mail`的實用度高了不少,渲染文件不限於Html,txt也可以,記得自己手動測試一下。
**Flask-Mail_郵件發送:**[Flask實作_ext_09_Flask-Mail_郵件發送](https://hackmd.io/s/BytvGKs4M)