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

Python Zeep调用SMS WSDL时sendSMS方法不存在的问题

问题分析与解决方案

核心问题定位

  • 调用sendSMS时触发AttributeError: Service has no operation 'sendSMS',通过python3 -m zeep <wsdl_url>验证后,确认服务端口的操作列表中确实没有sendSMS和sendMultiSMS方法
  • 伴随警告:WSDL消息中'to'字段的XSD类型无效、sendSMS操作未在portType中找到

可能的解决方向

1. 确认WSDL文件的正确性与版本

  • 检查是否使用了错误的WSDL地址,部分服务商可能存在测试环境与生产环境的WSDL差异,确认当前使用的WSDL是否对应支持短信发送的服务版本
  • 直接访问WSDL地址,查看其中的portType定义,确认是否存在sendSMS相关操作的声明。如果WSDL本身就没有该操作,需联系服务商获取正确的服务接口文档

2. 修复WSDL中的XSD类型错误

警告中提到的'to'字段XSD类型无效,可能导致Zeep无法正确解析WSDL中的操作定义:

  • 手动修改本地WSDL文件,将'to'字段的XSD类型替换为合法类型(如xs:string),然后使用本地修改后的WSDL初始化Zeep客户端:
from zeep import Client

client = Client('file:///path/to/modified.wsdl')
  • 如果无法修改WSDL,可尝试使用Zeep的strict=False参数初始化客户端,跳过部分WSDL验证:
client = Client(wsdl_url, strict=False)

3. 检查服务端口与绑定是否匹配

部分WSDL可能包含多个服务端口,当前使用的端口可能未绑定sendSMS操作:

  • 使用Zeep查看所有可用端口与操作:
from zeep import Client

client = Client(wsdl_url)
# 列出所有服务
for service in client.wsdl.services.values():
    print(f"服务名称: {service.name}")
    # 列出服务下的所有端口
    for port in service.ports.values():
        print(f"端口名称: {port.name}")
        # 列出端口支持的操作
        for operation in port.binding._operations.values():
            print(f"操作: {operation.name}")
  • 切换到包含sendSMS操作的端口进行调用:
# 假设目标端口名称为'SMSPort'
response = client.service['SMSPort'].sendSMS(...)

4. 确认方法调用参数的正确性

如果WSDL中实际存在sendSMS操作,但Zeep解析异常,可能是参数顺序或类型不匹配:

  • 使用client.service.sendSMS.__doc__查看方法的参数定义,确认参数顺序、类型是否与代码中的调用一致
  • 尝试使用关键字参数传递,避免位置参数顺序错误:
response = self.client.service.sendSMS(
    domain=self.domain,
    username=self.username,
    password=self.password,
    from_number=self.number,
    to=receiver,
    text=text,
    priority=1
)

内容的提问来源于stack exchange,提问作者Hesam Nikzad Jamnani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:20:47