【问题标题】:Easy way to convert HTML (WTForm) to static HTML email?将 HTML (WTForm) 转换为静态 HTML 电子邮件的简单方法?
【发布时间】:2019-07-22 21:14:59
【问题描述】:

我有一个简单的 Flask/WTForm/Jinja2 定价计算应用程序 - 由简单的值(十进制、整数和选取值)表格(表格)和计算按钮以及计算价格的闪烁消息组成。

当用户点击发送按钮时,要求能够通过电子邮件将输入的值和计算结果发送出去。我正在寻找一种快速而肮脏的方法来做到这一点。

由于我已经生成了渲染表单 HTML(包括价格)以从 Flask 中的 POST 路由回调返回,我想我可以抓住这个渲染输出并在需要时通过电子邮件发送出去。所以我有:

@app.route("/", methods=['GET', 'POST'])
@auth.login_required
def price_calc():
  form = PriceForm(request.form)
  calc_output = ""

  if request.method == 'POST':
    if form.validate():
      # Calc the price and show it 
      calc_output = ....

      # If user hit 'Send' submit button
      if request.form['submit'] == 'send':
        send_outputs = True

  # Generate the rendered form    
  render_result = render_template('app.html', calc_output = calc_output, form=form)

  if send_outputs:
    # TODO: Need to convert this to fixed 'snapshot' HTML for email use
    generate_email(user, render_result)


  return render_result

这可行,值等都会显示出来,但 HTML 电子邮件(当然)是表单的完整“活动”副本。我的意思是当我收到电子邮件时,我可以修改值、更改下拉列表等。

我想将其转换为 HTML 的静态快照(只读)块,其值在捕获时锁定为状态。有什么简单的方法可以做到这一点?我想我可以解析所有 HTML 元素并以某种方式将它们设为只读?

或者,可能有一种方法可以修复通过电子邮件发送的 HTML 表单(只读)?

(我还需要去掉一些文本和提交按钮,但我猜这对于一些正则表达式/Beautiful Soup 解析来说是微不足道的)

谢谢!

【问题讨论】:

    标签: html forms email flask wtforms


    【解决方案1】:

    您从呈现的网页中删除文本/按钮的想法是过分且非常脆弱的。如果网页布局发生变化,您可能必须重新编写解析/正则表达式代码。此外,电子邮件 html 标记的“规则”与普通网页 html 非常不同(例如内联 css、各种电子邮件客户端的 hack)。

    有一种更简单的方法可以实现这一点;为您的电子邮件(html 和纯文本版本)提供单独的 Jinja 模板,并在使用这些模板时将提交的表单数据与计算数据一起传递给 render_template 方法。

    简单示例(使用 Flask-Mail):

    def TestForm(FlaskForm):
    
        name = StringField(u'User Name')
        age = IntegerField(u'Age')
    
    
    def generate_email(user, email_data)
    
        _email_html = render_template('email.html', data=email_data)
        _email_plain = render_template('email.txt', data=email_data)
    
        msg = Message(
            "Hello",
            sender="from@example.com",
            recipients=["to@example.com"]
        )
    
        msg.body = _email_plain
        msg.html = _email_html
    
        mail.send(msg)
    
    
    @app.route("/", methods=['GET', 'POST'])
    @auth.login_required
    def price_calc():
    
        #### blah blah
    
        # Generate the rendered form
        render_result = render_template('app.html', calc_output = calc_output, form=form)
    
        if send_outputs:
            # get the data that is needed for the email templates
            _email_data = {
                'name': form.name.data,
                'age': form.age.data,
                'output': calc_output 
            }
            generate_email(user, _email_data)
    
    
        return render_result
    

    电子邮件.html:

    <h1>Dear {{data.name}}, </h1>
    
    <p>Age: {{data.age}} </p>
    
    <p>Calculated Value: {{data.output.foo}}</p>
    <p>Calculated Value: {{data.output.bar}}</p>
    
    <p>Regards, Rickety365.</p>
    

    email.txt:

    Dear {{data.name}}
    
    Age: {{data.age}}
    
    Calculated Value: {{data.output.foo}}
    Calculated Value: {{data.output.bar}}
    
    Regards, Rickety365.
    

    【讨论】:

    • 谢谢。同意您的建议,创建单独的模板是一种更好的方法。现在我发现我可以将电子邮件标志传递给 Web 模板并将大多数内容标记为只读(这解决了我最初的问题)。但不适用于
    猜你喜欢
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2010-10-30
    • 2012-04-03
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多