
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
!https://raw.githubusercontent.com/loopingz/aws-smtp-relay/master/docs/aws-smtp-relay-logo.png
smtp-relay 是一个动态SMTP服务器镜像,旨在替代原 aws-smtp-relay 项目。它支持多种功能模式:作为本地调试SMTP服务器将邮件存储到文件夹;将SMTP协议转发至AWS SES API;模拟AWS SES的入站功能(如mail2s3、mail2sqs)及GCP对应功能(如mail2gcpstorage、mail2gcppubsub)。
aws(SES/SQS)、gcp(Pub/Sub)、file(文件存储)等类型替换 aws-smtp-relay
使用Docker命令启动,映射端口并指定配置文件:
bashdocker run -p 10025:10025 loopingz/smtp-relay:latest configs/aws-smtp-relay.jsonc
配置文件格式
配置文件可引用官方JSON Schema验证格式:
json{ "$schema": "https://raw.githubusercontent.com/loopingz/smtp-relay/main/config.schema.json" }
提示:将URL中的
main替换为具体版本标签(如v1.0.0),可获取对应版本的配置格式。
配置示例(替换aws-smtp-relay)
json{ "$schema": "https://raw.githubusercontent.com/loopingz/smtp-relay/main/config.schema.json", "flows": { "localhost": { "filters": [ { "type": "whitelist", "ips": ["regexp:.*"] // 允许所有IP访问SMTP } ], "outputs": [ { "type": "aws", "ses": {} // 发送至AWS SES } ] } }, "options": { "disableReverseLookup": false, "authOptional": true, // 无需认证 "loggers": [ { "level": "INFO", "type": "CONSOLE" // 控制台日志 }, { "level": "INFO", "type": "FILE", "filepath": "./smtp.log" // 文件日志 } ] } }
本地开发运行
将邮件存储到本地文件夹:
bash# 无认证模式 docker run -p 10025:10025 -v `pwd`/emails:/smtp-relay/received_emails loopingz/smtp-relay:latest ./configs/fake-smtp.jsonc # 带认证模式 docker run -e SMTP_USERNAME=test -e SMTP_PASSWORD=plain:test -p 10025:10025 -v `pwd`/emails:/smtp-relay/received-emails loopingz/smtp-relay:latest configs/fake-smtp-with-auth.jsonc
json{ "flows": { "localhost": { "filters": [ { "type": "whitelist", "to": ["regexp:.*@mydomain.com"] // 过滤收件人为指定域名的邮件 } ], "outputs": [ { "type": "gcp", "path": "gs://myemail/", // 存储至GCP Storage桶 "pubsub": "" // 可选:发送消息至Pub/Sub队列 } ] } }, "options": { "disableReverseLookup": false, "authOptional": true } }
配置中可使用以下变量(处理器内可用):
_iso8601_:日期时间(YYYYmmddHHiiss格式)_timestamp_:UNIX时间戳_id_:会话ID_from_:发件人***_messageId_:邮件ID_subject_:邮件主题_to_:收件人列表(逗号分隔)支持CONSOLE(控制台)和FILE(文件)类型日志,配置示例:
json"loggers": [ { "level": "INFO", // 日志级别:DEBUG/INFO/WARN/ERROR "type": "CONSOLE" }, { "level": "INFO", "type": "FILE", "filepath": "./smtp.log", // 日志文件路径 "sizeLimit": 50000000 // 文件大小限制(字节),超过自动分割 } ]
白名单过滤器(whitelist)
允许指定IP或收件人:
json{ "type": "whitelist", "ips": ["regexp:192\\.168\\..*"], // 允许192.168网段IP "to": ["regexp:.*@example\\.com"] // 允许发往example.com的邮件 }
HTTP认证过滤器(http-auth)
将认证请求转发至HTTP端点:
json{ "type": "http-auth", "url": "http://localhost:16662/smtp/filter", // 认证端点URL "method": "POST", "credentialsMethod": "BASIC_AUTH", // 使用Basic Auth传递凭据 "json_result": { // 可选:验证响应JSON内容 "path": "$.allowed", "value": "true" } }
通过配置文件或环境变量设置用户名密码,示例配置:
json{ "type": "static-auth" }
环境变量设置:
SMTP_USERNAME:用户名SMTP_PASSWORD:密码(格式:哈希算法:哈希值,如sha256:abc123...)SMTP_PASSWORD_SALT:可选盐值密码加密命令
生成加密密码(以sha256为例):
bashHASH="sha256" PASSWORD="TEST" node -e 'console.log(`${process.env.HASH}:${require("crypto").createHash(process.env.HASH).update(process.env.PASSWORD).digest("hex")}`)'
AWS处理器
发送至SES或SQS:
json{ "type": "aws", "ses": {}, // 发送至SES "sqs": { "queueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/my-queue" } // 可选:发送至SQS }
文件处理器
存储邮件到文件系统:
json{ "type": "file", "path": "./received_emails/${_iso8601_}_${_id_}.eml" // 使用变量生成文件名 }
邮件的CloudEvent表示格式:
typescriptinterface SmtpCloudEvent { email: { from?: AddressObject; // 发件人 attachments: { filename: string; size: number }[]; // 附件 subject?: string; // 主题 to?: AddressObject[]; // 收件人 cc?: AddressObject[]; // 抄送 bcc?: AddressObject[]; // 密送 replyTo?: string; // 回复地址 date?: Date; // 日期 text?: string; // 文本内容 html?: string; // HTML内容 }; server: { clientHostname: string; // 客户端主机名 remoteAddress: string; // 客户端IP remotePort: number; // 客户端端口 hostNameAppearAs: string; // 服务器显示名称 id: string; // 会话ID secure: boolean; // 是否加密传输 transmissionType: string; // 传输类型 username: string; // 认证用户名 }; }
使用openssl连接SMTP服务器,手动发送邮件:
bashdocker run -p 10025:10025 loopingz/smtp-relay:latest
bashopenssl s_client -connect localhost:10025
EHLO client.example.com AUTH LOGIN <base64编码的用户名> <base64编码的密码> MAIL FROM: <sender@example.com> RCPT TO: <recipient@example.com> DATA Subject: Test Email Hello World! . QUIT
提示:使用
base64 <<< "username"命令生成base64编码的凭据。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务