Sendgrid 入站 webhook 数据在 Flask 中完全空白,但可以处理从请求发送的请求?

Sendgrid inbound webhook data entirely blank in Flask but works with a request sent from requests?

我现在有一个 heroku flask 应用程序。当它收到 POST 请求时,它使用 sendgrid API 将包含 POST 数据的电子邮件发送到我的个人电子邮件。相关代码(driver.sendgridemail是用https://github.com/sendgrid/sendgrid-python编写的python的示例代码)以字符串作为参数传递:

@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == "POST":
    data = request.data.decode('utf-8')
    driver.sendgridemail("Data is here: %s" % (data)) 
    return data
else:
    return render_template("index.html")

当我 POST 使用 requests.post:

requests.post("my_heroku_url", data=json.dumps({"some":"data"}), headers={"Content-Type":"application/json"})

我收到一封包含 "Data is here: {"some":"data"}"

的个人电子邮件

但是,当我使用 sendgrid 入站解析功能时,唯一转发到我个人邮箱的邮件是 "Data is here:",这显然不理想。

与内容类型有关吗?为什么它不处理来自传入电子邮件的数据?它显然正在接收电子邮件,因为它能够根据每个烧瓶应用程序转发到我的个人电子邮件,它只是不检索数据。换句话说,POST 请求通过了,但它无法检索任何数据并给了我一个空白的二进制字符串。最后,仍然认为它是 b" 是不是有点奇怪?这是否意味着它永远不会使用 sendgrid 解析解码为字符串,但它使用 python 请求 post?

根据 docs:

The request that will be sent to the HTTP endpoint will be encoded as multipart/form-data.

您需要使用 request.form 字典来访问 Flask 中的 form-data。

Sendgrid 的博客上提供了教程:https://sendgrid.com/blog/collect-inbound-email-using-python-and-flask/

此外,当您进行更改时,您应该从 requests.post 调用中删除 headers={"Content-Type":"application/json"},这样您也可以将其作为 form-data 发送。

有同样的问题,但要求我转换成字典的表格。 Webhook 现在就像一个魅力。我还建议您使用 ngrok 来测试端点,因为 sendgrid 要求您公开 url。

data = request.form.to_dict(flat=False)