Docker快速部署一个轻量级邮件发送 API 服务

1、 这是一个基于 Gin 框架的邮件发送服务,对外提供API,实质是通过第三方SMTP发送邮件

• 提供一个简易的Web UI,可在线查看发送记录

• 支持Docker快速部署,非常轻量

• 通过一个GET请求就能发送邮件,适合快速接入终端命令行、shell脚本、各种代码请求等

• 该工具的开源地址:https://github.com/luler/hello_email_tool

2. go环境中,可以直接源码运行

bash 复制代码
git clone https://github.com/luler/hello_email_tool
cd hello_email_tool
go mod tidy
cp .env.example .env #编辑SMTP 邮件配置、邮件接口授权码
go run main.go serve

3、过Docker快速部署(建议)

vi docker-compose.yml,配置如下

bash 复制代码
services:
  hello_email_tool:
    image: ghcr.io/luler/hello_email_tool:latest
    restart: always
    ports:
      - 7878:3000
    volumes:
      - ./runtime:/app/runtime #这里会保存sqlite数据库
    environment:
      - TZ=${TZ:-Asia/Shanghai}                         #时区
      - PORT=${PORT:-3000}                              #服务端口
      #数据库配置
      - DATABASE_DEFAULT_DRIVER=${DATABASE_DEFAULT_DRIVER:-sqlite}
      - DATABASE_DEFAULT_NAME=${DATABASE_DEFAULT_NAME:-runtime/hello_email_tool.sqlite}
      #SMTP邮件配置,如下必须设置正确配置,如企业邮箱、QQ邮箱账号的SMTP配置
      - SMTP_HOST=${SMTP_HOST:-smtp.example.com}
      - SMTP_PORT=${SMTP_PORT:-587}
      - SMTP_USERNAME=${SMTP_USERNAME:-your_email@example.com}
      - SMTP_PASSWORD=${SMTP_PASSWORD:-your_password}
      - SMTP_FROM=${SMTP_FROM:-your_email@example.com}
      - SMTP_FROM_NAME=${SMTP_FROM_NAME:-EmailTool}
      # 邮件接口授权码,必须修改为复杂的
      - EMAIL_AUTH_CODE=${EMAIL_AUTH_CODE:-your_auth_code}

docker run 命令

bash 复制代码
docker run -d \
  --name hello_email_tool \
  --restart always \
  -p 7878:3000 \
  -v /data/runtime:/app/runtime \
  -e TZ=${TZ:-Asia/Shanghai} \
  -e PORT=${PORT:-3000} \
  -e DATABASE_DEFAULT_DRIVER=${DATABASE_DEFAULT_DRIVER:-sqlite} \
  -e DATABASE_DEFAULT_NAME=${DATABASE_DEFAULT_NAME:-runtime/hello_email_tool.sqlite} \
  -e SMTP_HOST=${SMTP_HOST:-smtp.example.com} \
  -e SMTP_PORT=${SMTP_PORT:-587} \
  -e SMTP_USERNAME=${SMTP_USERNAME:-your_email@example.com} \
  -e SMTP_PASSWORD=${SMTP_PASSWORD:-your_password} \
  -e SMTP_FROM=${SMTP_FROM:-your_email@example.com} \
  -e SMTP_FROM_NAME=${SMTP_FROM_NAME:-EmailTool} \
  -e EMAIL_AUTH_CODE=${EMAIL_AUTH_CODE:-your_auth_code} \
  ghcr.io/luler/hello_email_tool:latest
  1. 创建启动脚本(推荐)
    创建 run-email-tool.sh 文件:
bash 复制代码
#!/bin/bash

# 设置实际的环境变量值(请根据您的实际情况修改)
export TZ=Asia/Shanghai
export PORT=3000
export DATABASE_DEFAULT_DRIVER=sqlite
export DATABASE_DEFAULT_NAME=runtime/hello_email_tool.sqlite
export SMTP_HOST=smtp.qq.com
export SMTP_PORT=587
export SMTP_USERNAME=your_email@qq.com
export SMTP_PASSWORD=your_smtp_password
export SMTP_FROM=your_email@qq.com
export SMTP_FROM_NAME=EmailTool
export EMAIL_AUTH_CODE=your_complex_auth_code_here

运行容器

bash 复制代码
docker run -d \
  --name hello_email_tool \
  --restart always \
  -p 7878:3000 \
  -v /data/runtime:/app/runtime \
  -e TZ \
  -e PORT \
  -e DATABASE_DEFAULT_DRIVER \
  -e DATABASE_DEFAULT_NAME \
  -e SMTP_HOST \
  -e SMTP_PORT \
  -e SMTP_USERNAME \
  -e SMTP_PASSWORD \
  -e SMTP_FROM \
  -e SMTP_FROM_NAME \
  -e EMAIL_AUTH_CODE \
  ghcr.io/luler/hello_email_tool:latest

echo "容器已启动,访问地址: http://localhost:7878"

  1. 直接使用 .env 文件

创建 .env 文件:

bash 复制代码
env
TZ=Asia/Shanghai
PORT=3000
DATABASE_DEFAULT_DRIVER=sqlite
DATABASE_DEFAULT_NAME=runtime/hello_email_tool.sqlite
SMTP_HOST=smtp.qq.com
SMTP_PORT=587
SMTP_USERNAME=your_email@qq.com
SMTP_PASSWORD=your_smtp_password
SMTP_FROM=your_email@qq.com
SMTP_FROM_NAME=EmailTool
EMAIL_AUTH_CODE=your_complex_auth_code_here

然后运行:

加载 .env 文件并运行

bash 复制代码
docker run -d \
  --name hello_email_tool \
  --restart always \
  --env-file .env \
  -p 7878:3000 \
  -v $(pwd)/runtime:/app/runtime \
  ghcr.io/luler/hello_email_tool:latest

常用管理命令:

bash 复制代码
# 查看容器日志
docker logs hello_email_tool

# 查看实时日志
docker logs -f hello_email_tool

# 停止容器
docker stop hello_email_tool

# 启动容器
docker start hello_email_tool

# 重启容器
docker restart hello_email_tool

# 删除容器
docker rm -f hello_email_tool

# 进入容器
docker exec -it hello_email_tool sh

重要提醒:

请务必将所有 example.com 和占位符替换为您的实际配置

EMAIL_AUTH_CODE 应该设置为一个复杂的随机字符串,用于API认证

确保 runtime 目录存在并具有正确的权限

bash 复制代码
邮件发送 API 接口文档
接口信息
接口地址: /api/email

请求方式: GET / POST

Content-Type: application/x-www-form-urlencoded 或 application/json

请求参数
参数名	类型	必填	说明
auth_code	string	是	授权码,需与环境变量 EMAIL_AUTH_CODE 一致
to	string	是	收件人邮箱地址,多个用逗号分隔
cc	string	否	抄送人邮箱地址,多个用逗号分隔
subject	string	是	邮件主题
body	string	是	邮件正文内容
is_html	bool/string	否	是否为 HTML 格式邮件,支持 1、true、yes
from_name	string	否	发件人名称,默认使用环境变量 SMTP_FROM_NAME
Postman 测试示例
  1. GET 请求示例
bash 复制代码
GET http://localhost:7878/api/email?
    auth_code=your_auth_code&
    to=recipient@example.com&
    subject=测试邮件&
    body=这是一封测试邮件&
    is_html=false
  1. POST 请求示例 (x-www-form-urlencoded)
bash 复制代码
POST http://localhost:7878/api/email
Content-Type: application/x-www-form-urlencoded

auth_code=your_auth_code&
to=user1@example.com,user2@example.com&
cc=cc1@example.com,cc2@example.com&
subject=测试邮件主题&
body=<h1>HTML邮件内容</h1><p>这是一封HTML格式的测试邮件</p>&
is_html=true&
from_name=我的邮件工具
  1. POST 请求示例 (JSON)
bash 复制代码
POST http://localhost:7878/api/email
Content-Type: application/json

{
  "auth_code": "your_auth_code",
  "to": "recipient@example.com",
  "cc": "cc1@example.com,cc2@example.com",
  "subject": "测试邮件主题",
  "body": "这是一封纯文本测试邮件",
  "is_html": false,
  "from_name": "系统通知"
}

成功响应

bash 复制代码
json
{
  "code": 200,
  "message": "邮件发送成功",
  "data": {
    "messageId": "<20231231000000.123456@example.com>",
    "accepted": ["recipient@example.com"],
    "rejected": []
  }
}

错误响应示例

  1. 授权码错误
bash 复制代码
json
{
  "code": 401,
  "message": "授权码错误"
}
2. 参数缺失
json
{
  "code": 400,
  "message": "参数错误: to 为必填参数"
}
3. SMTP 配置错误
json
{
  "code": 500,
  "message": "邮件发送失败: SMTP连接失败"
}

使用 cURL 测试

bash 复制代码
# GET 请求
curl "http://localhost:7878/api/email?auth_code=YOUR_CODE&to=test@example.com&subject=测试&body=内容"

# POST 请求 (form-data)
curl -X POST http://localhost:7878/api/email \
  -d "auth_code=YOUR_CODE" \
  -d "to=test@example.com" \
  -d "subject=测试邮件" \
  -d "body=邮件正文内容" \
  -d "is_html=false"

# POST 请求 (JSON)
curl -X POST http://localhost:7878/api/email \
  -H "Content-Type: application/json" \
  -d '{
    "auth_code": "YOUR_CODE",
    "to": "test@example.com",
    "subject": "测试",
    "body": "内容",
    "is_html": false
  }'

批量发送示例

bash 复制代码
# 发送给多个收件人
curl -X POST http://localhost:7878/api/email \
  -d "auth_code=YOUR_CODE" \
  -d "to=user1@company.com,user2@company.com,user3@company.com" \
  -d "cc=manager@company.com" \
  -d "subject=月度报告通知" \
  -d "body=请查收本月的月度工作报告。" \
  -d "is_html=false"

注意事项

安全性: 授权码 auth_code 应保持机密,不要在前端代码中硬编码

批量发送: 多个收件人用逗号分隔,注意不要有空格

HTML 邮件: 使用 HTML 格式时,确保内容是有效的 HTML

频率限制: 注意避免频繁调用,以免被 SMTP 服务商限制

SMTP 配置: 确保 Docker 容器的 SMTP 环境变量配置正确
服务启动后

容器启动后,可以通过以下地址访问:

API 接口: http://localhost:7878/api/email

健康检查: http://localhost:7878/health (如果有提供)

文档页面: http://localhost:7878/docs (如果有提供)

  1. 通过Web UI查看邮件发送记录

• 直接访问地址:http://server_ip:7878/,进入邮件发送列表页面 需要授权码,输入启动时设置EMAIL_AUTH_CODE变量的值

相关推荐
深耕AI2 小时前
Docker Volumes详解
运维·docker·容器
Bypass--2 小时前
防护篇 | 云原生安全攻防实战
安全·云原生·容器·kubernetes
虾说羊2 小时前
JVM-1
jvm
山外山与楼外楼3 小时前
微服务虾谈
docker·微服务·容器
Ancelin安心3 小时前
计算机网络易混淆知识点总结
网络协议·tcp/ip·计算机网络·nginx·网络安全·docker·云原生
weixin_462446233 小时前
使用 Docker Compose 部署 Next-AI-Draw-IO(精简 OpenAI 兼容配置)
人工智能·docker·容器
损落星辰4 小时前
docker常用命令
docker·容器·eureka
deriva4 小时前
windows系统安装linux并docker部署.netcore项目
linux·docker·.netcore
可爱又迷人的反派角色“yang”4 小时前
docker(五)
linux·运维·网络·docker·容器·云计算