如何使用AWS End User Messaging配置在PHP中发送短信?
使用AWS End User Messaging发送短信的PHP SDK正确配置方式
你遇到的错误核心原因是:AWS.SNS.SMS.OriginationNumber和AWS.SNS.SMS.ConfigurationSet这类以AWS.开头的属性是AWS系统保留字段,不能作为自定义消息属性传入。针对AWS End User Messaging的专属功能(号码池、配置集、防护配置),需要通过SNS Publish接口的顶层参数直接指定,而非嵌套在MessageAttributes中。
修正后的代码示例
<?php use Aws\Sns\SnsClient; // 初始化SNS客户端 $sns = new SnsClient([ 'version' => 'latest', 'region' => '你的AWS区域', // 例如 us-east-1、ap-southeast-1 'credentials' => [ 'key' => '你的AWS Access Key ID', 'secret' => '你的AWS Secret Access Key', ] ]); // 短信参数 $message = '你的短信内容'; $recipientPhone = '+1234567890'; // 接收方号码,必须是E.164格式(带+号) $originationNumber = '+0987654321'; // 从你的号码池中选取的始发号码(E.164格式) $configurationSetName = '你的配置集名称'; // 发送短信请求 $result = $sns->publish([ 'Message' => $message, 'PhoneNumber' => $recipientPhone, 'OriginationPhoneNumber' => $originationNumber, // 直接指定始发号码 'ConfigurationSetName' => $configurationSetName, // 直接指定配置集 'MessageAttributes' => [ // 仅SMSType仍可作为消息属性保留 'AWS.SNS.SMS.SMSType' => [ 'DataType' => 'String', 'StringValue' => 'Transactional' // 可选值:Transactional/Promotional ] ] ]); // 输出发送结果 echo "短信发送成功,消息ID:" . $result['MessageId']; ?>
关键配置说明
始发号码(OriginationPhoneNumber)
- 必须是你已创建的Phone Pool中的有效号码,格式为E.164(带+号)。
- 作为顶层参数传入,而非消息属性,避免触发保留字段错误。
配置集(ConfigurationSetName)
- 直接作为顶层参数传入,对应的配置集需已关联你的Protection Configuration。
- 配置集的防护规则会自动应用到该发送请求,无需额外配置。
保留的消息属性
- 仅
AWS.SNS.SMS.SMSType仍支持作为消息属性使用,用于指定短信类型(事务性/营销性)。 - 其他原AWS前缀的短信属性已被弃用,需通过顶层参数替代。
- 仅
前置检查事项
- 确认始发号码已添加到Phone Pool,且状态为「可用」。
- 确认配置集已创建,并正确关联了Protection Configuration。
- 确保你的AWS凭证拥有
sns:Publish权限,且权限范围包含指定的始发号码和配置集。
常见问题排查
- 若提示「号码不可用」:检查始发号码是否在号码池中,是否超出发送配额或被封禁。
- 若配置集规则未生效:验证配置集名称是否正确,防护配置是否已绑定到该配置集。
- 权限错误:检查IAM角色/用户的策略,确保允许操作指定的SNS资源。
内容的提问来源于stack exchange,提问作者pmali
相关产品推荐
相关产品推荐

