我的 postfix 配置有问题。我想为某个域设置一个万能电子邮件地址。我的虚拟邮箱和别名保存在 postgresql 数据库中。文件 vdomains.cf、vmailbox.cf 和 valias.cf 中定义的查询分别是:
query = SELECT 1 FROM domains WHERE domain = '%s'
query = SELECT CONCAT(domains.domain, '/', mailboxes.address, '/') AS maildir FROM mailboxes LEFT JOIN domains ON mailboxes.domain = domains.id WHERE mailbox='%s'
query = SELECT dst FROM virtual_aliases WHERE src = '%s'
这些文件通过此块链接到 main.cf
virtual_mailbox_domains = pgsql:/etc/postfix/vdomains.cf
virtual_alias_maps = pgsql:/etc/postfix/valias.cf
virtual_mailbox_base = /srv/mail
virtual_mailbox_maps = pgsql:/etc/postfix/vmailbox.cf
virtual_uid_maps = pgsql:/etc/postfix/vuidmaps.cf
virtual_gid_maps = pgsql:/etc/postfix/vdomainmaps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
这对于已知收件人非常有效,服务器会拒绝所有未知收件人。如果我在别名表中定义一个地址映射到邮箱表中的另一个现有地址,则别名也有效。
问题在于别名表在邮箱表之前得到解析,当我想要为一个万能电子邮件添加别名时,这会产生一个大问题,如下所示:
src dst
@domain.com [email protected]
这个问题在实际邮箱之前得到解决,因此所有电子邮件(包括发给现有用户的电子邮件)都会转发到[电子邮件保护]地址。
根据堆栈或其他网站上的几个答案,这种设置应该有效,并且可能对某些人有效,所以我相信我做错了什么。
最后一件事 - 我的设置是带有 Postfix 2.11.3 的 Debian Jessie。
非常感谢您的帮助,提前致谢
答案1
我终于找到了解决方案。这可能不是最好的解决方案,但我读完所有相关的 postfix 文档和许多其他帖子后,还是找不到更正确的解决方案。这个问题没有得到回答,这又表明可能不存在“正确”的解决方案。
我的解决方法很简单。我发现,如果您像这样指定虚拟别名表中的所有现有地址:
[email protected] [email protected]
[email protected] [email protected]
(来源和目的地基本相同)
它按原意运行。(这是我在另一个关于同一主题的问题中发现的建议)。好吧,将这些信息放入 virtual_aliases 表中显然是错误的(信息重复,...),所以我想出了一个更优雅的解决方案:
CREATE OR REPLACE VIEW v_virtual_aliases AS
SELECT mailboxes.mailbox AS src,
mailboxes.mailbox AS dst
FROM mailboxes
UNION ALL
SELECT virtual_aliases.src,
virtual_aliases.dst
FROM virtual_aliases;
这样做只是创建一个视图,其中包含来自 virtual_aliases 表的所有信息以及来自实际邮箱表的所有现有邮箱。这样就不会出现数据重复,别名也能按预期工作 - 仅适用于邮箱表中没有条目的地址。有了此查询,即使对于大型数据库,性能也不会成为问题。
然后我相应地更新了 valias.cf 文件:
query = SELECT dst FROM virtual_aliases WHERE src = '%s'
现在一切都按照原始问题的预期进行。