阿里云短信验证码 + 邮件推送 + Cloudflare DNS 配置总结
TL;DR
| 服务 | 阿里云产品 | 核心操作 |
|---|---|---|
| 短信验证码 | 短信服务 SMS → SendSmsVerifyCode | 申请签名 + 模板 → 调 API |
| 邮件发送 | 邮件推送 DirectMail | 创建发信域名 → 配 DNS → 创建发信地址 |
| DNS 托管 | Cloudflare | 添加 SPF / DKIM / MX 记录(灰云) |
一、阿里云短信验证码
1. 开通短信服务
路径:阿里云控制台 → 短信服务 SMS → 开通服务
开通后进入:短信服务控制台
2. 申请签名
路径:国内消息 → 签名管理 → 添加签名
| 字段 | 说明 |
|---|---|
| 签名名称 | 显示在短信开头的 【xxx】,如 【VideoSnap】 |
| 签名来源 | 选与业务匹配的类型(企业选”企业”,个人选”APP”) |
| 用途 | 验证码 / 通知 / 推广(选验证码) |
| 证明材料 | 上传对应截图或证件 |
个人开发者选「APP」来源,上传应用截图即可,审核通常 1 个工作日。
3. 申请模板
路径:国内消息 → 模板管理 → 添加模板
| 字段 | 示例 |
|---|---|
| 模板类型 | 验证码 |
| 模板名称 | 登录验证码 |
| 模板内容 | 您的验证码为:${code},5分钟内有效,请勿泄露。 |
模板变量用
${变量名}格式,审核通过后才能使用。模板内容不能包含推广性文字,否则会被拒审。
4. 获取 AccessKey
路径:右上角头像 → AccessKey 管理
强烈建议创建 RAM 子账号,只授权短信权限,不要用主账号 AK。
RAM 子账号授权策略:AliyunDysmsFullAccess
5. SendSmsVerifyCode vs SendSms
| 接口 | 说明 | 适用场景 |
|---|---|---|
SendSms | 发送任意模板短信,需自己生成验证码并存储 | 通用短信发送 |
SendSmsVerifyCode | 阿里云帮你生成验证码并管理有效期,用 CheckSmsVerifyCode 验证 | 推荐用于验证码场景 |
SendSmsVerifyCode 的优势:不需要自己维护 Redis/数据库存验证码,阿里云托管验证码状态。
6. API 调用示例(Node.js)
安装 SDK:
npm install @alicloud/dysmsapi20170525
发送验证码:
import Dysmsapi from '@alicloud/dysmsapi20170525';
import * as $OpenApi from '@alicloud/openapi-client';
const client = new Dysmsapi.default(new $OpenApi.Config({
accessKeyId: process.env.ALIYUN_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIYUN_ACCESS_KEY_SECRET,
endpoint: 'dysmsapi.aliyuncs.com',
}));
// 发送验证码(阿里云自动生成 code)
const sendReq = new Dysmsapi.SendSmsVerifyCodeRequest({
phoneNumbers: '138xxxxxxxx',
signName: '你的签名名称',
templateCode: 'SMS_xxxxxxxxx', // 模板 ID
});
await client.sendSmsVerifyCode(sendReq);
// 验证用户输入的验证码
const checkReq = new Dysmsapi.CheckSmsVerifyCodeRequest({
phoneNumbers: '138xxxxxxxx',
verifyCode: '用户输入的6位code',
});
const result = await client.checkSmsVerifyCode(checkReq);
// result.body.verifyResult === true 表示验证通过
模板里不需要
${code}变量,阿里云会自动替换。验证通过后验证码立即失效,无需手动删除。
7. 常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
isv.BUSINESS_LIMIT_CONTROL | 同号码发送频率超限 | 同号每分钟 1 条,每天 10 条 |
isv.SMS_TEMPLATE_ILLEGAL | 模板未审核通过 | 等待审核或修改内容重新提交 |
isv.SMS_SIGNATURE_ILLEGAL | 签名未审核通过 | 同上 |
| 验证码验证失败 | 超过 5 分钟 / 已使用 | 让用户重新获取 |
二、阿里云邮件推送(DirectMail)
1. 开通邮件推送
路径:阿里云控制台 → 邮件推送 DirectMail → 开通服务
邮件推送按量计费,冷启动期间发送量少费用极低。
2. 创建发信域名
路径:邮件推送控制台 → 发信域名 → 新建域名
填入你要用于发信的域名,例如:
mail.your-domain.com
或者直接用根域名:
your-domain.com
提交后,阿里云会给出需要配置的 DNS 记录列表。
3. 阿里云要求的 DNS 记录
阿里云会在「发信域名详情」页显示以下记录,需要逐条添加到 DNS:
| 类型 | 主机记录 | 记录值 | 说明 |
|---|---|---|---|
| TXT | @ 或 mail | v=spf1 include:spf.mxhichina.com -all | SPF,防伪造发件人 |
| CNAME | dm | xxx.dkim.mxhichina.com | DKIM 签名验证 |
| MX | @ | mxw.mxhichina.com | 邮件接收(如需) |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:xxx | DMARC(可选) |
实际记录值以阿里云控制台显示的为准,每个账号不同。
4. 创建发信地址
路径:邮件推送控制台 → 发信地址 → 新建发信地址
| 字段 | 示例 |
|---|---|
| 发信地址 | no-reply@mail.your-domain.com |
| 回信地址 | support@your-domain.com(可选) |
| 发信类型 | 触发邮件(验证码、通知) |
触发邮件:实时发送,适合验证码和通知。
批量邮件:适合营销推广,需额外申请资质。
5. API 调用示例(Node.js)
安装 SDK:
npm install @alicloud/dm20151123
发送邮件:
import DmClient from '@alicloud/dm20151123';
import * as $OpenApi from '@alicloud/openapi-client';
const client = new DmClient.default(new $OpenApi.Config({
accessKeyId: process.env.ALIYUN_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIYUN_ACCESS_KEY_SECRET,
endpoint: 'dm.aliyuncs.com',
}));
const req = new DmClient.SingleSendMailRequest({
accountName: 'no-reply@mail.your-domain.com', // 发信地址
fromAlias: 'xxx', // 发件人昵称
addressType: 1, // 1=随机账号,0=发信地址
toAddress: 'user@example.com',
subject: '你的验证码',
htmlBody: '<p>你的验证码是:<strong>123456</strong></p>',
// textBody: '纯文本备用',
});
await client.singleSendMail(req);
三、Cloudflare DNS 配置邮件记录
关键原则:邮件相关 DNS 记录必须用灰云(仅 DNS)
邮件的 SPF / DKIM / MX 记录不能走 Cloudflare 代理(橙云),否则:
- SPF 验证会失败
- DKIM 签名无法验证
- 邮件可能进垃圾箱或被拒收
在 Cloudflare DNS 控制台添加记录时,Proxy status 选 DNS only(灰色云朵)。
添加 SPF 记录
| 类型 | 名称 | 内容 | TTL | 代理 |
|---|---|---|---|---|
| TXT | @(根域名)或 mail | v=spf1 include:spf.mxhichina.com -all | Auto | DNS only |
如果根域名已有 SPF 记录,不能新建,需要把
include:spf.mxhichina.com合并进去:v=spf1 include:spf.mxhichina.com include:其他服务 -all
添加 DKIM 记录
| 类型 | 名称 | 内容 | TTL | 代理 |
|---|---|---|---|---|
| CNAME | dm._domainkey(或阿里云指定前缀) | 阿里云控制台显示的 CNAME 目标 | Auto | DNS only |
添加 MX 记录(如需接收邮件)
| 类型 | 名称 | 邮件服务器 | 优先级 | 代理 |
|---|---|---|---|---|
| MX | @ | mxw.mxhichina.com | 10 | DNS only |
验证 DNS 生效
# 验证 SPF
dig TXT your-domain.com
# 验证 DKIM
dig CNAME dm._domainkey.your-domain.com
# 验证 MX
dig MX your-domain.com
DNS 生效后,回到阿里云「发信域名」页面点击「验证」,状态变为绿色即配置成功。
四、环境变量配置
ALIYUN_ACCESS_KEY_ID=your_access_key_id
ALIYUN_ACCESS_KEY_SECRET=your_access_key_secret
# 短信
SMS_SIGN_NAME=你的签名名称
SMS_VERIFY_TEMPLATE_CODE=SMS_xxxxxxxxx
# 邮件
MAIL_FROM=no-reply@mail.your-domain.com
MAIL_FROM_ALIAS=xxx
注意事项速查
| # | 规则 |
|---|---|
| 1 | 短信/邮件 AK 用 RAM 子账号,不要用主账号 |
| 2 | 签名和模板必须审核通过才能使用 |
| 3 | SendSmsVerifyCode 比 SendSms 更适合验证码,阿里云托管状态 |
| 4 | 邮件 DNS 记录在 Cloudflare 必须设为灰云(DNS only) |
| 5 | 根域名已有 SPF 时,追加 include,不能新建第二条 TXT |
| 6 | DKIM CNAME 记录不能开橙云代理 |
| 7 | 发信域名 DNS 验证通过后才能正常发信 |
| 8 | 触发邮件(验证码/通知)和批量邮件是两种不同配额 |