希曼日记

电商篇:客户支持——配置自定义域名邮箱

约 4 分钟1,370 字

本文是全栈电商微服务从 0 到 1 再到 10系列的第 5 篇。

一个电商项目上线后,订单、激活码和退款都需要一个稳定、可信的客服入口。本篇配置 support@example.com,目标是:用户可以发邮件给客服,你可以在自己的邮箱中接收并回复;网站或后台也可以通过 Resend 发送自动通知。

先分清三个角色

Text
Cloudflare Email Routing:接收并转发邮件
Resend:从自定义域名发送邮件
你的后端 API:安全保存密钥并调用 Resend

Resend 不是完整的收件箱。它适合发信和查看发送状态;接收邮件仍然需要 Cloudflare Email Routing、Zoho Mail、Google Workspace 等邮件接收服务。

方案一:个人邮箱接收并回复

这是个人项目最简单的方案:

Text
用户 → support@example.com → Cloudflare Email Routing → 你的个人邮箱

Cloudflare Email Routing 负责收件转发,不提供完整的邮箱网页收件箱,也不等同于 SMTP 发件服务。

1. 在 Cloudflare 添加域名

  1. 注册Cloudflare账号并添加域名
  2. 将非Cloudflare注册的域名注册商的DNS转到Cloudflare,例如腾讯云,把Cloudflare提供的DNS地址分别填入,如图所示 腾讯云域名 DNS 改为 Cloudflare 提供的地址
  3. 打开Cloudflare Email Routing dashboard 添加并验证个人邮箱,用于接收邮件: Cloudflare Email Routing 添加并验证目标邮箱
  4. 之后添加转发规则: Cloudflare Email Routing 添加转发规则
  5. 向 support@example.com 发送一封测试邮件。 个人邮箱收到转发过来的测试邮件

2. 配置回复地址

如果直接从个人邮箱回复,邮件可能显示个人邮箱地址。为了让用户看到 support@example.com,在你的邮箱服务中添加“发送别名”或“通过此地址发送”:

Text
发件人:support@example.com
回复地址:support@example.com

邮箱服务通常会要求验证地址所有权。若个人邮箱无法发送该别名,可以使用 Resend 作为发件服务,见后面的方案二。

方案二:Cloudflare 收件 + Resend 发件

推荐的产品化结构如下:

Text
接收:用户 → support@example.com → Cloudflare → 你的邮箱
发送:网站/后台 → 你的后端 API → Resend → 用户邮箱

这样可以把“客服收件”和“系统发信”分开,既简单又容易扩展订单通知、激活码邮件和退款处理通知。

在 Resend 添加自定义域名

  1. 登录 Resend 控制台。
  2. 进入 Domains,添加 example.com。
  3. 复制 Resend 给出的 DNS 验证记录。
  4. 在 Cloudflare DNS 中添加这些记录。
  5. 邮件验证所需记录保持 DNS only,除非 Resend 明确要求其他设置。
  6. 回到 Resend 点击 Verify。

通常需要配置 Resend 要求的 SPF、DKIM 和 Return-Path 记录。不要凭记忆填写值,以控制台当前显示为准。

建议配置 DMARC。初期可以使用监控模式:

Text
主机:_dmarc
类型:TXT
值:v=DMARC1; p=none; rua=mailto:dmarc@example.com

确认 SPF、DKIM 和正式发信稳定后,再考虑将策略提高到 quarantine 或 reject。如果没有 dmarc@example.com 收件地址,先不要填写 rua,或使用你实际管理的报告邮箱。

Resend API 的安全接入

不要把 Resend API Key 放进浏览器前端、静态网页或桌面应用。正确结构是:

Text
浏览器 → 你的后端接口 → Resend API

服务端示例:

TypeScript
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST(request: Request) {
const { to, subject, text } = await request.json();
if (typeof to !== 'string' || typeof subject !== 'string' || typeof text !== 'string') {
return new Response('Invalid request', { status: 400 });
}
const result = await resend.emails.send({
from: 'Scorpius Support <support@example.com>',
to,
subject,
text,
replyTo: 'support@example.com',
});
return Response.json(result);
}

API Key 只放在服务端环境变量:

Shell
RESEND_API_KEY=re_xxxxxxxxx

生产环境还必须增加登录鉴权、CSRF 防护、限流、收件人校验、模板转义、发送日志和退信处理。否则公开接口可能被滥用发送垃圾邮件。

电商项目需要准备的三类页面

软件许可协议

至少说明:

  • 授权对象、套餐、期限和设备数量
  • 允许的个人或商业使用范围
  • 禁止转售、出租、破解和绕过授权
  • 软件按现状提供及兼容性边界
  • 许可证到期、撤销和复验规则
  • 协议更新方式和联系方式

隐私政策

至少说明:

  • 收集哪些订单、设备或联系信息
  • 为什么收集、保存多久、谁可以访问
  • 支付平台、许可证服务器和邮件服务商分别处理什么数据
  • 剪贴板内容是否上传
  • 用户如何申请删除、更正或咨询
  • 数据泄露和第三方服务变化时如何通知

退款与支持规则

至少说明:

  • 购买前需要确认平台、套餐、期限和设备数量
  • 已使用激活码与未使用激活码的处理方式
  • 重复购买、无法激活、换机和许可证异常如何处理
  • 支持渠道、响应范围和需要提供的诊断信息
  • 不要让用户发送密码、激活码完整内容或敏感剪贴板内容

页面文案应以实际经营规则和适用法律为准;示例不能替代法律审核。

上线检查清单

  • Cloudflare 已验证域名并启用 Email Routing
  • support@example.com 可以收到测试邮件
  • 回复时发件人不会意外暴露个人邮箱
  • Resend 显示域名已验证
  • SPF、DKIM 和 DMARC 已配置并通过测试
  • RESEND_API_KEY 只存在于服务端
  • 发信接口已鉴权、限流并记录错误
  • 网站已发布软件许可协议、隐私政策和退款/支持规则
  • 客服邮箱已经替换为真实地址,而不是示例地址

费用与边界

Cloudflare Email Routing、Resend、域名和服务器分别有自己的套餐、免费额度与计费规则,应以上线时控制台为准。e签宝等电子签名平台解决的是合同签署和存证,不负责邮件路由、邮件发送、macOS 应用签名或许可证激活。

个人项目可以先使用 Cloudflare 转发加个人邮箱;当需要自动发信、订单通知和客服后台时,再接入 Resend 后端 API;当出现企业采购或高客单价授权,再增加电子合同流程。