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

为何Twilio的client.messages.create()无法接收f-string作为body参数?

问题原因及解决方案

核心原因

  1. Twilio沙盒的内容拦截机制
    Twilio试用沙盒对包含链接、动态参数的消息会进行严格检测,即便你的消息不是预设模板,系统也可能将其判定为需要模板的营销类消息,直接拦截但不会抛出异常(API会返回成功响应,但消息实际未送达)。而普通纯文本字符串(无链接、无动态变量)不会触发这个检测规则,所以能正常发送。

你的build_message返回的消息包含前端链接和动态order_id参数,刚好触发了这个拦截逻辑。

  1. 异常捕获的盲区
    你的代码用except:捕获所有异常,但Twilio在消息被拦截时往往不会抛出异常,而是返回一个状态为queued或failed的消息对象。你的代码没有检查返回结果,所以误以为发送成功。

解决步骤

  • 查看Twilio控制台日志:登录Twilio控制台,找到「Messages」日志,查看这条消息的实际状态和错误详情,这是最直接的排查方式。
  • 调整消息发送时机:在试用沙盒环境中,只有当接收方先主动给沙盒号码发送过任意消息后,你才能给对方发送带链接/动态内容的非模板消息,可以先让测试用户发一条消息到沙盒号码再测试。
  • 优化异常处理:不要用宽泛的except:,改为捕获Twilio的特定异常,并打印返回的消息对象,方便排查:
from twilio.base.exceptions import TwilioRestException

def send_greetings(order_id):
    try:
        phone = format_phone_number(retrieve_target_phone(order_id))
        message = twilio_client.messages.create(
            from_=f"whatsapp:{current_app.config['TWILIO_WHATSAPP_SENDER']}",
            to=f"whatsapp:{phone}",
            body=build_message(order_id),
        )
        # 打印消息状态,排查问题
        print(f"Message status: {message.status}, SID: {message.sid}")
    except TwilioRestException as e:
        print(f"Twilio error: {e}")
        raise
  • 长期方案:如果需要正式发送带链接的消息,需要申请WhatsApp商业账号,并注册符合要求的消息模板,通过Twilio审核后即可正常发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:30:50