You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TwiML中<Pause>标签是否可用于Programmable SMS实现延迟回复

解答

关于<Pause>标签的兼容性

  • <Pause>是TwiML Voice专属标签,不支持Programmable SMS场景,在短信TwiML中写入该标签会被直接忽略,无法实现延迟效果。

为什么time.sleep()方案会失败

Twilio向你配置的webhook地址发送请求时,默认超时时间为15秒,最长可配置的超时阈值也仅为15秒。你在Flask的同步请求处理逻辑中执行30秒的sleep,Twilio会在等待15秒后主动断开连接,判定本次webhook请求失败,不会解析你后续返回的TwiML内容,自然不会发送回复短信,这个问题和ngrok没有关系。

可落地的延迟回复实现方案

不要在webhook的同步请求流程中做等待,采用「即时响应+异步延迟发送」的逻辑即可:

  • 接收到Twilio的短信webhook请求后,立刻返回空的TwiML响应(HTTP 200状态码),告知Twilio请求已正常接收,无需重试。
  • 将回复内容、收发件手机号等参数传入异步任务,设置30秒等待时间,等待结束后主动调用Twilio的短信发送接口下发回复即可。

本地开发测试阶段可以直接用Python内置线程实现轻量异步,不需要引入重型任务队列,最小可运行示例代码如下:

from flask import Flask, request, Response
from twilio.twiml.messaging_response import MessagingResponse
from twilio.rest import Client
import threading
import time

app = Flask(__name__)
# 替换为你自己的Twilio账号凭证
client = Client("你的TWILIO_ACCOUNT_SID", "你的TWILIO_AUTH_TOKEN")

def send_delayed_sms(to_num, from_num, content, wait_seconds):
    time.sleep(wait_seconds)
    client.messages.create(body=content, from_=from_num, to=to_num)

@app.route("/sms-webhook", methods=["POST"])
def handle_sms():
    # 立即返回空响应,规避Twilio超时限制
    twiml_resp = MessagingResponse()
    # 提取webhook携带的参数
    sender_phone = request.form.get("From")
    twilio_phone = request.form.get("To")
    user_msg = request.form.get("Body", "").strip()

    # 替换为你自己的聊天机器人回复生成逻辑
    bot_reply = f"已收到你的消息:{user_msg}"

    # 启动异步线程执行延迟发送
    threading.Thread(
        target=send_delayed_sms,
        args=(sender_phone, twilio_phone, bot_reply, 30)
    ).start()

    return Response(str(twiml_resp), mimetype="application/xml")

if __name__ == "__main__":
    app.run(port=5000)

注意事项

  • 本地测试用线程实现异步足够使用,生产环境建议替换为Celery、RQ等成熟的任务队列,避免进程、线程异常导致消息漏发。
  • 所有超过15秒的延迟场景都无法通过同步返回TwiML的方式实现,必须采用异步主动调用发送接口的方案,没有其他可绕过超时限制的方法。

内容的提问来源于stack exchange,提问作者mkozar101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:33:19