docker-mailserver 账户管理实战:基于 `setup` CLI 与文件型配置的 Provisioner(File)完整指南
后端通信云原生【免费下载链接】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点击查看免费下载本文围绕 docker-mailserverDMS的文件型账户供给器Provisioner: FILE展开系统讲解如何通过容器内的setupCLI 与 Config Volume 中的三个核心配置文件postfix-accounts.cf、postfix-virtual.cf、dovecot-quotas.cf管理邮箱账户、别名与配额并深入解析其底层实现脚本、Postfix/Dovecot 配置生成与测试用例。读完本文你将掌握 DMS 账户体系的完整操作链路、配置文件格式与已知边界能够独立完成从建号、设别名、配配额到排障的整套实战任务。1. 总览DMS 的两种账户供给方式与 File 模式定位DMS 通过环境变量ACCOUNT_PROVISIONER选择账户来源FILE默认账户、别名、配额存储在 Config Volume 的纯文本配置文件中由容器启动脚本转换成 Postfix 与 Dovecot 可用的内部配置LDAP账户信息来自 LDAP 目录参见 LDAP Provisioner 文档。本文只讨论 File 模式。在mailserver.env中ACCOUNT_PROVISIONER默认留空由 target/scripts/helpers/accounts.sh 中的_create_accounts()判断仅当该值等于FILE时才走文件型账户创建流程见 accounts.sh因此“不设置”即等价于 File 模式。File 模式下所有配置都归属于Config Volume默认映射docker-data/dms/config/→ 容器内/tmp/docker-mailserver/具体挂载方式可参考 Optional Config 文档的 Volumes 章节。2. 管理方式setupCLI官方推荐通过容器内的setupCLI 管理账户及其关联配置文件。它是一系列 Bash 脚本的入口在 target/bin/setup 中定义了全部子命令的分发逻辑setup [ OPTIONS... ] COMMAND [ help | ARGUMENTS... ] COMMAND : { email | alias | quota | dovecot-master | config | relay | debug } SUBCOMMANDsetup email add/update/del/list/restrictsetup alias add/del/listsetup quota set/delsetup dovecot-master add/update/del/listsetup config dkimsetup relay add-auth/add-domain/exclude-domainsetup fail2ban、setup debug ...完整命令列表可用setup help查看每个子命令都支持help参数获取用法说明例如setup email add help。2.1 进入容器执行文档示例先启动一个基础实例再进入容器执行setup# 启动一个基础 DMS 实例然后进入容器使用 setup CLI docker run --rm -itd --name dms --hostname mail.example.com mailserver/docker-mailserver docker exec -it dms bash # 创建账户 setup email add helloexample.com your-password-here # 创建别名 setup alias add your-alias-hereexample.com helloexample.com # 将邮箱容量限制为 10 MiB setup quota set helloexample.com 10M2.2 宿主机侧的setup.sh包装器仓库根目录提供了 setup.sh它自动探测 Docker/Podman见 setup.sh找到运行中的 DMS 容器后等价于执行docker exec -it container setup args见 setup.sh若没有运行中的容器则会基于镜像临时起一个新容器执行命令。也就是说上面的命令在宿主机上同样可以写成./setup.sh email add helloexample.com your-password-here ./setup.sh alias add your-alias-hereexample.com helloexample.com ./setup.sh quota set helloexample.com 10M2.3 安全密码输入命令行不带密码时脚本会交互式提示输入见 postfix-accounts.sh 的_password_request_if_missing()两次静默输入并做一致性校验从而避免密码进入 shell 历史记录$ setup email add helloexample.com Enter Password: Confirm Password:2.4 删除账户的级联行为setup email del会同时删除该账户关联的别名与配额。从源码 delmailuser 可以看到执行顺序校验账户存在可选删除磁盘上的邮箱目录-y确认删除 /-n明确保留见 delmailuser 的交互提示与-y强制删除该账户名下的全部虚拟别名_manage_virtual_aliases_delete _删除其配额条目_manage_dovecot_quota_delete最后才从postfix-accounts.cf删除账户。测试用例同样验证了这一级联行为与“缺少配置文件时不报错”的容错逻辑见 account_management.bats。3. 配置参考账户Accounts3.1 文件位置与格式配置文件docker-data/dms/config/postfix-accounts.cf格式为逐行文本两列字段以|分隔User用户账户邮箱主地址Password密码账户密码的 SHA512-CRYPT 哈希下方示例中明文密码为secret。示例假设 DMS 为example.com域管理邮件helloexample.com|{SHA512-CRYPT}$6$W4rxRQwI6HNMt9n3$riCi5/OqUxnU8eZsOlZwoCnrNgu1gBGPkJc.ER.LhJCu7sOg9i1kBrRIistlBIp938GdBgMlYuoXYUU5A4Qiv0不用setup email add生成密码哈希兼容的哈希可由 Dovecot 工具直接生成doveadm pw -s SHA512-CRYPT -u helloexample.com -p secret这实际上就是setup email add在底层所做的操作_manage_accounts()调用doveadm pw -s SHA512-CRYPT -u ${MAIL_ACCOUNT} -p ${PASSWD}生成哈希后写入文件见 postfix-accounts.sh。3.2 底层消费Postfix vmailbox 与 Dovecot UserDBsetup email add只把条目写入postfix-accounts.cf真正的“建号”发生在变更检测changedetector触发后。由 accounts.sh 的_create_accounts()完成逐行以|为分隔符解析while IFS$| read -r LOGIN PASS USER_ATTRIBUTES忽略注释与空行为每个账户生成/etc/postfix/vmailbox行LOGIN DOMAIN/USER/Postfix 的virtual_mailbox_maps为每个账户生成/etc/dovecot/userdb行格式为user:password:uid:gid:(gecos):home:(shell):extra_fields其中 uid/gid 使用DMS_VMAIL_UID/DMS_VMAIL_GIDhome 为/var/mail/domain/user/home创建邮箱目录/var/mail/domain/user/home若存在docker-data/dms/config/login.dovecot.sieve则复制为用户的.dovecot.sieve筛件账户的本地部分local-part与域部分domain-part会用于填充 Postfix 的 vhost 域表见 postfix.sh。容器启动脚本 dovecot.sh 会在检测到postfix-accounts.cf后启用auth-passwdfile.incpassdb实现 IMAP/POP3 的密码文件认证。3.3 重要约定大小写归一化创建账户时会自动将邮箱地址规范为小写——DMS 不支持同一地址的多种大小写变体。源码在 postfix-accounts.sh 的_arg_check_mail_account()中实现检测到大写字母时发出警告并转小写。测试用例专门验证了USeRxdomain.tld被归一化为userxdomain.tld见 account_management.bats。另外登录认证对大小写不敏感测试中USER1...大写登录可成功见同文件 L62-L66。登录用户名即邮箱地址所选邮箱地址同时是邮件客户端认证时的登录用户名。邮箱目录结构账户邮箱位于/var/mail/domain/local-part测试中通过[[ -d /var/mail/localhost.localdomain/user1 ]]验证见 account_management.bats。3.4 Dovecot extra fields 扩展列在postfix-accounts.cf中追加第三列可自定义“额外字段”extra fields用于在转换为 Dovecot UserDB 条目时携带额外属性如自定义 quota 属性userdb_quota_storage_size、userdb_quota_storage_grace参见 accounts.sh 的_add_attribute_dovecot_quota()。注意DMS 本身并不理解这些自定义内容只是原样透传。若这些字段改变了脚本所依赖的约定如 mailbox 路径或类型可能导致预期之外的 bug。4. 配置参考别名Aliases4.1 文件位置与格式配置文件docker-data/dms/config/postfix-virtual.cf格式为逐行“键值对”别名→目标地址以空白字符分隔。示例假设 DMS 为example.com域管理邮件# 别名投递到已有账户 alias1example.com helloexample.com # 别名转发到外部邮箱 alias2example.com external-accountgmail.com从源码看别名键第一列可以是userdomain、只有本地部分的user以及通配的domain见 postfix-virtual.sh。4.2 底层消费容器启动时aliases.sh 的_handle_postfix_virtual_config()将postfix-virtual.cf直接复制为/etc/postfix/virtualPostfix 的virtual_alias_maps默认配置为texthash:/etc/postfix/virtual见 target/postfix/main.cf。值得注意的联动逻辑当ENABLE_QUOTAS1时accounts.sh 的_create_dovecot_alias_dummy_accounts()会为“指向本地真实账户”的别名在 Dovecot userdb 中生成共享同一存储的“dummy 条目”供quota-status策略服务在入站投递时做配额检查以降低退信backscatter风险。该行为由测试显式验证见 account_management.bats。4.3 已知问题与限制setupCLI 禁止别名与账户共用同一地址目前无法用setup email add或setup alias add添加一个已作为别名或账户存在的地址。该限制源于历史 bug账户/别名重叠曾引发投递问题但仍存在合法的重叠使用场景。作为临时方案你可以手动编辑postfix-virtual.cf绕过此限制——除setupCLI 外运行时没有针对这一限制的其他检查对应校验逻辑在 postfix-virtual.sh 与 postfix-accounts.sh 中。通配 catch-allexample.com这种无本地部分的别名受支持但必须牢记Postfix 中别名的优先级高于账户的真实地址因此通配会先被匹配把整个域的信件都导向别名目标对域内每个非别名地址你需要额外为其配置一个别名来兜底Postfix 读取别名配置时会选择与收件人地址最匹配的条目因此更具体的别名必须声明在通配别名之前。别名链与多收件人虽然技术上可以向多个收件人投递但 DMS 并不官方支持某些功能集成如配额 dummy 账户、setup alias add的增删逻辑假定每个别名只有一个目标多目标可能出问题嵌套别名目标本身又是别名同样不受支持例如与setup alias add存在兼容性问题。Postfix 本身虽可递归解析别名但项目脚本/功能对此支持有限见 postfix-virtual.sh 的警告注释。4.4 配置 RegEx 别名配置文件docker-data/dms/config/postfix-regexp.cf该文件与postfix-virtual.cf类似区别在于别名值改为正则模式匹配。此功能没有setupCLI 支持只能手动改配置文件。示例将test用户的所有邮件投递到qaexample.com# 记得转义正则特殊字符如 . \. # 否则你的别名模式可能比预期更宽松 /^test[0-9][0-9]*example\.com/ qaexample.com4.5 技术细节优先级与加载机制postfix-virtual.cf拥有更高优先级postfix-regexp.cf仅在虚拟别名表中未找到匹配时才被检查两者都会被复制到容器内/etc/postfix/分别是/etc/postfix/virtual与/etc/postfix/regexp并在main.cf的virtual_alias_maps中配置。因为postfix-virtual.cf在该设置中声明在前见 target/postfix/main.cf它会先被处理postfix-regexp.cf作为后备_handle_postfix_regexp_config()通过_add_to_or_update_postfix_main追加pcre:/etc/postfix/regexp见 aliases.sh。5. 配置参考配额Quotas5.1 文件位置与格式配置文件docker-data/dms/config/dovecot-quotas.cf格式为逐行文本两列字段以:分隔Dovecot UserDB 账户DMS 账户应能在postfix-accounts.cf中找到对应条目配额上限以字节表示支持二进制单位后缀MMiBGGiB。示例为账户helloexample.com设置不超过 5 GiB 的存储上限helloexample.com:5G5.2 底层消费启动时_add_attribute_dovecot_quota()从该文件读取配额按:切分后转换为 Dovecot userdb 的userdb_quota_storage_size额外字段并根据单位后缀额外追加userdb_quota_storage_grace取数值的 1/10 作为宽限空间见 accounts.sh。写操作由 dovecot-quotas.sh 的_manage_dovecot_quota()完成setup quota set对应updatesetup quota del对应delete。默认ENABLE_QUOTAS1见 mailserver.env。测试验证了setup email list在配额启用/禁用时输出格式的差异见 account_management.bats。6. 其他相关能力Dovecot Master 账户setup dovecot-master add/update/del/list管理docker-data/dms/config/dovecot-masters.cf复用与账户相同的管理逻辑见 postfix-accounts.sh用于支持管理员的“主账户”登录场景。完整机制可参考 Master Accounts 文档。账户列表查询setup email list底层为 listmailuser列出全部账户。变更检测所有setup写操作完成后由容器的 changedetector 服务感知文件变化并重新生成 Postfix/Dovecot 内部配置见 addmailuser 的注释因此账户不会“即时”生效存在短暂延迟属正常现象。7. 从setupCLI 到配置文件的完整调用链将前述内容串联起来一次setup email add的完整链路如下宿主机./setup.sh解析出容器/镜像后执行docker exec ... setup email add ...setup.sh容器内setup脚本将email add分发给addmailusertarget/bin/setupaddmailuser调用_manage_accounts_createaddmailuser_manage_accounts完成地址校验、大小写归一化、密码哈希生成并写入/tmp/docker-mailserver/postfix-accounts.cfpostfix-accounts.shchangedetector 触发后_create_accounts()根据配置文件重建/etc/postfix/vmailbox与/etc/dovecot/userdb并创建邮箱目录accounts.sh。对应地setup alias add→addalias→_manage_virtual_aliases_update写入postfix-virtual.cfsetup quota set→setquota→_manage_dovecot_quota_update写入dovecot-quotas.cf。所有数据库文件的操作统一收敛在 database/manage 目录下结构清晰、便于维护。8. 实操核对清单需求推荐命令 / 文件底层消费方添加账户setup email add addr [pass]postfix-accounts.cf→ vmailbox / Dovecot userdb删除账户含别名、配额setup email del [-y|-n] addr级联清理三个配置文件修改密码setup email update addr [pass]重写postfix-accounts.cf哈希添加别名setup alias add alias targetpostfix-virtual.cf→/etc/postfix/virtualRegEx 别名手动编辑postfix-regexp.cf/etc/postfix/regexpvirtual_alias_maps后备设置配额setup quota set addr sizedovecot-quotas.cf→ userdb 额外字段查看账户setup email list读取postfix-accounts.cf9. 进一步阅读配置文件所属的 Config Volume 说明账户管理的总览文档Account Management 概述LDAP 供给方式对照阅读Provisioner - LDAP用user-patches.sh自定义容器内配置User Patches相关源码与测试target/scripts/helpers/accounts.sh、target/scripts/helpers/database/manage/postfix-accounts.sh、target/scripts/helpers/database/manage/postfix-virtual.sh、target/scripts/helpers/database/manage/dovecot-quotas.sh、test/tests/parallel/set3/mta/account_management.bats赞分享后端通信云原生【免费下载链接】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点击查看免费下载相关推荐docker-mailserver 实践基于 LDAP 认证的 Forward-Only 转发型邮件服务器完整配置指南docker mailserver 实践基于 LDAP 认证的 Forward Only 转发型邮件服务器完整配置指南 本指南以 docker mailser后端通信云原生aws-cli配置文件管理多环境多账户的配置最佳实践aws cli配置文件管理多环境多账户的配置最佳实践 概述 AWS CLICommand Line Interface是管理AWS资源的强大工具但在多环开发工具云原生运维Tiny File Manager 终极多用户权限管理10个实战配置技巧与目录隔离完整指南Tiny File Manager 终极多用户权限管理10个实战配置技巧与目录隔离完整指南 Tiny File Manager 是一款功能强大的单文件PHP文后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

宁波网站制作公司哪家好?保姆级建站教程避坑指南

宁波网站制作公司哪家好?保姆级建站教程避坑指南

宁波网站制作公司哪家好?保姆级建站教程避坑指南 域名服务器搞不懂,是90%老板找宁波网站制作公司时最大的顾虑。你花钱建站,最怕的不是丑,而是数据泄露、被挂马、甚至被黑客植入非法链接导致网站被K(降权)。很多公司报价低,是因为他们不懂安全,用老旧模板裸奔上线。这篇保姆级建站教程,不聊虚的,直接从后端安…

2026/9/20 15:48:06 阅读更多 →
SQL Server 2025本地安装全攻略:从环境准备到SSMS配置与避坑指南

SQL Server 2025本地安装全攻略:从环境准备到SSMS配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/8 12:48:42 阅读更多 →
Hyperapp 视图架构详解:从 VNode 声明到 DOM 高效更新的完整渲染体系

Hyperapp 视图架构详解:从 VNode 声明到 DOM 高效更新的完整渲染体系

前端 【免费下载链接】hyperapp 1kB-ish JavaScript framework for building hypertext applications 项目地址: https://gitcode.com/gh_mirrors/hy/hyperapp 点击查看 免费下载 本文以 Hyperapp 架构文档中的 views.md 为核心,系统讲解视图&#xff0…

2026/11/10 2:39:21 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/9 14:01:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/9 14:56:39 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/10 2:03:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/9 14:01:10 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/9 7:45:06 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/9 14:01:11 阅读更多 →

日新闻

周新闻

月新闻