使用Flask Mail发送呈现的表单

时间:2018-03-19 13:02:00

标签: flask

我正在使用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>

2 个答案:

答案 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模板中内联完成的所有格式。

再次感谢您的帮助。