Postfix能否在同一域名下同时兼容本地用户与SQLite虚拟用户?
Postfix能否在同一域名下同时兼容本地用户与SQLite虚拟用户?
当然可以实现!我之前也碰到过一模一样的需求,折腾了好一阵才摸清楚门道,给你梳理下关键的配置步骤,应该能帮你解决问题:
核心思路
让Postfix优先查询SQLite里的虚拟用户,如果收件人存在就走虚拟邮件投递;如果查不到,就 fallback 到本地用户的投递逻辑。这里的关键是别把目标域名加到virtual_mailbox_domains里(不然Postfix会把整个域名当成纯虚拟域,直接忽略本地用户)。
具体配置步骤
1. 调整Postfix主配置(main.cf)
先把这些关键参数配置好:
# 基础域名配置(替换成你的实际域名) myhostname = mail.example.com mydomain = example.com myorigin = $mydomain # 本地用户的maildir设置(和你的需求匹配) home_mailbox = mail/ # 虚拟用户相关配置 virtual_mailbox_base = /var/vmail virtual_uid_maps = static:5000 # 替换成你vmail用户的实际UID virtual_gid_maps = static:5000 # 替换成你vmail用户的实际GID # 配置SQLite映射:查询虚拟用户是否存在 virtual_mailbox_maps = sqlite:/etc/postfix/sqlite_virtual_users.cf # 配置transport映射:判断收件人走虚拟还是本地投递 transport_maps = sqlite:/etc/postfix/sqlite_transport.cf # 本地收件人列表:包含虚拟用户+系统本地用户,避免Postfix退回有效收件人 local_recipient_maps = $virtual_mailbox_maps unix:passwd.byname
2. 编写SQLite映射文件
(1)虚拟用户查询文件 sqlite_virtual_users.cf
这个文件用来验证虚拟用户是否存在:
dbpath = /etc/postfix/vmail.db # 替换成你的SQLite数据库路径 query = SELECT '1' FROM users WHERE email = '%s'
(这里假设你的用户表叫users,存储邮箱的字段叫email,根据你的实际表结构调整)
(2)投递方式判断文件 sqlite_transport.cf
这个文件用来告诉Postfix,虚拟用户用virtual投递,本地用户用默认的local投递:
dbpath = /etc/postfix/vmail.db query = SELECT 'virtual' FROM users WHERE email = '%s'
3. 权限与测试
- 确保
/var/vmail目录的权限正确,属于你配置的vmail用户/组,比如:
chown -R vmail:vmail /var/vmail chmod -R 700 /var/vmail
- 重启Postfix生效:
systemctl restart postfix
- 测试查询:验证虚拟用户能否被正确识别
postmap -q "virtual_user@example.com" sqlite:/etc/postfix/sqlite_virtual_users.cf postmap -q "virtual_user@example.com" sqlite:/etc/postfix/sqlite_transport.cf
如果返回结果正常,就可以发测试邮件验证了:虚拟用户的邮件会到/var/vmail/virtual_user/,本地用户的邮件会到/home/local_user/mail/。
注意事项
- 千万别把你的域名加到
virtual_mailbox_domains里,否则Postfix会完全忽略本地用户! - Dovecot你已经配置好了,只要确保它能同时访问本地用户的
$HOME/mail/和虚拟用户的/var/vmail/路径就行,这个你应该已经搞定了。
按照这个流程调整,应该就能让两种用户共存了,我当初就是这么解决问题的,祝你顺利!
备注:内容来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

