十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Amazon SES 作为 Docker Mailserver 中继主机(Relay Host)完整配置指南

使用 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),仅供参考
返回列表