一个功能完善的临时邮箱后端服务,提供 REST API、SMTP 邮件接收和 WebSocket 实时推送功能。专注于后端开发,可与任何前端框架集成。
本系统是临时邮箱服务,仅用于接收邮件,禁止对外发送邮件。
适用场景:临时邮箱、一次性邮箱、邮件测试、匿名接收等
当前版本: v0.8.3-beta 架构: 纯后端 API 服务(无前端) 开发进度: 100%(后端核心功能已全部完成,响应格式已标准化)
新增:用户域名catch_all模式 + 全面测试修复
v0.8.2 - 兼容API完全兼容 mail.ry.edu.kg
{error: "..."} 格式v0.8.0 重大改进:统一API响应格式
{code, msg, data} 响应格式
响应示例:
{
"code": 200,
"msg": "成功",
"data": {
"id": "mailbox-123",
"address": "test@temp.mail"
}
}
golang-migrate/migrate 专业迁移工具
golang.org/x/time/rate 令牌桶算法
heptiolabs/healthcheck 标准库
jhillyerd/enmime 专业 MIME 解析库
cd backend
# 设置必需的环境变量
export TEMPMAIL_JWT_SECRET="test-secret-key-for-development-32-chars-long-at-least"
# 启动综合服务(HTTP + SMTP + WebSocket)
go run ./cmd/server
# 服务运行在:
# - HTTP API: http://localhost:8080
# - SMTP Server: localhost:25
# - WebSocket: ws://localhost:8080/v1/ws
# 构建镜像
docker build -t tempmail-backend ./backend
# 运行容器
docker run -d \
-p 8080:8080 \
-p 25:25 \
-e TEMPMAIL_JWT_SECRET="your-super-secret-jwt-key-at-least-32-chars" \
tempmail-backend
# 用户注册
POST /v1/auth/register
{
"email": "user@example.com",
"password": "password123",
"username": "myname"
}
# 用户登录
POST /v1/auth/login
{
"email": "user@example.com",
"password": "password123"
}
# 刷新令牌
POST /v1/auth/refresh
{
"refreshToken": "..."
}
# 获取当前用户信息
GET /v1/auth/me
Authorization: Bearer <access_token>
# 创建临时邮箱(游客模式)
POST /v1/mailboxes
Response:
{
"id": "uuid",
"address": "random@temp.mail",
"token": "mailbox-access-token",
"expiresAt": "2024-01-01T00:00:00Z"
}
# 创建临时邮箱(认证用户)
POST /v1/mailboxes
Authorization: Bearer <access_token>
{
"prefix": "custom",
"domain": "temp.mail"
}
# 获取邮箱列表(仅认证用户)
GET /v1/mailboxes
Authorization: Bearer <access_token>
# 查看邮箱详情
GET /v1/mailboxes/:id
X-Mailbox-Token: <mailbox_token>
# 删除邮箱
DELETE /v1/mailboxes/:id
X-Mailbox-Token: <mailbox_token>
# 获取邮件列表
GET /v1/mailboxes/:id/messages
X-Mailbox-Token: <mailbox_token>
# 查看邮件详情
GET /v1/mailboxes/:id/messages/:messageId
X-Mailbox-Token: <mailbox_token>
# 标记邮件为已读
POST /v1/mailboxes/:id/messages/:messageId/read
X-Mailbox-Token: <mailbox_token>
# 下载邮件附件
GET /v1/mailboxes/:id/messages/:messageId/attachments/:attachmentId
X-Mailbox-Token: <mailbox_token>
# 创建邮箱别名
POST /v1/mailboxes/:id/aliases
X-Mailbox-Token: <mailbox_token>
{
"address": "alias@temp.mail"
}
# 列出邮箱别名
GET /v1/mailboxes/:id/aliases
X-Mailbox-Token: <mailbox_token>
# 获取别名详情
GET /v1/mailboxes/:id/aliases/:aliasId
X-Mailbox-Token: <mailbox_token>
# 切换别名状态(启用/禁用)
PATCH /v1/mailboxes/:id/aliases/:aliasId
X-Mailbox-Token: <mailbox_token>
{
"isActive": false
}
# 删除别名
DELETE /v1/mailboxes/:id/aliases/:aliasId
X-Mailbox-Token: <mailbox_token>
# 添加自定义域名
POST /v1/user-domains
Authorization: Bearer <access_token>
{
"domain": "yourdomain.com",
"mode": "shared" # shared 或 exclusive
}
# 列出我的域名
GET /v1/user-domains
Authorization: Bearer <access_token>
# 获取域名详情
GET /v1/user-domains/:id
Authorization: Bearer <access_token>
# 验证域名所有权(DNS TXT 记录)
POST /v1/user-domains/:id/verify
Authorization: Bearer <access_token>
# 获取 MX 配置说明
GET /v1/user-domains/:id/setup
Authorization: Bearer <access_token>
# 切换域名模式(共享/独享)
PUT /v1/user-domains/:id/mode
Authorization: Bearer <access_token>
{
"mode": "exclusive"
}
# 删除域名
DELETE /v1/user-domains/:id
Authorization: Bearer <access_token>
// 连接 WebSocket
const ws = new WebSocket('ws://localhost:8080/v1/ws');
// 订阅邮箱
ws.send(JSON.stringify({
type: 'subscribe',
mailboxId: 'mailbox-uuid',
token: 'mailbox-token'
}));
// 接收新邮件通知
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'new_mail') {
console.log('New mail received:', data);
}
};
# 用户管理
GET /v1/admin/users # 列出用户(Admin权限)
GET /v1/admin/users/:id # 获取用户详情(Admin权限)
PATCH /v1/admin/users/:id # 更新用户(Admin权限)
DELETE /v1/admin/users/:id # 删除用户(Super权限)
# 配额管理
GET /v1/admin/users/:id/quota # 获取配额(Admin权限)
PUT /v1/admin/users/:id/quota # 更新配额(Admin权限)
# 域名管理
GET /v1/admin/domains # 列出域名(Admin权限)
POST /v1/admin/domains # 添加域名(Super权限)
DELETE /v1/admin/domains/:domain # 删除域名(Super权限)
# 系统统计
GET /v1/admin/statistics # 系统统计(Admin权限)
本系统提供 mail.ry.edu.kg 风格的API接口,第三方系统可直接对接使用。
# 获取系统配置
GET /api/config
X-API-Key: YOUR_API_KEY
# 生成临时邮箱
POST /api/emails/generate
X-API-Key: YOUR_API_KEY
{
"name": "test",
"expiryTime": 3600000, # 1小时,单位毫秒
"domain": "temp.mail"
}
# 获取邮箱列表
GET /api/emails?cursor=0&limit=20
X-API-Key: YOUR_API_KEY
# 获取邮件列表
GET /api/emails/{emailId}?cursor=0&limit=20
X-API-Key: YOUR_API_KEY
# 获取单封邮件
GET /api/emails/{emailId}/{messageId}
X-API-Key: YOUR_API_KEY
对接优势:
详细文档请查看:API兼容层说明
tempmail/ ├── backend/ │ ├── cmd/ │ │ ├── server/ # 综合服务入口(HTTP + SMTP + WebSocket) │ │ └── api/ # 仅 HTTP API 服务 │ ├── internal/ │ │ ├── auth/ # 认证服务和 JWT │ │ ├── config/ # 配置管理(Viper) │ │ ├── domain/ # 领域模型和接口 │ │ ├── logger/ # 日志系统(Zap) │ │ ├── middleware/ # HTTP 中间件 │ │ ├── service/ # 业务逻辑层 │ │ ├── smtp/ # SMTP 服务器 │ │ ├── storage/ # 存储实现 │ │ │ ├── memory/ # 内存存储(开发) │ │ │ └── hybrid/ # 混合存储(生产预留) │ │ ├── transport/ # 传输层(HTTP) │ │ └── websocket/ # WebSocket 实时推送 │ └── migrations/ # 数据库迁移脚本 ├── docs/ # 项目文档 ├── deploy/ # 部署配置 └── CLAUDE.md # Claude Code 工作指南
# JWT 密钥(生产环境必须修改,至少32字符)
TEMPMAIL_JWT_SECRET=your-super-secret-jwt-key-at-least-32-chars
# HTTP 服务器
TEMPMAIL_SERVER_HOST=0.0.0.0
TEMPMAIL_SERVER_PORT=8080
# SMTP 服务
TEMPMAIL_SMTP_BIND_ADDR=:25
TEMPMAIL_SMTP_DOMAIN=temp.mail
# 邮箱配置
TEMPMAIL_MAILBOX_ALLOWED_DOMAINS=temp.mail,tempmail.dev
TEMPMAIL_MAILBOX_DEFAULT_TTL=24h
# CORS(可选,用于前端接入)
TEMPMAIL_CORS_ALLOWED_ORIGINS=http://localhost:3000
# 日志
TEMPMAIL_LOG_LEVEL=info
TEMPMAIL_LOG_DEVELOPMENT=false
# 数据库(生产环境)
TEMPMAIL_DATABASE_DSN=postgres://user:pass@host:5432/dbname
# Redis(生产环境)
TEMPMAIL_REDIS_ADDRESS=redis:6379
TEMPMAIL_REDIS_PASSWORD=your-redis-password
cd backend
# 安装依赖
go mod download
# 运行服务(仅 HTTP)
go run ./cmd/api
# 运行服务(HTTP + SMTP + WebSocket)
go run ./cmd/server
# 运行测试
go test ./...
# 构建生产版本
go build -o server ./cmd/server
# 使用 swaks 测试
swaks --to test@temp.mail --server localhost:25 --ehlo localhost
# 使用 telnet
telnet localhost 25
HELO localhost
MAIL FROM:<sender@example.com>
RCPT TO:<test@temp.mail>
DATA
Subject: Test
This is a test email.
.
QUIT
# 健康检查
curl http://localhost:8080/health
# 创建邮箱
curl -X POST http://localhost:8080/v1/mailboxes
# 使用返回的 token 查看邮箱
curl -H "X-Mailbox-Token: <token>" \
http://localhost:8080/v1/mailboxes/<id>/messages
欢迎贡献代码、报告问题或提出建议!
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)本项目采用 MIT 许可证 - 详见 LICENSE 文件
⭐ 如果觉得这个项目有帮助,请给个 Star!