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
相关产品推荐
相关产品推荐

