
loopingz/smtp-relay!logo
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(文件存储)等类型使用Docker命令启动,映射端口并指定配置文件:
bashdocker run -p ***:*** loopingz/smtp-relay:latest configs/aws-smtp-relay.jsonc
配置文件可引用官方JSON Schema验证格式:
json{ "$schema": "[***]" }
提示:将URL中的
main替换为具体版本标签(如v1.0.0),可获取对应版本的配置格式。
json{ "$schema": "[***]", "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 ***:*** -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 ***:*** -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 // 文件大小限制(字节),超过自动分割 } ]
允许指定IP或收件人:
json{ "type": "whitelist", "ips": ["regexp:192\\.168\\..*"], // 允许192.168网段IP "to": ["regexp:.*@example\\.com"] // 允许发往example.com的邮件 }
将认证请求转发至HTTP端点:
json{ "type": "http-auth", "url": "http://localhost:***/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("***").createHash(process.env.HASH).update(process.env.PASSWORD).digest("hex")}`)'
发送至SES或SQS:
json{ "type": "aws", "ses": {}, // 发送至SES "sqs": { "queueUrl": "[***]" } // 可选:发送至SQS }
存储邮件到文件系统:
json{ "type": "file", "path": "./received_emails/${_iso8601_}_${_id_}.eml" // 使用变量生成文件名 }
邮件的CloudEvent表示格式:
typescriptinterface SmtpCloudEvent { *** { 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 ***:*** loopingz/smtp-relay:latest
bashopenssl s_client -connect localhost:***
EHLO client.example.com AUTH LOGIN <base64编码的用户名> <base64编码的密码> MAIL FROM: <***> RCPT TO: <***> DATA Subject: Test Email Hello World! . QUIT
提示:使用
base64 <<< "username"命令生成base64编码的凭据。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务