如何通过Node.js服务器使用AWS SNS向未验证/未订阅用户发送短信与邮件?
解决方案:AWS SNS/SES 向未验证/未订阅用户发送消息
一、短信发送(突破SNS沙盒限制)
AWS SNS默认处于沙盒模式,仅允许向已验证的电话号码发送短信。要向任意号码发送,需切换到生产模式:
- 登录AWS控制台,进入SNS服务的短信管理页面
- 点击「请求提升发送限制」,填写申请信息(说明使用场景、预计发送量等),AWS审核通过后即可切换至生产模式
- 生产模式下需遵守合规要求:
- 仅发送合法通知(如注册验证、交易提醒),禁止垃圾信息
- 部分国家/地区需提前注册发送者ID或短信模板
Node.js 代码示例(AWS SDK v3)
const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); // 初始化SNS客户端 const snsClient = new SNSClient({ region: "你的AWS区域" }); async function sendSMS(phoneNumber, message) { const params = { Message: message, PhoneNumber: phoneNumber, // 生产模式下可填写任意未验证号码 }; try { const data = await snsClient.send(new PublishCommand(params)); console.log("短信发送成功:", data.MessageId); return data; } catch (err) { console.error("短信发送失败:", err); throw err; } } // 使用示例 sendSMS("+8613xxxxxxxxx", "欢迎注册我们的服务!");
二、邮件发送(改用AWS SES)
AWS SNS的邮件功能基于订阅机制,未订阅用户无法直接接收。若要向未订阅邮箱发送欢迎邮件,推荐使用AWS SES(Simple Email Service)——它专门用于发送事务性/营销邮件,支持向任意邮箱发送(需完成域名/邮箱验证)。
前置准备
- 进入AWS SES控制台,完成域名验证(或单个邮箱验证,适合测试)
- 若发送量较大,申请将SES从沙盒模式切换至生产模式
Node.js 代码示例(AWS SDK v3)
const { SESClient, SendEmailCommand } = require("@aws-sdk/client-ses"); // 初始化SES客户端 const sesClient = new SESClient({ region: "你的AWS区域" }); async function sendWelcomeEmail(toEmail) { const params = { Source: "你的验证邮箱/域名 <no-reply@yourdomain.com>", // 必须是已验证的发件地址 Destination: { ToAddresses: [toEmail], // 可填写任意未订阅邮箱 }, Message: { Subject: { Data: "欢迎注册我们的服务", Charset: "UTF-8", }, Body: { Html: { Data: "<h1>欢迎!</h1><p>感谢你注册我们的服务,期待你的使用。</p>", Charset: "UTF-8", }, Text: { Data: "欢迎!感谢你注册我们的服务,期待你的使用。", Charset: "UTF-8", }, }, }, }; try { const data = await sesClient.send(new SendEmailCommand(params)); console.log("邮件发送成功:", data.MessageId); return data; } catch (err) { console.error("邮件发送失败:", err); throw err; } } // 使用示例 sendWelcomeEmail("user@example.com");
注意事项
- 无论是SNS短信还是SES邮件,都需确保内容合规,避免触发AWS反垃圾机制导致账号受限
- 生产模式的申请需明确说明使用场景,AWS通常会在1-2个工作日内完成审核
内容的提问来源于stack exchange,提问作者sharans singh
相关产品推荐
相关产品推荐

