使用 Amazon SES 作为 Docker Mailserver 中继主机(Relay Host)完整配置指南
使用 Amazon SES 作为 Docker Mailserver 中继主机Relay Host完整配置指南【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserverAmazon SESSimple Email Service简单电子邮件服务为云上应用提供了一种简单可靠的邮件发送与接收方式。本指南面向使用 docker-mailserverDMS的开发者讲解如何将 DMS 的全部出站邮件委托给 AWS SES 投递涵盖RELAY_HOST/DEFAULT_RELAY_HOST/RELAY_PORT/RELAY_USER/RELAY_PASSWORD等核心环境变量的用法、AWS Easy DKIM 的配合策略以及如何通过邮件日志验证中继是否生效。读完本文你将掌握一套可直接投入生产的 AWS SES 邮件中继配置方案并理解其背后的 Postfix 实现原理。为什么要把邮件中继给 AWS SESDMS 默认情况下由内部集成的 Postfix 直接向收件人的 MTA 投递邮件。但在以下场景中直接投递并不理想云厂商或家庭网络屏蔽了出站 25 端口直接投递 SMTP 的必需端口服务器 IP 信誉不足邮件容易被收件方拒收或进入垃圾箱。此时可以将 DMS 配置为“智能主机smarthost / relay host”模式把所有出站邮件统一交给一个信誉良好的第三方 MTA 代投AWS SES 正是这类中继服务的代表性选择其他常见服务还有 Mailgun、Mailjet、SendGrid 等详见 relay-hosts.md。通过环境变量配置 AWS SES 中继DMS 支持通过容器环境变量ENV配置默认中继主机。在compose.yaml或mailserver.env中加入如下配置即可RELAY_HOSTemail-smtp.us-west-2.amazonaws.com RELAY_PORT587 # 兼容 LDAP 的替代方案二选一即可 DEFAULT_RELAY_HOST[email-smtp.us-west-2.amazonaws.com]:587 RELAY_USERaws-user RELAY_PASSWORDsecret各变量的配置要点如下变量说明取值建议RELAY_HOSTSES 的 SMTP 端点主机名必须与你的 AWS SES 区域 对应例如email-smtp.us-west-2.amazonaws.comus-west-2 区域RELAY_PORT连接 SES 的 SMTP 端口从 AWS SES 支持的 SMTP 端口中选择如 587STARTTLS 显式 TLS或 465隐式 TLS默认值为 25DEFAULT_RELAY_HOST默认中继主机的替代写法格式[host]:port与 LDAP 兼容推荐优先使用例如[email-smtp.us-west-2.amazonaws.com]:587RELAY_USER/RELAY_PASSWORD连接 SES 时使用的 SMTP 凭证来自 Amazon SES SMTP 凭证注意并非 AWS 访问密钥而是专门为 SMTP 生成的用户名/密码为什么推荐DEFAULT_RELAY_HOST根据 environment.md 的 Relay Host 章节DEFAULT_RELAY_HOST直接映射到 Postfix 的main.cf:relayhost配置实现简单而RELAY_HOST是历史遗留变量内部通过sender_dependent_relayhost_maps实现与 LDAP 不兼容仅在你需要“按发件域退出中继opt-out”功能时才需要使用它。两者同时配置时RELAY_HOST具有更高优先级。AWS SES 支持的 SMTP 端口依据 relay.sh 源码注释 中对官方文档的整理显式 TLSSTARTTLS25、587、2587隐式 TLS465、2465所有端口都强制要求 TLS 才能成功连接25 端口可能被限流throttledAWS Easy DKIM可以安全跳过的 DKIM 配置DKIM 是邮件防伪造与信誉建设的关键。如果你已经在 AWS SES 中启用了Easy DKIM由 AWS 托管 DKIM 密钥并自动为出站邮件签名那么你无需在 DMS 内再做任何 DKIM 配置——AWS SES 会替你完成对出站邮件的签名。# 仅当未使用 AWS Easy DKIM 时才需要在 DMS 中配置 DKIM # 参考docs/content/best-practices/dkim_dmarc_spf.md需要自行配置 DKIM 的情况你希望由 DMS 自己签名、或者使用其他中继服务如 Mailgun、SendGrid时。此时应按照 DKIM/DMARC/SPF 最佳实践 生成并配置密钥同时建议在 AWS SES 中关闭 Easy DKIM 以避免重复签名。验证中继配置是否生效配置完成后向你的某个外部邮箱发送一封测试邮件然后检查邮件的原始头mail headers以及 DMS 的邮件日志。日志中会出现与以下类似的内容postfix/smtp[692]: Trusted TLS connection established to email-smtp.us-west-1.amazonaws.com[107.20.142.169]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtp[692]: 8C82A7E7: tosomeoneexample.com, relayemail-smtp.us-west-1.amazonaws.com[107.20.142.169]:25, delay0.35, delays0/0.02/0.13/0.2, dsn2.0.0, statussent (250 Ok 01000154dc729264-93fdd7ea-f039-43d6-91ed-653e8547867c-000000)解读关键信息Trusted TLS connection established to email-smtp.us-west-1.amazonaws.comPostfix 已与 SES 建立受信任的 TLS 连接relayemail-smtp.us-west-1.amazonaws.com[...]:25投递路径经过 SES 中继而非直连收件人 MTAstatussent (250 Ok ...)SES 已接受该邮件并返回 250 应答。同时收到的邮件原始头中应包含Received: from ... by email-smtp.us-west-2.amazonaws.com ...等 SES 相关的接收头记录以及启用 Easy DKIM 后DKIM-Signature头。中继功能在 DMS 中的底层实现核心实现脚本DMS 的中继功能由 target/scripts/helpers/relay.sh 实现。它负责在容器初始化以及“变更检测change detection”事件触发时脚本中注释明确说明_process_relayhost_configs()会在初始化或变更检测时被调用配置 Postfix 的相关参数。从源码结构看该脚本只关心经过认证提交587 / 465 端口的邮件中继不涉及relay_domains那是入站转发场景。两种 ENV 的内部差异DEFAULT_RELAY_HOST直接执行postconf relayhost ${DEFAULT_RELAY_HOST}见 relay.sh 中_setup_relayhost()作用于全局默认中继RELAY_HOST通过_populate_relayhost_map()与_legacy_support()把 DMS 管理的每个域名来自/etc/postfix/vhost隐式写入/etc/postfix/relayhost_mapsender_dependent_relayhost_maps形如domain.tld [relay.host]:port因此它天然支持“按域退出中继”。RELAY_HOST的值在内部会被自动包裹为[host]形式_env_relay_host()函数输出[${RELAY_HOST}]:${RELAY_PORT:-25}这样 Postfix 会直接按 MX 主机连接而不再做 DNS MX 记录查询端口缺省时默认 25。凭证写入与安全策略_relayhost_sasl()函数负责生成/etc/postfix/sasl_passwd权限 0600仅 root 可读写并设置smtp_sasl_password_maps texthash:/etc/postfix/sasl_passwd smtp_sasl_auth_enable yes smtp_sasl_security_options noanonymous smtp_tls_security_level encrypt这意味着只要配置了RELAY_USERRELAY_PASSWORD或postfix-sasl-password.cf所有出站邮件都会被强制要求建立 TLS 安全连接encrypt且不允许匿名noanonymous——防止凭证明文传输。该行为对全部出站流量生效并不只限定发给中继主机的邮件使用该功能前需留意这一点。relay.sh的配置文件注释中还给出了 /etc/postfix/sasl_passwd 的参考示例例如对 AWS SES 的典型写法[email-smtp.us-west-2.amazonaws.com]:2465 SMTPUSERNAME:SMTPPASSWORD进阶按发件域使用不同中继与凭证如果希望不同发件域走不同中继例如 A 域走 AWS SES、B 域走 SendGridDMS 提供两个配置文件支持postfix-relaymap.cf按发件域指定中继主机生成/etc/postfix/relayhost_mappostfix-sasl-password.cf按发件域/中继主机指定认证凭证生成/etc/postfix/sasl_passwd推荐使用 setup 命令管理# 为某个发件域配置专用中继主机 setup relay add-domain domain host [port] # 为该发件域配置中继凭证省略密码时交互式输入避免进入 shell 历史记录 setup relay add-auth domain username [password] # 让某个域退出默认中继仅 RELAY_HOST 模式支持 setup relay exclude-domain domain对应实现脚本位于 target/bin/addrelayhost、target/bin/addsaslpassword 和 target/bin/excluderelaydomain。直接编辑配置文件postfix-sasl-password.cf示例# docker-data/dms/config/postfix-sasl-password.cf domain1.com mailgun-user:secret domain2.com sendgrid-user:secret # 注意中继主机必须与 postfix-relaymap.cf / relayhost_map / DEFAULT_RELAY_HOST 精确匹配 [email-smtp.us-west-2.amazonaws.com]:2587 aws-user:secretpostfix-relaymap.cf示例# docker-data/dms/config/postfix-relaymap.cf domain1.com [smtp.mailgun.org]:587 domain2.com [smtp.sendgrid.net]:2525 # 退出中继仅在使用 RELAY_HOST 时生效 domain3.com凭证匹配规则postfix-sasl-password.cf中的中继主机键必须与postfix-relaymap.cf、/etc/postfix/relayhost_map或DEFAULT_RELAY_HOST的值精确一致如[email-smtp.us-west-2.amazonaws.com]:2587否则凭证查找会失败。发送者地址完整邮箱比中继主机优先且只有启用smtp_sender_dependent_authentication yes后按发件域匹配才生效——当postfix-sasl-password.cf文件存在时relay.sh会自动开启该选项。测试与本地验证仓库中提供了可直接运行的演示编排文件 demo-setups/relay-compose.yaml用三个 DMS 实例分别模拟“发送方 DMS”“中继服务smtp.relay-service.test”“收件方邮件服务器mail.destination.test”便于你在本地完整验证中继链路与 TLS 握手。示例中发送方容器通过以下配置把所有出站邮件交给中继environment: # 所有出站邮件都将通过该主机中继 - DEFAULT_RELAY_HOST[smtp.relay-service.test]:465 - RELAY_USERrelay-userrelay-service.test - RELAY_PASSWORDsecret实际部署时用volumes挂载配置即可configs.content仅为演示用且要求 Docker Compose v2.23.1。自动化测试方面test/tests/serial/mail_with_relays.bats 覆盖了核心行为可据此验证你的配置预期RELAY_HOSTdefault.relay.comRELAY_PORT2525时/etc/postfix/relayhost_map中会为 DMS 管理的每个域生成domain.tld [default.relay.com]:2525映射包括后添加的新账户域、别名域postfix-relaymap.cf中的自定义映射如domaintwo.tld [other.relay.com]:587会被合并进映射表而 opt-out 域domainthree.tld不会被加入/etc/postfix/sasl_passwd会同时包含默认中继凭证[default.relay.com]:2525 smtp_user:smtp_password与文件中的按域凭证。对应的测试配置文件见 test/config/relay-hosts/postfix-relaymap.cf 与 test/config/relay-hosts/postfix-sasl-password.cf。常见问题与注意事项凭证安全通过 ENV 提供RELAY_PASSWORD有泄露风险环境变量可见于进程信息等。更稳妥的方式是用setup relay add-auth写入配置文件或直接编辑postfix-sasl-password.cf参考 relay-hosts.md 与 environment.md 中 Relay Host Credentials 章节的建议。使用 465 隐式 TLS 端口relay.sh注释指出使用 465 等隐式 TLS 端口时需要通过postfix-main.cf覆盖设置smtp_tls_wrappermodeyesdemo-setups/relay-compose.yaml 中有现成示例若中继走 587STARTTLS则无需此覆盖。退出中继功能受限setup relay exclude-domain仅在使用RELAY_HOST而非DEFAULT_RELAY_HOST时生效且一旦配置了任何中继凭证Postfix 仍会要求所有出站邮件走 TLS 加密并提供凭证因此该退出功能实际很少使用。DNS 与 MX 解析DEFAULT_RELAY_HOST中的主机可选用[]包裹跳过 MX 查询直接连接指定主机如[email-smtp.us-west-2.amazonaws.com]:587不包裹则 Postfix 会对该域名执行 MX 记录查询。SES 区域一致性RELAY_HOST端点必须与你的 AWS SES 区域匹配否则连接会被拒绝或出现认证失败。总结将 docker-mailserver 的出站邮件交给 Amazon SES 中继本质上是通过少量环境变量让 DMS 内部的 Postfix 切换到 smarthost 模式。推荐的生产配置组合是DEFAULT_RELAY_HOST[email-smtp.region.amazonaws.com]:587LDAP 兼容、实现简单RELAY_USER/RELAY_PASSWORDSES SMTP 凭证 AWS Easy DKIM免去自建 DKIM并以日志中的Trusted TLS connection established与statussent作为生效判据。若需多域差异化中继可进一步使用setup relay add-domain/add-auth与两个配置文件实现按发件域的精细路由。【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Monolog SocketHandler 实战指南:通过 TCP、UDP 与 Unix Socket 发送日志

Monolog SocketHandler 实战指南:通过 TCP、UDP 与 Unix Socket 发送日志

后端 【免费下载链接】monolog Sends your logs to files, sockets, inboxes, databases and various web services 项目地址: https://gitcode.com/gh_mirrors/mo/monolog 点击查看 免费下载 Monolog 的 SocketHandler 允许你通过 fsockopen() 或 pfsockopen() 将…

2026/9/21 13:39:38 阅读更多 →
10分钟做出可用的OpenCore EFI:OpCore Simplify快速上手指南

10分钟做出可用的OpenCore EFI:OpCore Simplify快速上手指南

10分钟做出可用的OpenCore EFI:OpCore Simplify快速上手指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 手动配黑苹果 EFI&#xff0c…

2026/9/20 12:57:54 阅读更多 →
Erlang 应用接入 CAT 监控:erlcat 客户端安装、配置与埋点 API 实战指南

Erlang 应用接入 CAT 监控:erlcat 客户端安装、配置与埋点 API 实战指南

Erlang 应用接入 CAT 监控:erlcat 客户端安装、配置与埋点 API 实战指南 【免费下载链接】cat CAT 作为服务端项目基础组件,提供了 Java, C/C, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架&a…

2026/9/20 12:57:54 阅读更多 →

最新新闻

ISO9001体系高频面试题:3年实战避坑指南与代码级解析

ISO9001体系高频面试题:3年实战避坑指南与代码级解析

ISO9001体系高频面试题:3年实战避坑指南与代码级解析 昨天刚带一个新人做审计,他手里拿着从网上复制的《质量手册》草稿,问我在“4.1…

2026/9/22 0:06:44 阅读更多 →
雷电ゃんが腿法娴熟を视频原理详解

雷电ゃんが腿法娴熟を视频原理详解

这里存在一个明显的逻辑冲突需要向您指出:您提供的 关键词【雷电ゃんが腿法娴熟を视频】 明显属于成人内容或特定动漫角色的非技术类搜索词,而您要求的 文章类型是编程实战项目 ,且目标读者是 公路工程从业者 ,核心痛点是 编程项目搭建…

2026/9/22 0:06:44 阅读更多 →
3分钟搞定最好用的时间管理软件速查手册

3分钟搞定最好用的时间管理软件速查手册

3分钟搞定最好用的时间管理软件速查手册 官方文档动辄几百页,翻半天还是找不到关键配置,这种折磨谁懂?别在长篇大论里浪费时间了,直接看这份 速查手册 ,把最好用的时间管理软件核心逻辑拆碎了喂给你。 很多开发者觉得时间管理就是调个 Date…

2026/9/22 0:06:44 阅读更多 →
2026最新imagine用法:3步搞定复制代码报错,原理图解

2026最新imagine用法:3步搞定复制代码报错,原理图解

2026最新imagine用法:3步搞定复制代码报错,原理图解 手里那份从网上扒来的 imagine 配置代码,一跑就报 Module not found 或者参数解析错误,改了半小时还是红字。别慌,这不是你代码写错了,是你没搞懂…

2026/9/22 0:06:44 阅读更多 →
顺丰科技物流高并发下,这3个性能坑让新人踩得头破血流

顺丰科技物流高并发下,这3个性能坑让新人踩得头破血流

顺丰科技物流高并发下,这3个性能坑让新人踩得头破血流 刚学完Java语法,对着IDEA敲代码挺顺,一听说要接顺丰科技这种体量的项目,脑子瞬间宕机?别慌,这种“会写Hello…

2026/9/22 0:06:44 阅读更多 →
初音未来歌曲源码解析:避开3个高频面试题里的环境配置大坑

初音未来歌曲源码解析:避开3个高频面试题里的环境配置大坑

初音未来歌曲源码解析:避开3个高频面试题里的环境配置大坑 配置环境就卡半天,代码跑不起来,报错信息看得人头晕。别急,这不只是你的问题。很多刚入行的开发者,甚至是有几年经验的工程师,在处理像 初音未来歌曲…

2026/9/22 0:05:43 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →