在测试中。你发现你SQL生成的邮箱,收不到邮件,而自己手工的却可以,
你缺了一张表的数据!是 alias (别名) 表!
在 Mailcow 的架构里:
- mailbox 表(你截图里展示的):告诉 Dovecot “硬盘上给这个用户留个位置存邮件”。
- alias 表(你脚本里没写的):告诉 Postfix “当收到发给 a0j9h0flm@uqblog.com 的邮件时,请把它投递给 a0j9h0flm@uqblog.com 这个邮箱”。
因为脚本漏了 alias 表,Postfix 就认为这封信“没人认领”,所以报 User unknown。
请执行下面这 一步绝杀,补全这个关系,立马就能收信!
第一步:补全别名表 (这是救命稻草)
这条命令会扫描 mailbox 表里所有的用户,自动在 alias 表里给他们每个人建一个“身份证”。
请复制整段执行:codeBash
cd /opt/mailcow-dockerized
source mailcow.conf
# 核心修复:把 mailbox 里的人,同步一份到 alias 表
docker compose exec mysql-mailcow mysql -u$DBUSER -p$DBPASS $DBNAME -e "INSERT IGNORE INTO alias (address, goto, domain, created, modified, active) SELECT username, username, domain, NOW(), NOW(), '1' FROM mailbox WHERE username NOT IN (SELECT address FROM alias);"
第二步:重启 Postfix (必须!)
修改了别名表,必须踢 Postfix 一脚让它刷新内存。codeBash
docker compose restart postfix-mailcow
第三步:发信验证
- 立刻 给 a0j9h0flm@uqblog.com 发一封信。
- 肯定能收到!
(可选) 第四步:让坏账号的属性也变得“完美”
虽然能不能收信只取决于第一步,但为了让你心理舒服,我们可以把那个“坏账号”的属性刷得和“好账号”一模一样(加上 sieve_access, mailbox_format 等字段)。codeBash
# 把所有人的属性都刷成和 admin 一样(admin 的属性通常是最全的)
# 或者直接使用下面这个“完美模板”覆盖所有人
docker compose exec mysql-mailcow mysql -u$DBUSER -p$DBPASS $DBNAME -e "UPDATE mailbox SET attributes = '{\"force_pw_update\":\"0\",\"tls_enforce_in\":\"0\",\"tls_enforce_out\":\"0\",\"sogo_access\":\"1\",\"imap_access\":\"1\",\"pop3_access\":\"1\",\"smtp_access\":\"1\",\"sieve_access\":\"1\",\"relayhost\":\"0\",\"passwd_update\":\"2025-12-28 00:00:00\",\"mailbox_format\":\"maildir:\",\"quarantine_notification\":\"hourly\",\"quarantine_category\":\"reject\",\"attribute_hash\":\"\"}' WHERE username NOT LIKE 'admin%';"
# 重启 PHP 让网页显示更新
docker compose restart php-fpm-mailcow
重点还是第一步的 alias 表,补上就好了!
Leave a Reply