如何无需验证手机号,通过AWS Pinpoint+Node.js发送SMS OTP?
解决方案:绕过Pinpoint沙盒模式限制发送SMS OTP
你遇到的问题根源是Pinpoint默认处于沙盒模式,这个模式为防止垃圾短信滥用,仅允许向预先验证的手机号发送消息。要实现无需添加验证手机号即可发送OTP,核心是将Pinpoint项目升级到生产模式,具体操作和代码示例如下:
1. 升级Pinpoint到生产模式
- 登录AWS控制台进入Pinpoint项目管理页
- 左侧导航栏选择设置 > 短信设置
- 点击请求升级到生产,按提示提交信息:
- 说明业务用途(如用户身份验证OTP发送)
- 提供预计月发送量
- 确认遵守目标地区短信合规要求(如国内短信规范、美国TCPA等)
- AWS审核通过后,项目将切换到生产模式,此时无需预先验证接收手机号即可发送SMS
2. Node.js SDK发送OTP代码示例(AWS SDK v3)
使用@aws-sdk/client-pinpoint包,直接指定符合E.164格式的目标手机号(如+8613xxxxxxxxx)发送OTP:
import { PinpointClient, SendMessagesCommand } from "@aws-sdk/client-pinpoint"; // 初始化Pinpoint客户端 const client = new PinpointClient({ region: "你的AWS区域(如us-east-1)" }); async function sendOtp(phoneNumber, otpCode) { const params = { ApplicationId: "你的Pinpoint项目ID", MessageRequest: { Addresses: { [phoneNumber]: { ChannelType: "SMS" } }, MessageConfiguration: { SMSMessage: { Body: `你的验证码是:${otpCode},请在5分钟内完成验证。`, MessageType: "TRANSACTIONAL", // 事务型短信,适配OTP验证场景 OriginationNumber: "你的Pinpoint已验证发送号码/短代码" } } } }; try { const command = new SendMessagesCommand(params); const response = await client.send(command); console.log("OTP发送成功:", response); return response; } catch (error) { console.error("发送失败:", error); throw error; } } // 调用示例 sendOtp("+8613xxxxxxxxx", "123456");
注意事项
- 确保IAM角色/用户拥有
pinpoint:SmsPublish权限 - 生产模式下仍需验证发送号码,但接收号码无需预先验证
- 严格遵守目标地区短信法规,比如国内需报备短信模板避免被拦截
内容的提问来源于stack exchange,提问作者Langesh
相关产品推荐
相关产品推荐

