我正在使用flask_mail发送电子邮件,而这适用于短信,如果我需要自己发送模板,我需要一些帮助(这意味着什么:所以我渲染的报告包含多个表格和文本区域在顶部有一个提交按钮,一旦用户填写文本区域并单击提交,我需要烧瓶发送包含表格的报告以及文本数据。)
此代码从服务现在事件表中获取数据
def incident():
service_now_url = SERVICE_NOW_URL
request_str = req
user = 'username'
pwd = 'password'
url = service_now_url + request_str
headers = {"Accept": "application/json"}
response = requests.get(url, auth=(user, pwd), headers=headers)
json_str = response.json()
records = json_str['result']
return records
以下代码用于呈现文本字段和表格。
@app.route('/submit', methods=['GET','POST'])
def submit():
rec = incident()
form = Description(request.form)
shift = form.Shift.data
return render_template('index.html', rec=rec, state=STATES, form=form)
因此,为了发送到目前为止的电子邮件,我已经编写了下面的函数,这会发送一封电子邮件,但只有表头,没有数据。
def send_email(shift):
msg = Message(subject=shift ,recipients=['user@gmail.com'])
msg.html=render_template('index.html')
mail.send(msg)
我不是Flask专家,但在学习阶段,我们将非常感谢任何帮助。
@George感谢您的帮助,但这不起作用,我已经粘贴在html模板下面,并附有您建议的修改。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> {{ title }} : Graph</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style/main.css') }}">
{% if sending_mail %}
<style>
{{ get_resource_as_string('static\style\main.css') }}
</style>
{% endif %}
</head>
<body>
<form action="/submit">
<p> {{ shiftsum }}</p>
<div align='left'>
<h1>Task</h1>
<table id="customers">
<th>Task Number</th>
<th>Description</th>
<th>State</th>
{% for records in rec %}
<tr>
<td>{{records['number'] }}</td>
<td>{{records['short_description']}}</td>
<td>{{ state[records['state']]}}</td>
</tr>
{% endfor %}
</table>
</div>
</form>
</body>
</html>
答案 0 :(得分:1)
将send_email()
的定义更改为以下,
def send_email(shift, rec, STATES):
msg = Message(subject=shift ,recipients=['user@gmail.com'])
msg.html=render_template('index.html', rec=rec, state=STATES)
mail.send(msg)
在index.html
中,请确保将表单括在{% if form %} ... {% endif %}
内...
表示您的表单代码。
我希望这会有所帮助。
更新(用于修复丢失的CSS样式)
在app = Flask(__name__)
下面的烧瓶脚本或相应的蓝图文件
def get_resource_as_string(name, charset='utf-8'):
with app.open_resource(name) as f:
return f.read().decode(charset)
app.jinja_env.globals['get_resource_as_string'] = get_resource_as_string
在index.html
{% if sending_mail %}
<style>
{{ get_resource_as_string('static/css/styles.css') }}
</style>
{% endif %}
应将static/css/styles.css
替换为css文件的路径。如果有多个css文件,只需为每个文件添加{{ get_resource_as_string('static/css/styles.css') }}
,其各自的路径为get_resource_as_string()
的参数
在send_email()
,
def send_email(shift, rec, STATES):
msg = Message(subject=shift ,recipients=['user@gmail.com'])
msg.html=render_template('index.html', rec=rec, state=STATES, sending_mail=True)
mail.send(msg)
我已将sending_mail=True
作为参数添加到render_template()中,因此每当设置sending_mail时,render_template都会将css文件中的内容添加到<style>...</style>
。
我希望这可以修复缺少的CSS样式。
答案 1 :(得分:0)
@George感谢您的帮助,无论如何我已经找到了这里缺少的链接,
所以大多数电子邮件客户端都不支持本地存储的CSS(这是我发现的,也可能是其他的东西),所以我使用了内联CSS,这是完美的,现在我可以看到在发送电子邮件时在HTML模板中内联完成的所有格式。
再次感谢您的帮助。